
Introduce source_commands() which incorporates run_command2() and parts of source().
All command script are now treated the same, that is newlines are accepted within a command script and variable.
Signed-off-by: Michael Walle michael@walle.cc Cc: Wolfgang Denk wd@denx.de Cc: Mike Frysinger vapier@gentoo.org ---
This patch supersedes "cmd_source: introduce run_script()" v2: - argument is now const char* - unify run_commands2() and source() - allow newlines in command variables - use strsep()
common/cmd_pxe.c | 2 +- common/cmd_source.c | 32 +------------------------------ common/main.c | 52 ++++++++++++++++++++++++++++++++++---------------- include/common.h | 4 +-- 4 files changed, 38 insertions(+), 52 deletions(-)
diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index 7c0cb66..347fde1 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -537,7 +537,7 @@ static int label_localboot(struct pxe_label *label)
printf("running: %s\n", dupcmd);
- ret = run_command2(dupcmd, 0); + ret = source_commands(dupcmd, 0);
free(dupcmd);
diff --git a/common/cmd_source.c b/common/cmd_source.c index 16a627a..33242df 100644 --- a/common/cmd_source.c +++ b/common/cmd_source.c @@ -160,38 +160,8 @@ source (ulong addr, const char *fit_uname) memmove (cmd, (char *)data, len); *(cmd + len) = 0;
-#ifdef CONFIG_SYS_HUSH_PARSER /*?? */ - rcode = parse_string_outer (cmd, FLAG_PARSE_SEMICOLON); -#else - { - char *line = cmd; - char *next = cmd; + rcode = source_commands(cmd, 0);
- /* - * break into individual lines, - * and execute each line; - * terminate on error. - */ - while (*next) { - if (*next == '\n') { - *next = '\0'; - /* run only non-empty commands */ - if (*line) { - debug ("** exec: "%s"\n", - line); - if (run_command (line, 0) < 0) { - rcode = 1; - break; - } - } - line = next + 1; - } - ++next; - } - if (rcode == 0 && *line) - rcode = (run_command(line, 0) >= 0); - } -#endif free (cmd); return rcode; } diff --git a/common/main.c b/common/main.c index e96c95a..cc25d38 100644 --- a/common/main.c +++ b/common/main.c @@ -266,26 +266,44 @@ int abortboot(int bootdelay) # endif /* CONFIG_AUTOBOOT_KEYED */ #endif /* CONFIG_BOOTDELAY >= 0 */
+static inline int _run_command(const char *cmd, int flag) +{ +#ifndef CONFIG_SYS_HUSH_PARSER + return (run_command(cmd, flag) == -1); +#else + flag = FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP; + return parse_string_outer(cmd, flag); +#endif +} + /* + * Run a series of commands separated by '\n'. + * * Return 0 on success, or != 0 on error. */ -#ifndef CONFIG_CMD_PXE -static inline -#endif -int run_command2(const char *cmd, int flag) +int source_commands(const char *commands, int flag) { -#ifndef CONFIG_SYS_HUSH_PARSER + int rcode = 0; + char *_commands = strdup(commands); + char *stringp = _commands; + char *line; + /* - * run_command can return 0 or 1 for success, so clean up its result. + * break into individual lines and execute each line; + * terminate on error. */ - if (run_command(cmd, flag) == -1) - return 1; + while ((line = strsep(&stringp, "\n"))) { + /* skip empty lines */ + if (*line == '\0') + continue; + if (_run_command(line, flag)) { + rcode = 1; + break; + } + }
- return 0; -#else - return parse_string_outer(cmd, - FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP); -#endif + free(_commands); + return rcode; }
/****************************************************************************/ @@ -354,7 +372,7 @@ void main_loop (void) int prev = disable_ctrlc(1); /* disable Control C checking */ # endif
- run_command2(p, 0); + source_commands(p, 0);
# ifdef CONFIG_AUTOBOOT_KEYED disable_ctrlc(prev); /* restore Control C checking */ @@ -399,7 +417,7 @@ void main_loop (void) int prev = disable_ctrlc(1); /* disable Control C checking */ # endif
- run_command2(s, 0); + source_commands(s, 0);
# ifdef CONFIG_AUTOBOOT_KEYED disable_ctrlc(prev); /* restore Control C checking */ @@ -410,7 +428,7 @@ void main_loop (void) if (menukey == CONFIG_MENUKEY) { s = getenv("menucmd"); if (s) - run_command2(s, 0); + source_commands(s, 0); } #endif /* CONFIG_MENUKEY */ #endif /* CONFIG_BOOTDELAY */ @@ -1408,7 +1426,7 @@ int do_run (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) return 1; }
- if (run_command2(arg, flag) != 0) + if (source_commands(arg, flag) != 0) return 1; } return 0; diff --git a/include/common.h b/include/common.h index 3df1def..c2e7813 100644 --- a/include/common.h +++ b/include/common.h @@ -261,9 +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); -#ifdef CONFIG_CMD_PXE -int run_command2(const char *cmd, int flag); -#endif +int source_commands(const char *cmd, int flag); int readline (const char *const prompt); int readline_into_buffer (const char *const prompt, char * buffer); int parse_line (char *, char *[]);