[U-Boot] [PATCH 1/2] Add run_command_list() to run a list of commands

Michael Walle michael at walle.cc
Wed Feb 15 20:38:15 CET 2012


Am Mittwoch 15 Februar 2012, 07:07:09 schrieb Simon Glass:
> This new function runs a list of commands separated by semicolon. We
> move this out of cmd_source so that it can be used by other code. The
> PXE also uses the new function.
> 
> Suggested-by: Michael Walle <michael at walle.cc>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>  common/cmd_pxe.c    |   20 ++------------
>  common/cmd_source.c |   49 +----------------------------------
>  common/main.c       |   72
> +++++++++++++++++++++++++++++++++++++++++++++++++++ include/common.h    | 
>   1 +
>  4 files changed, 77 insertions(+), 65 deletions(-)
> 
[..snip..]

> diff --git a/common/main.c b/common/main.c
> index db181d3..87f2855 100644
> --- a/common/main.c
> +++ b/common/main.c
> @@ -30,6 +30,7 @@
>  #include <common.h>
>  #include <watchdog.h>
>  #include <command.h>
> +#include <malloc.h>
>  #include <version.h>
>  #ifdef CONFIG_MODEM_SUPPORT
>  #include <malloc.h>		/* for free() prototype */
> @@ -1373,6 +1374,77 @@ int run_command(const char *cmd, int flag)
>  #endif
>  }
> 
> +#ifndef CONFIG_SYS_HUSH_PARSER
> +static int builtin_run_command_list(char *cmd, int flag)
> +{
> +	char *line, *next;
> +	int rcode = 0;
> +
> +	/*
> +	 * Break into individual lines, and execute each line; terminate on
> +	 * error.
> +	 */
> +	line = next = cmd;
> +	while (*next) {
> +		if (*next == '\n') {
> +			*next = '\0';
> +			/* run only non-empty commands */
> +			if (*line) {
> +				debug("** exec: \"%s\"\n", line);
> +				if (builtin_run_command(line, 0) < 0) {
> +					rcode = 1;
> +					break;
> +				}
> +			}
> +			line = next + 1;
> +		}
> +		++next;
> +	}
> +	if (rcode == 0 && *cmd)
> +		rcode = (builtin_run_command(cmd, 0) >= 0);
> +
> +	return rcode;
> +}
> +#endif
> +
> +/*
> + * Run a list of commands separated by ;
mh, where is the command string seperated by ';' if no hush is used?

> + *
> + * Note that if 'len' is not -1, then the command may not be \0
> terminated, + * Memory will be allocated for the command in that case.
> + *
> + * @param cmd	List of commands to run, each separated bu semicolon
> + * @param len	Length of command excluding terminator if known (-1 if 
not)
> + * @param flag	Execution flags (CMD_FLAG_...)
> + * @return 0 on success, or != 0 on error.
> + */
> +int run_command_list(const char *cmd, int len, int flag)
> +{
> +	int need_buff = 1;
> +	char *buff = (char *)cmd;
mhhh, builtin_run_command_list will modify buff. what do you think about 
always copying the buffer if no hush parser is used?

> +	int rcode = 0;
> +
> +	if (len == -1) {
> +		len = strlen(cmd);
> +		need_buff = strchr(cmd, '\n') != NULL;
> +	}
> +	if (need_buff) {
> +		buff = malloc(len + 1);
> +		if (!buff)
> +			return 1;
> +		memcpy(buff, cmd, len + 1);
> +	}
> +#ifdef CONFIG_SYS_HUSH_PARSER
> +	rcode = parse_string_outer(buff, FLAG_PARSE_SEMICOLON);
> +#else
> +	rcode = builtin_run_command_list(buff, flag);
> +#endif
> +	if (need_buff)
> +		free(buff);
> +
> +	return rcode;
> +}
> +
>  /*************************************************************************
> ***/
> 
>  #if defined(CONFIG_CMD_RUN)
> diff --git a/include/common.h b/include/common.h
> index 0bda049..cc5d61c 100644
> --- a/include/common.h
> +++ b/include/common.h
> @@ -261,6 +261,7 @@ int	print_buffer (ulong addr, void* data, uint 
width,
> uint count, uint linelen); /* common/main.c */
>  void	main_loop	(void);
>  int run_command(const char *cmd, int flag);
> +int run_command_list(const char *cmd, int len, int flag);
>  int	readline	(const char *const prompt);
>  int	readline_into_buffer(const char *const prompt, char *buffer,
>  			int timeout);

-- 
Michael


More information about the U-Boot mailing list