[U-Boot] [PATCH V5 2/3] Add the function 'confirm_yesno' for interactive

Pantelis Antoniou pantelis.antoniou at gmail.com
Fri May 23 10:52:30 CEST 2014


Hi Pierre,

On Apr 24, 2014, at 11:30 AM, Pierre Aubert wrote:

> User's confirmation is asked in different commands. This commit adds a
> function for such confirmation.
> 
> Signed-off-by: Pierre Aubert <p.aubert at staubli.com>
> ---
> 
> V3, V4, V5: no changes
> 
> Patch added in V2
> 
> common/cmd_fuse.c |   11 ++---------
> common/cmd_nand.c |   16 +++++-----------
> common/cmd_otp.c  |   18 +++---------------
> common/console.c  |   28 +++++++++++++++++++++++++++-
> include/common.h  |    2 +-
> 5 files changed, 38 insertions(+), 37 deletions(-)
> 
> diff --git a/common/cmd_fuse.c b/common/cmd_fuse.c
> index 0df57db..abab978 100644
> --- a/common/cmd_fuse.c
> +++ b/common/cmd_fuse.c
> @@ -33,15 +33,8 @@ static int confirm_prog(void)
> 					"what you are doing!\n"
> 			"\nReally perform this fuse programming? <y/N>\n");
> 
> -	if (getc() == 'y') {
> -		int c;
> -
> -		putc('y');
> -		c = getc();
> -		putc('\n');
> -		if (c == '\r')
> -			return 1;
> -	}
> +	if (confirm_yesno())
> +		return 1;
> 
> 	puts("Fuse programming aborted\n");
> 	return 0;
> diff --git a/common/cmd_nand.c b/common/cmd_nand.c
> index 04ab0f1..a84f7dc 100644
> --- a/common/cmd_nand.c
> +++ b/common/cmd_nand.c
> @@ -605,22 +605,16 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> 		opts.spread = spread;
> 
> 		if (scrub) {
> -			if (!scrub_yes)
> -				puts(scrub_warn);
> -
> -			if (scrub_yes)
> +			if (scrub_yes) {
> 				opts.scrub = 1;
> -			else if (getc() == 'y') {
> -				puts("y");
> -				if (getc() == '\r')
> +			} else {
> +				puts(scrub_warn);
> +				if (confirm_yesno()) {
> 					opts.scrub = 1;
> -				else {
> +				} else {
> 					puts("scrub aborted\n");
> 					return 1;
> 				}
> -			} else {
> -				puts("scrub aborted\n");
> -				return 1;
> 			}
> 		}
> 		ret = nand_erase_opts(nand, &opts);
> diff --git a/common/cmd_otp.c b/common/cmd_otp.c
> index 67808aa..593bb8c 100644
> --- a/common/cmd_otp.c
> +++ b/common/cmd_otp.c
> @@ -158,21 +158,9 @@ int do_otp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> 			lowup(half + count - 1), page + (half + count - 1) / 2,
> 			half + count
> 		);
> -
> -		i = 0;
> -		while (1) {
> -			if (tstc()) {
> -				const char exp_ans[] = "YES\r";
> -				char c;
> -				putc(c = getc());
> -				if (exp_ans[i++] != c) {
> -					printf(" Aborting\n");
> -					return 1;
> -				} else if (!exp_ans[i]) {
> -					puts("\n");
> -					break;
> -				}
> -			}
> +		if (!confirm_yesno()) {
> +			printf(" Aborting\n");
> +			return 1;
> 		}
> 	}
> 
> diff --git a/common/console.c b/common/console.c
> index 2dfb788..5453726 100644
> --- a/common/console.c
> +++ b/common/console.c
> @@ -537,7 +537,33 @@ int ctrlc(void)
> 	}
> 	return 0;
> }
> -
> +/* Reads user's confirmation.
> +   Returns 1 if user's input is "y", "Y", "yes" or "YES"
> +*/
> +int confirm_yesno(void)
> +{
> +	int i;
> +	char str_input[5];
> +
> +	/* Flush input */
> +	while (tstc())
> +		getc();
> +	i = 0;
> +	while (i < sizeof(str_input)) {
> +		str_input[i] = getc();
> +		putc(str_input[i]);
> +		if (str_input[i] == '\r')
> +			break;
> +		i++;
> +	}
> +	putc('\n');
> +	if (strncmp(str_input, "y\r", 2) == 0 ||
> +	    strncmp(str_input, "Y\r", 2) == 0 ||
> +	    strncmp(str_input, "yes\r", 4) == 0 ||
> +	    strncmp(str_input, "YES\r", 4) == 0)
> +		return 1;

I guess you could convert to upper/lower case and reduce the comparisons but I'd
let it pass.

Maybe follow up later with a patch just for that.

> +	return 0;
> +}
> /* pass 1 to disable ctrlc() checking, 0 to enable.
>  * returns previous state
>  */
> diff --git a/include/common.h b/include/common.h
> index baf361b..1d922b9 100644
> --- a/include/common.h
> +++ b/include/common.h
> @@ -838,7 +838,7 @@ int	ctrlc (void);
> int	had_ctrlc (void);	/* have we had a Control-C since last clear? */
> void	clear_ctrlc (void);	/* clear the Control-C condition */
> int	disable_ctrlc (int);	/* 1 to disable, 0 to enable Control-C detect */
> -
> +int confirm_yesno(void);        /*  1 if input is "y", "Y", "yes" or "YES" */
> /*
>  * STDIO based functions (can always be used)
>  */
> -- 
> 1.7.6.5
> 

This is reasonable, and I've applied it to my mmc tree,

Applied,

Thanks

-- Pantelis

Acked-by: Pantelis Antoniou <panto at antoniou-consulting.com>



More information about the U-Boot mailing list