From: Michael Walle Date: Wed, 15 Feb 2012 20:38:15 +0100 Subject: [U-Boot] [PATCH 1/2] Add run_command_list() to run a list of commands In-Reply-To: <1329286030-32560-1-git-send-email-sjg@chromium.org> References: <1329286030-32560-1-git-send-email-sjg@chromium.org> Message-ID: <201202152038.15401.michael@walle.cc> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 > Signed-off-by: Simon Glass > --- > 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 > #include > #include > +#include > #include > #ifdef CONFIG_MODEM_SUPPORT > #include /* 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