diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/env/fw_env.c | 73 | ||||
-rw-r--r-- | tools/env/fw_env.h | 77 | ||||
-rw-r--r-- | tools/env/fw_env_main.c | 1 | ||||
-rw-r--r-- | tools/env/fw_env_private.h | 55 |
4 files changed, 140 insertions, 66 deletions
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 862a0b1a02..299e0c9608 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -34,6 +34,7 @@ # include <mtd/mtd-user.h> #endif +#include "fw_env_private.h" #include "fw_env.h" struct env_opts default_opts = { @@ -277,6 +278,7 @@ int fw_printenv(int argc, char *argv[], int value_only, struct env_opts *opts) printf ("%s\n", env); } + fw_env_close(opts); return 0; } @@ -299,10 +301,12 @@ int fw_printenv(int argc, char *argv[], int value_only, struct env_opts *opts) printf("%s=%s\n", name, val); } + fw_env_close(opts); + return rc; } -int fw_env_close(struct env_opts *opts) +int fw_env_flush(struct env_opts *opts) { int ret; @@ -471,6 +475,7 @@ int fw_setenv(int argc, char *argv[], struct env_opts *opts) char *name, **valv; char *value = NULL; int valc; + int ret; if (!opts) opts = &default_opts; @@ -490,8 +495,10 @@ int fw_setenv(int argc, char *argv[], struct env_opts *opts) valv = argv + 1; valc = argc - 1; - if (env_flags_validate_env_set_params(name, valv, valc) < 0) + if (env_flags_validate_env_set_params(name, valv, valc) < 0) { + fw_env_close(opts); return -1; + } len = 0; for (i = 0; i < valc; ++i) { @@ -517,7 +524,10 @@ int fw_setenv(int argc, char *argv[], struct env_opts *opts) free(value); - return fw_env_close(opts); + ret = fw_env_flush(opts); + fw_env_close(opts); + + return ret; } /* @@ -638,7 +648,9 @@ int fw_parse_script(char *fname, struct env_opts *opts) if (strcmp(fname, "-") != 0) fclose(fp); - ret |= fw_env_close(opts); + ret |= fw_env_flush(opts); + + fw_env_close(opts); return ret; } @@ -1104,11 +1116,11 @@ int fw_env_open(struct env_opts *opts) { int crc0, crc0_ok; unsigned char flag0; - void *addr0; + void *addr0 = NULL; int crc1, crc1_ok; unsigned char flag1; - void *addr1; + void *addr1 = NULL; int ret; @@ -1119,14 +1131,15 @@ int fw_env_open(struct env_opts *opts) opts = &default_opts; if (parse_config(opts)) /* should fill envdevices */ - return -1; + return -EINVAL; addr0 = calloc(1, CUR_ENVSIZE); if (addr0 == NULL) { fprintf(stderr, "Not enough memory for environment (%ld bytes)\n", CUR_ENVSIZE); - return -1; + ret = -ENOMEM; + goto open_cleanup; } /* read environment from FLASH to local buffer */ @@ -1145,8 +1158,10 @@ int fw_env_open(struct env_opts *opts) } dev_current = 0; - if (flash_io (O_RDONLY)) - return -1; + if (flash_io(O_RDONLY)) { + ret = -EIO; + goto open_cleanup; + } crc0 = crc32 (0, (uint8_t *) environment.data, ENV_SIZE); @@ -1154,7 +1169,7 @@ int fw_env_open(struct env_opts *opts) ret = env_aes_cbc_crypt(environment.data, 0, opts->aes_key); if (ret) - return ret; + goto open_cleanup; } crc0_ok = (crc0 == *environment.crc); @@ -1173,7 +1188,8 @@ int fw_env_open(struct env_opts *opts) fprintf(stderr, "Not enough memory for environment (%ld bytes)\n", CUR_ENVSIZE); - return -1; + ret = -ENOMEM; + goto open_cleanup; } redundant = addr1; @@ -1182,8 +1198,10 @@ int fw_env_open(struct env_opts *opts) * other pointers in environment still point inside addr0 */ environment.image = addr1; - if (flash_io (O_RDONLY)) - return -1; + if (flash_io(O_RDONLY)) { + ret = -EIO; + goto open_cleanup; + } /* Check flag scheme compatibility */ if (DEVTYPE(dev_current) == MTD_NORFLASH && @@ -1203,7 +1221,8 @@ int fw_env_open(struct env_opts *opts) environment.flag_scheme = FLAG_INCREMENTAL; } else { fprintf (stderr, "Incompatible flash types!\n"); - return -1; + ret = -EINVAL; + goto open_cleanup; } crc1 = crc32 (0, (uint8_t *) redundant->data, ENV_SIZE); @@ -1212,7 +1231,7 @@ int fw_env_open(struct env_opts *opts) ret = env_aes_cbc_crypt(redundant->data, 0, opts->aes_key); if (ret) - return ret; + goto open_cleanup; } crc1_ok = (crc1 == redundant->crc); @@ -1284,6 +1303,28 @@ int fw_env_open(struct env_opts *opts) #endif } return 0; + +open_cleanup: + if (addr0) + free(addr0); + + if (addr1) + free(addr0); + + return ret; +} + +/* + * Simply free allocated buffer with environment + */ +int fw_env_close(struct env_opts *opts) +{ + if (environment.image) + free(environment.image); + + environment.image = NULL; + + return 0; } static int check_device_config(int dev) diff --git a/tools/env/fw_env.h b/tools/env/fw_env.h index 05588ab6d5..04bb64602b 100644 --- a/tools/env/fw_env.h +++ b/tools/env/fw_env.h @@ -5,57 +5,15 @@ * SPDX-License-Identifier: GPL-2.0+ */ -#include <aes.h> #include <stdint.h> - -/* Pull in the current config to define the default environment */ -#include <linux/kconfig.h> - -#ifndef __ASSEMBLY__ -#define __ASSEMBLY__ /* get only #defines from config.h */ -#include <config.h> -#undef __ASSEMBLY__ -#else -#include <config.h> -#endif +#include <uboot_aes.h> /* - * To build the utility with the static configuration - * comment out the next line. - * See included "fw_env.config" sample file - * for notes on configuration. + * Programs using the library must check which API is available, + * that varies depending on the U-Boot version. + * This can be changed in future */ -#define CONFIG_FILE "/etc/fw_env.config" - -#ifndef CONFIG_FILE -#define HAVE_REDUND /* For systems with 2 env sectors */ -#define DEVICE1_NAME "/dev/mtd1" -#define DEVICE2_NAME "/dev/mtd2" -#define DEVICE1_OFFSET 0x0000 -#define ENV1_SIZE 0x4000 -#define DEVICE1_ESIZE 0x4000 -#define DEVICE1_ENVSECTORS 2 -#define DEVICE2_OFFSET 0x0000 -#define ENV2_SIZE 0x4000 -#define DEVICE2_ESIZE 0x4000 -#define DEVICE2_ENVSECTORS 2 -#endif - -#ifndef CONFIG_BAUDRATE -#define CONFIG_BAUDRATE 115200 -#endif - -#ifndef CONFIG_BOOTDELAY -#define CONFIG_BOOTDELAY 5 /* autoboot after 5 seconds */ -#endif - -#ifndef CONFIG_BOOTCOMMAND -#define CONFIG_BOOTCOMMAND \ - "bootp; " \ - "setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} " \ - "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; " \ - "bootm" -#endif +#define FW_ENV_API_VERSION 1 struct env_opts { #ifdef CONFIG_FILE @@ -95,7 +53,7 @@ int fw_printenv(int argc, char *argv[], int value_only, struct env_opts *opts); * @opts: how to retrieve environment from flash, defaults are used if NULL * * Description: - * Uses fw_env_open, fw_env_write, fw_env_close + * Uses fw_env_open, fw_env_write, fw_env_flush * * Return: * 0 on success, -1 on failure (modifies errno) @@ -112,7 +70,7 @@ int fw_setenv(int argc, char *argv[], struct env_opts *opts); * @opts: encryption key, configuration file, defaults are used if NULL * * Description: - * Uses fw_env_open, fw_env_write, fw_env_close + * Uses fw_env_open, fw_env_write, fw_env_flush * * Return: * 0 success, -1 on failure (modifies errno) @@ -180,7 +138,17 @@ char *fw_getenv(char *name); int fw_env_write(char *name, char *value); /** - * fw_env_close - write the environment from RAM cache back to flash + * fw_env_flush - write the environment from RAM cache back to flash + * + * @opts: encryption key, configuration file, defaults are used if NULL + * + * Return: + * 0 on success, -1 on failure (modifies errno) + */ +int fw_env_flush(struct env_opts *opts); + +/** + * fw_env_close - free allocated structure and close env * * @opts: encryption key, configuration file, defaults are used if NULL * @@ -189,4 +157,13 @@ int fw_env_write(char *name, char *value); */ int fw_env_close(struct env_opts *opts); + +/** + * fw_env_version - return the current version of the library + * + * Return: + * version string of the library + */ +char *fw_env_version(void); + unsigned long crc32(unsigned long, const unsigned char *, unsigned); diff --git a/tools/env/fw_env_main.c b/tools/env/fw_env_main.c index 443de36e43..b8bff264eb 100644 --- a/tools/env/fw_env_main.c +++ b/tools/env/fw_env_main.c @@ -34,6 +34,7 @@ #include <stdlib.h> #include <sys/file.h> #include <unistd.h> +#include "fw_env_private.h" #include "fw_env.h" #define CMD_PRINTENV "fw_printenv" diff --git a/tools/env/fw_env_private.h b/tools/env/fw_env_private.h new file mode 100644 index 0000000000..0c27da0b86 --- /dev/null +++ b/tools/env/fw_env_private.h @@ -0,0 +1,55 @@ +/* + * (C) Copyright 2002-2008 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +/* Pull in the current config to define the default environment */ +#include <linux/kconfig.h> + +#ifndef __ASSEMBLY__ +#define __ASSEMBLY__ /* get only #defines from config.h */ +#include <config.h> +#undef __ASSEMBLY__ +#else +#include <config.h> +#endif + +/* + * To build the utility with the static configuration + * comment out the next line. + * See included "fw_env.config" sample file + * for notes on configuration. + */ +#define CONFIG_FILE "/etc/fw_env.config" + +#ifndef CONFIG_FILE +#define HAVE_REDUND /* For systems with 2 env sectors */ +#define DEVICE1_NAME "/dev/mtd1" +#define DEVICE2_NAME "/dev/mtd2" +#define DEVICE1_OFFSET 0x0000 +#define ENV1_SIZE 0x4000 +#define DEVICE1_ESIZE 0x4000 +#define DEVICE1_ENVSECTORS 2 +#define DEVICE2_OFFSET 0x0000 +#define ENV2_SIZE 0x4000 +#define DEVICE2_ESIZE 0x4000 +#define DEVICE2_ENVSECTORS 2 +#endif + +#ifndef CONFIG_BAUDRATE +#define CONFIG_BAUDRATE 115200 +#endif + +#ifndef CONFIG_BOOTDELAY +#define CONFIG_BOOTDELAY 5 /* autoboot after 5 seconds */ +#endif + +#ifndef CONFIG_BOOTCOMMAND +#define CONFIG_BOOTCOMMAND \ + "bootp; " \ + "setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} "\ + "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; "\ + "bootm" +#endif |