diff options
Diffstat (limited to 'common/cmd_nvedit.c')
| -rw-r--r-- | common/cmd_nvedit.c | 61 | 
1 files changed, 34 insertions, 27 deletions
| diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index 3a05e6010..afa128ece 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -62,9 +62,10 @@ DECLARE_GLOBAL_DATA_PTR;  	!defined(CONFIG_ENV_IS_IN_ONENAND)	&& \  	!defined(CONFIG_ENV_IS_IN_SPI_FLASH)	&& \  	!defined(CONFIG_ENV_IS_IN_REMOTE)	&& \ +	!defined(CONFIG_ENV_IS_IN_UBI)		&& \  	!defined(CONFIG_ENV_IS_NOWHERE)  # error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|\ -SPI_FLASH|NVRAM|MMC|FAT|REMOTE} or CONFIG_ENV_IS_NOWHERE +SPI_FLASH|NVRAM|MMC|FAT|REMOTE|UBI} or CONFIG_ENV_IS_NOWHERE  #endif  /* @@ -273,6 +274,10 @@ int setenv(const char *varname, const char *varvalue)  {  	const char * const argv[4] = { "setenv", varname, varvalue, NULL }; +	/* before import into hashtable */ +	if (!(gd->flags & GD_FLG_ENV_READY)) +		return 1; +  	if (varvalue == NULL || varvalue[0] == '\0')  		return _do_env_set(0, 2, (char * const *)argv);  	else @@ -325,41 +330,50 @@ static int do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  int do_env_ask(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  {  	char message[CONFIG_SYS_CBSIZE]; -	int size = CONFIG_SYS_CBSIZE - 1; -	int i, len, pos; +	int i, len, pos, size;  	char *local_args[4]; +	char *endptr;  	local_args[0] = argv[0];  	local_args[1] = argv[1];  	local_args[2] = NULL;  	local_args[3] = NULL; -	/* Check the syntax */ -	switch (argc) { -	case 1: +	/* +	 * Check the syntax: +	 * +	 * env_ask envname [message1 ...] [size] +	 */ +	if (argc == 1)  		return CMD_RET_USAGE; -	case 2:		/* env_ask envname */ -		sprintf(message, "Please enter '%s':", argv[1]); -		break; - -	case 3:		/* env_ask envname size */ -		sprintf(message, "Please enter '%s':", argv[1]); -		size = simple_strtoul(argv[2], NULL, 10); -		break; +	/* +	 * We test the last argument if it can be converted +	 * into a decimal number.  If yes, we assume it's +	 * the size.  Otherwise we echo it as part of the +	 * message. +	 */ +	i = simple_strtoul(argv[argc - 1], &endptr, 10); +	if (*endptr != '\0') {			/* no size */ +		size = CONFIG_SYS_CBSIZE - 1; +	} else {				/* size given */ +		size = i; +		--argc; +	} -	default:	/* env_ask envname message1 ... messagen size */ -		for (i = 2, pos = 0; i < argc - 1; i++) { +	if (argc <= 2) { +		sprintf(message, "Please enter '%s': ", argv[1]); +	} else { +		/* env_ask envname message1 ... messagen [size] */ +		for (i = 2, pos = 0; i < argc; i++) {  			if (pos)  				message[pos++] = ' ';  			strcpy(message + pos, argv[i]);  			pos += strlen(argv[i]);  		} - +		message[pos++] = ' ';  		message[pos] = '\0'; -		size = simple_strtoul(argv[argc - 1], NULL, 10); -		break;  	}  	if (size >= CONFIG_SYS_CBSIZE) @@ -1168,14 +1182,7 @@ U_BOOT_CMD(  	askenv,	CONFIG_SYS_MAXARGS,	1,	do_env_ask,  	"get environment variables from stdin",  	"name [message] [size]\n" -	"    - get environment variable 'name' from stdin (max 'size' chars)\n" -	"askenv name\n" -	"    - get environment variable 'name' from stdin\n" -	"askenv name size\n" -	"    - get environment variable 'name' from stdin (max 'size' chars)\n" -	"askenv name [message] size\n" -	"    - display 'message' string and get environment variable 'name'" -	"from stdin (max 'size' chars)" +	"    - get environment variable 'name' from stdin (max 'size' chars)"  );  #endif |