tools/env: no global variable sharing between application and library
authorAndreas Fenkart <andreas.fenkart@digitalstrom.com>
Tue, 5 Apr 2016 21:13:42 +0000 (23:13 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 27 May 2016 19:39:56 +0000 (15:39 -0400)
Signed-off-by: Andreas Fenkart <andreas.fenkart@digitalstrom.com>
tools/env/fw_env.c
tools/env/fw_env.h
tools/env/fw_env_main.c

index 1654ac0e46bc54a31990fcb80d2f380c4fa999b5..52e0bec0897a0645a0d2de2394e13a92488cbc9f 100644 (file)
 
 #include "fw_env.h"
 
-struct common_args common_args;
-struct printenv_args printenv_args;
-struct setenv_args setenv_args;
-
 #define DIV_ROUND_UP(n, d)     (((n) + (d) - 1) / (d))
 
 #define min(x, y) ({                           \
@@ -120,7 +116,7 @@ static unsigned char obsolete_flag = 0;
 
 static int flash_io (int mode);
 static char *envmatch (char * s1, char * s2);
-static int parse_config (void);
+static int parse_config(struct env_opts *opts);
 
 #if defined(CONFIG_FILE)
 static int get_config (char *);
@@ -228,12 +224,12 @@ int parse_aes_key(char *key, uint8_t *bin_key)
  * Print the current definition of one, or more, or all
  * environment variables
  */
-int fw_printenv(int argc, char *argv[], int value_only)
+int fw_printenv(int argc, char *argv[], int value_only, struct env_opts *opts)
 {
        char *env, *nxt;
        int i, rc = 0;
 
-       if (fw_env_open())
+       if (fw_env_open(opts))
                return -1;
 
        if (argc == 0) {                /* Print all env variables  */
@@ -289,12 +285,13 @@ int fw_printenv(int argc, char *argv[], int value_only)
        return rc;
 }
 
-int fw_env_close(void)
+int fw_env_close(struct env_opts *opts)
 {
        int ret;
-       if (common_args.aes_flag) {
+
+       if (opts->aes_flag) {
                ret = env_aes_cbc_crypt(environment.data, 1,
-                                       common_args.aes_key);
+                                       opts->aes_key);
                if (ret) {
                        fprintf(stderr,
                                "Error: can't encrypt env for flash\n");
@@ -447,7 +444,7 @@ int fw_env_write(char *name, char *value)
  *         modified or deleted
  *
  */
-int fw_setenv(int argc, char *argv[])
+int fw_setenv(int argc, char *argv[], struct env_opts *opts)
 {
        int i;
        size_t len;
@@ -461,7 +458,7 @@ int fw_setenv(int argc, char *argv[])
                return -1;
        }
 
-       if (fw_env_open()) {
+       if (fw_env_open(opts)) {
                fprintf(stderr, "Error: environment not initialized\n");
                return -1;
        }
@@ -497,7 +494,7 @@ int fw_setenv(int argc, char *argv[])
 
        free(value);
 
-       return fw_env_close();
+       return fw_env_close(opts);
 }
 
 /*
@@ -517,7 +514,7 @@ int fw_setenv(int argc, char *argv[])
  * 0     - OK
  * -1     - Error
  */
-int fw_parse_script(char *fname)
+int fw_parse_script(char *fname, struct env_opts *opts)
 {
        FILE *fp;
        char dump[1024];        /* Maximum line length in the file */
@@ -527,7 +524,7 @@ int fw_parse_script(char *fname)
        int len;
        int ret = 0;
 
-       if (fw_env_open()) {
+       if (fw_env_open(opts)) {
                fprintf(stderr, "Error: environment not initialized\n");
                return -1;
        }
@@ -615,10 +612,9 @@ int fw_parse_script(char *fname)
        if (strcmp(fname, "-") != 0)
                fclose(fp);
 
-       ret |= fw_env_close();
+       ret |= fw_env_close(opts);
 
        return ret;
-
 }
 
 /*
@@ -1128,7 +1124,7 @@ static char *envmatch (char * s1, char * s2)
 /*
  * Prevent confusion if running from erased flash memory
  */
-int fw_env_open(void)
+int fw_env_open(struct env_opts *opts)
 {
        int crc0, crc0_ok;
        unsigned char flag0;
@@ -1143,7 +1139,7 @@ int fw_env_open(void)
        struct env_image_single *single;
        struct env_image_redundant *redundant;
 
-       if (parse_config ())            /* should fill envdevices */
+       if (parse_config(opts))         /* should fill envdevices */
                return -1;
 
        addr0 = calloc(1, CUR_ENVSIZE);
@@ -1175,9 +1171,9 @@ int fw_env_open(void)
 
        crc0 = crc32 (0, (uint8_t *) environment.data, ENV_SIZE);
 
-       if (common_args.aes_flag) {
+       if (opts->aes_flag) {
                ret = env_aes_cbc_crypt(environment.data, 0,
-                                       common_args.aes_key);
+                                       opts->aes_key);
                if (ret)
                        return ret;
        }
@@ -1233,9 +1229,9 @@ int fw_env_open(void)
 
                crc1 = crc32 (0, (uint8_t *) redundant->data, ENV_SIZE);
 
-               if (common_args.aes_flag) {
+               if (opts->aes_flag) {
                        ret = env_aes_cbc_crypt(redundant->data, 0,
-                                               common_args.aes_key);
+                                               opts->aes_key);
                        if (ret)
                                return ret;
                }
@@ -1312,7 +1308,7 @@ int fw_env_open(void)
 }
 
 
-static int parse_config ()
+static int parse_config(struct env_opts *opts)
 {
        struct stat st;
 
@@ -1321,9 +1317,9 @@ static int parse_config ()
                common_args.config_file = CONFIG_FILE;
 
        /* Fills in DEVNAME(), ENVSIZE(), DEVESIZE(). Or don't. */
-       if (get_config(common_args.config_file)) {
+       if (get_config(opts->config_file)) {
                fprintf(stderr, "Cannot parse config file '%s': %m\n",
-                       common_args.config_file);
+                       opts->config_file);
                return -1;
        }
 #else
@@ -1383,7 +1379,7 @@ static int parse_config ()
        if (HaveRedundEnv)
                usable_envsize -= sizeof(char);
 
-       if (common_args.aes_flag)
+       if (opts->aes_flag)
                usable_envsize &= ~(AES_KEY_LENGTH - 1);
 
        return 0;
index d4daeeafd973f87164f306ba98747bd69ea2906e..dac964d933fe85a6adf363e47249858b8c0a2f37 100644 (file)
        "bootm"
 #endif
 
-struct common_args {
+struct env_opts {
 #ifdef CONFIG_FILE
        char *config_file;
 #endif
-       uint8_t aes_key[AES_KEY_LENGTH];
        int aes_flag; /* Is AES encryption used? */
+       uint8_t aes_key[AES_KEY_LENGTH];
 };
-extern struct common_args common_args;
-
-struct printenv_args {
-       int value_only;
-};
-extern struct printenv_args printenv_args;
-
-struct setenv_args {
-       char *script_file;
-};
-extern struct setenv_args setenv_args;
 
 int parse_aes_key(char *key, uint8_t *bin_key);
 
-int fw_printenv(int argc, char *argv[], int value_only);
+int fw_printenv(int argc, char *argv[], int value_only, struct env_opts *opts);
 char *fw_getenv(char *name);
-int fw_setenv(int argc, char *argv[]);
-int fw_parse_script(char *fname);
-int fw_env_open(void);
+int fw_setenv(int argc, char *argv[], struct env_opts *opts);
+int fw_parse_script(char *fname, struct env_opts *opts);
+int fw_env_open(struct env_opts *opts);
 int fw_env_write(char *name, char *value);
-int fw_env_close(void);
+int fw_env_close(struct env_opts *opts);
 
 unsigned long crc32(unsigned long, const unsigned char *, unsigned);
index 2a45a0de2876fa2b0c3dfef6f1d07ea054ef6c56..7a17b28f40bc3109a2eb7424f9e45f086127f367 100644 (file)
@@ -49,6 +49,14 @@ static struct option long_options[] = {
        {NULL, 0, NULL, 0}
 };
 
+static struct env_opts env_opts;
+
+/* setenv options */
+static int noheader;
+
+/* getenv options */
+static char *script_file;
+
 void usage_printenv(void)
 {
 
@@ -108,22 +116,22 @@ static void parse_common_args(int argc, char *argv[])
        int c;
 
 #ifdef CONFIG_FILE
-       common_args.config_file = CONFIG_FILE;
+       env_opts.config_file = CONFIG_FILE;
 #endif
 
        while ((c = getopt_long(argc, argv, ":a:c:h", long_options, NULL)) !=
               EOF) {
                switch (c) {
                case 'a':
-                       if (parse_aes_key(optarg, common_args.aes_key)) {
+                       if (parse_aes_key(optarg, env_opts.aes_key)) {
                                fprintf(stderr, "AES key parse error\n");
                                exit(EXIT_FAILURE);
                        }
-                       common_args.aes_flag = 1;
+                       env_opts.aes_flag = 1;
                        break;
 #ifdef CONFIG_FILE
                case 'c':
-                       common_args.config_file = optarg;
+                       env_opts.config_file = optarg;
                        break;
 #endif
                case 'h':
@@ -151,7 +159,7 @@ int parse_printenv_args(int argc, char *argv[])
               EOF) {
                switch (c) {
                case 'n':
-                       printenv_args.value_only = 1;
+                       noheader = 1;
                        break;
                case 'a':
                case 'c':
@@ -177,7 +185,7 @@ int parse_setenv_args(int argc, char *argv[])
               EOF) {
                switch (c) {
                case 's':
-                       setenv_args.script_file = optarg;
+                       script_file = optarg;
                        break;
                case 'a':
                case 'c':
@@ -240,14 +248,14 @@ int main(int argc, char *argv[])
        }
 
        if (do_printenv) {
-               if (fw_printenv(argc, argv, printenv_args.value_only))
+               if (fw_printenv(argc, argv, noheader, &env_opts) != 0)
                        retval = EXIT_FAILURE;
        } else {
-               if (!setenv_args.script_file) {
-                       if (fw_setenv(argc, argv) != 0)
+               if (!script_file) {
+                       if (fw_setenv(argc, argv, &env_opts) != 0)
                                retval = EXIT_FAILURE;
                } else {
-                       if (fw_parse_script(setenv_args.script_file) != 0)
+                       if (fw_parse_script(script_file, &env_opts) != 0)
                                retval = EXIT_FAILURE;
                }
        }