diff options
Diffstat (limited to 'tools/env')
| -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 862a0b1a02a..299e0c9608b 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 05588ab6d55..04bb64602b2 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 443de36e437..b8bff264eb4 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 00000000000..0c27da0b86d --- /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 | 
