Hi Michael, On Wed, Feb 15, 2012 at 11:38 AM, Michael Walle <mich...@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 <mich...@walle.cc> >> Signed-off-by: Simon Glass <s...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot