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

Simon Glass sjg at chromium.org
Wed Feb 15 23:23:19 CET 2012


Hi Michael,

On Wed, Feb 15, 2012 at 11:38 AM, Michael Walle <michael at walle.cc> wrote:
> 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?

In that case it is handled by builtin_run_command() already.

>
>> + *
>> + * 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?

Yes we could do - how would that help?

>
>> +     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

Regards,
Simon


More information about the U-Boot mailing list