Skip to content
Snippets Groups Projects
Commit e4a223f0 authored by Joe Hershberger's avatar Joe Hershberger Committed by Tom Rini
Browse files

tools/env: Serialize calls to fw_*env


Use a lock file at /var/lock/fw_printenv.lock.
Avoids seriously confusing the MTD driver.

Signed-off-by: default avatarJoe Hershberger <joe.hershberger@ni.com>
parent d9acae1a
No related branches found
No related tags found
No related merge requests found
...@@ -39,10 +39,13 @@ ...@@ -39,10 +39,13 @@
* variable "name" * variable "name"
*/ */
#include <fcntl.h>
#include <getopt.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <getopt.h> #include <sys/file.h>
#include <unistd.h>
#include "fw_env.h" #include "fw_env.h"
#define CMD_PRINTENV "fw_printenv" #define CMD_PRINTENV "fw_printenv"
...@@ -81,13 +84,27 @@ void usage(void) ...@@ -81,13 +84,27 @@ void usage(void)
); );
} }
int int main(int argc, char *argv[])
main(int argc, char *argv[])
{ {
char *p; char *p;
char *cmdname = *argv; char *cmdname = *argv;
char *script_file = NULL; char *script_file = NULL;
int c; int c;
const char *lockname = "/var/lock/" CMD_PRINTENV ".lock";
int lockfd = -1;
int retval = EXIT_SUCCESS;
lockfd = open(lockname, O_WRONLY | O_CREAT | O_TRUNC);
if (-1 == lockfd) {
fprintf(stderr, "Error opening lock file %s\n", lockname);
return EXIT_FAILURE;
}
if (-1 == flock(lockfd, LOCK_EX)) {
fprintf(stderr, "Error locking file %s\n", lockname);
close(lockfd);
return EXIT_FAILURE;
}
if ((p = strrchr (cmdname, '/')) != NULL) { if ((p = strrchr (cmdname, '/')) != NULL) {
cmdname = p + 1; cmdname = p + 1;
...@@ -104,38 +121,36 @@ main(int argc, char *argv[]) ...@@ -104,38 +121,36 @@ main(int argc, char *argv[])
break; break;
case 'h': case 'h':
usage(); usage();
return EXIT_SUCCESS; goto exit;
default: /* '?' */ default: /* '?' */
fprintf(stderr, "Try `%s --help' for more information." fprintf(stderr, "Try `%s --help' for more information."
"\n", cmdname); "\n", cmdname);
return EXIT_FAILURE; retval = EXIT_FAILURE;
goto exit;
} }
} }
if (strcmp(cmdname, CMD_PRINTENV) == 0) { if (strcmp(cmdname, CMD_PRINTENV) == 0) {
if (fw_printenv(argc, argv) != 0)
if (fw_printenv (argc, argv) != 0) retval = EXIT_FAILURE;
return EXIT_FAILURE;
return EXIT_SUCCESS;
} else if (strcmp(cmdname, CMD_SETENV) == 0) { } else if (strcmp(cmdname, CMD_SETENV) == 0) {
if (!script_file) { if (!script_file) {
if (fw_setenv(argc, argv) != 0) if (fw_setenv(argc, argv) != 0)
return EXIT_FAILURE; retval = EXIT_FAILURE;
} else { } else {
if (fw_parse_script(script_file) != 0) if (fw_parse_script(script_file) != 0)
return EXIT_FAILURE; retval = EXIT_FAILURE;
} }
} else {
return EXIT_SUCCESS; fprintf(stderr,
"Identity crisis - may be called as `" CMD_PRINTENV
"' or as `" CMD_SETENV "' but not as `%s'\n",
cmdname);
retval = EXIT_FAILURE;
} }
fprintf (stderr, exit:
"Identity crisis - may be called as `" CMD_PRINTENV flock(lockfd, LOCK_UN);
"' or as `" CMD_SETENV "' but not as `%s'\n", close(lockfd);
cmdname); return retval;
return EXIT_FAILURE;
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment