#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) ({ \
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 *);
* 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 */
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");
* 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;
return -1;
}
- if (fw_env_open()) {
+ if (fw_env_open(opts)) {
fprintf(stderr, "Error: environment not initialized\n");
return -1;
}
free(value);
- return fw_env_close();
+ return fw_env_close(opts);
}
/*
* 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 */
int len;
int ret = 0;
- if (fw_env_open()) {
+ if (fw_env_open(opts)) {
fprintf(stderr, "Error: environment not initialized\n");
return -1;
}
if (strcmp(fname, "-") != 0)
fclose(fp);
- ret |= fw_env_close();
+ ret |= fw_env_close(opts);
return ret;
-
}
/*
/*
* 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;
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);
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;
}
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;
}
}
-static int parse_config ()
+static int parse_config(struct env_opts *opts)
{
struct stat st;
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
if (HaveRedundEnv)
usable_envsize -= sizeof(char);
- if (common_args.aes_flag)
+ if (opts->aes_flag)
usable_envsize &= ~(AES_KEY_LENGTH - 1);
return 0;
"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);
{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)
{
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':
EOF) {
switch (c) {
case 'n':
- printenv_args.value_only = 1;
+ noheader = 1;
break;
case 'a':
case 'c':
EOF) {
switch (c) {
case 's':
- setenv_args.script_file = optarg;
+ script_file = optarg;
break;
case 'a':
case 'c':
}
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;
}
}