summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Hershberger <joe.hershberger@ni.com>2012-10-03 09:38:49 +0000
committerTom Rini <trini@ti.com>2012-10-15 11:54:05 -0700
commite4a223f04de2e271682f26d7b981c0012f6a459f (patch)
tree61f1e3cdd6a2e1f92180c3708fc832bf10472610
parentd9acae1a880a52b3a6ad24af8c7f8312e59ea9b1 (diff)
downloadu-boot-imx-e4a223f04de2e271682f26d7b981c0012f6a459f.zip
u-boot-imx-e4a223f04de2e271682f26d7b981c0012f6a459f.tar.gz
u-boot-imx-e4a223f04de2e271682f26d7b981c0012f6a459f.tar.bz2
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: Joe Hershberger <joe.hershberger@ni.com>
-rw-r--r--tools/env/fw_env_main.c59
1 files changed, 37 insertions, 22 deletions
diff --git a/tools/env/fw_env_main.c b/tools/env/fw_env_main.c
index c654057..c855f4c 100644
--- a/tools/env/fw_env_main.c
+++ b/tools/env/fw_env_main.c
@@ -39,10 +39,13 @@
* variable "name"
*/
+#include <fcntl.h>
+#include <getopt.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
-#include <getopt.h>
+#include <sys/file.h>
+#include <unistd.h>
#include "fw_env.h"
#define CMD_PRINTENV "fw_printenv"
@@ -81,13 +84,27 @@ void usage(void)
);
}
-int
-main(int argc, char *argv[])
+int main(int argc, char *argv[])
{
char *p;
char *cmdname = *argv;
char *script_file = NULL;
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) {
cmdname = p + 1;
@@ -104,38 +121,36 @@ main(int argc, char *argv[])
break;
case 'h':
usage();
- return EXIT_SUCCESS;
+ goto exit;
default: /* '?' */
fprintf(stderr, "Try `%s --help' for more information."
"\n", cmdname);
- return EXIT_FAILURE;
+ retval = EXIT_FAILURE;
+ goto exit;
}
}
-
if (strcmp(cmdname, CMD_PRINTENV) == 0) {
-
- if (fw_printenv (argc, argv) != 0)
- return EXIT_FAILURE;
-
- return EXIT_SUCCESS;
-
+ if (fw_printenv(argc, argv) != 0)
+ retval = EXIT_FAILURE;
} else if (strcmp(cmdname, CMD_SETENV) == 0) {
if (!script_file) {
if (fw_setenv(argc, argv) != 0)
- return EXIT_FAILURE;
+ retval = EXIT_FAILURE;
} else {
if (fw_parse_script(script_file) != 0)
- return EXIT_FAILURE;
+ retval = EXIT_FAILURE;
}
-
- return EXIT_SUCCESS;
-
+ } else {
+ 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,
- "Identity crisis - may be called as `" CMD_PRINTENV
- "' or as `" CMD_SETENV "' but not as `%s'\n",
- cmdname);
- return EXIT_FAILURE;
+exit:
+ flock(lockfd, LOCK_UN);
+ close(lockfd);
+ return retval;
}