CONFIG_SYS_MAXARGS is an arbitrary limit on the number of arguments which can be input at the command line. Remove that arbitrary limit. Setting maxargs in the cmdtp to 0 will result in the ability to enter as many arguments as you can hold in CONFIG_SYS_CBSIZE.
Signed-off-by: John Schmoller <jschmol...@xes-inc.com> --- Since v1: - Moved a change from 2/2 to this patch so both compile cleanly independently. board/amcc/makalu/cmd_pll.c | 2 +- board/esd/du440/du440.c | 4 +- board/fads/fads.h | 1 - board/freescale/common/pixis.c | 4 +- board/freescale/mpc8610hpcd/mpc8610hpcd_diu.c | 2 +- board/pxa255_idp/pxa_idp.c | 2 +- common/cmd_boot.c | 2 +- common/cmd_bootm.c | 4 +- common/cmd_diag.c | 2 +- common/cmd_display.c | 2 +- common/cmd_echo.c | 2 +- common/cmd_help.c | 4 +- common/cmd_mp.c | 2 +- common/cmd_nand.c | 2 +- common/cmd_nvedit.c | 8 ++-- common/cmd_onenand.c | 2 +- common/cmd_test.c | 6 ++-- common/command.c | 37 +++------------------- common/hush.c | 5 ++- common/kgdb.c | 2 +- common/main.c | 41 +++++++++++++++++++------ cpu/arm_cortexa8/mx51/clock.c | 2 +- cpu/mpc512x/diu.c | 2 +- cpu/mpc512x/iim.c | 2 +- include/command.h | 2 +- include/common.h | 4 ++- 26 files changed, 72 insertions(+), 76 deletions(-) diff --git a/board/amcc/makalu/cmd_pll.c b/board/amcc/makalu/cmd_pll.c index 9bae67e..5cadb4a 100644 --- a/board/amcc/makalu/cmd_pll.c +++ b/board/amcc/makalu/cmd_pll.c @@ -236,7 +236,7 @@ ret: } U_BOOT_CMD( - pllalter, CONFIG_SYS_MAXARGS, 1, do_pll_alter, + pllalter, 0, 1, do_pll_alter, "change pll frequence", "pllalter <selection> - change pll frequence \n\n\ ** New freq take effect after reset. ** \n\ diff --git a/board/esd/du440/du440.c b/board/esd/du440/du440.c index 111cce5..0c3d976 100644 --- a/board/esd/du440/du440.c +++ b/board/esd/du440/du440.c @@ -841,7 +841,7 @@ int do_time(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return ret; } U_BOOT_CMD( - time, CONFIG_SYS_MAXARGS, 1, do_time, + time, 0, 1, do_time, "run command and output execution time", "" ); @@ -891,7 +891,7 @@ int do_gfxdemo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 0; } U_BOOT_CMD( - gfxdemo, CONFIG_SYS_MAXARGS, 1, do_gfxdemo, + gfxdemo, 0, 1, do_gfxdemo, "demo", "" ); diff --git a/board/fads/fads.h b/board/fads/fads.h index 4ab4b26..c7d2b2d 100644 --- a/board/fads/fads.h +++ b/board/fads/fads.h @@ -140,7 +140,6 @@ #define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */ #endif #define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16) /* Print Buffer Size */ -#define CONFIG_SYS_MAXARGS 16 /* max number of command args */ #define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE /* Boot Argument Buffer Size */ #define CONFIG_SYS_LOAD_ADDR 0x00100000 diff --git a/board/freescale/common/pixis.c b/board/freescale/common/pixis.c index 7210512..b4b5d78 100644 --- a/board/freescale/common/pixis.c +++ b/board/freescale/common/pixis.c @@ -354,7 +354,7 @@ int pixis_set_sgmii(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } U_BOOT_CMD( - pixis_set_sgmii, CONFIG_SYS_MAXARGS, 1, pixis_set_sgmii, + pixis_set_sgmii, 0, 1, pixis_set_sgmii, "pixis_set_sgmii" " - Enable or disable SGMII mode for a given TSEC \n", "\npixis_set_sgmii [TSEC num] <on|off|switch>\n" @@ -550,7 +550,7 @@ pixis_reset_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) U_BOOT_CMD( - pixis_reset, CONFIG_SYS_MAXARGS, 1, pixis_reset_cmd, + pixis_reset, 0, 1, pixis_reset_cmd, "Reset the board using the FPGA sequencer", " pixis_reset\n" " pixis_reset [altbank]\n" diff --git a/board/freescale/mpc8610hpcd/mpc8610hpcd_diu.c b/board/freescale/mpc8610hpcd/mpc8610hpcd_diu.c index 4186a2e..6b8fd28 100644 --- a/board/freescale/mpc8610hpcd/mpc8610hpcd_diu.c +++ b/board/freescale/mpc8610hpcd/mpc8610hpcd_diu.c @@ -138,7 +138,7 @@ int mpc8610diu_init_show_bmp(cmd_tbl_t *cmdtp, } U_BOOT_CMD( - diufb, CONFIG_SYS_MAXARGS, 1, mpc8610diu_init_show_bmp, + diufb, 0, 1, mpc8610diu_init_show_bmp, "Init or Display BMP file", "init\n - initialize DIU\n" "addr\n - display bmp at address 'addr'" diff --git a/board/pxa255_idp/pxa_idp.c b/board/pxa255_idp/pxa_idp.c index 05e30ec..72ef9e6 100644 --- a/board/pxa255_idp/pxa_idp.c +++ b/board/pxa255_idp/pxa_idp.c @@ -128,7 +128,7 @@ int do_idpcmd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) return 0; } -U_BOOT_CMD(idpcmd, CONFIG_SYS_MAXARGS, 0, do_idpcmd, +U_BOOT_CMD(idpcmd, 0, 0, do_idpcmd, "custom IDP command", "no args at this time" ); diff --git a/common/cmd_boot.c b/common/cmd_boot.c index bfc1db2..1aa6081 100644 --- a/common/cmd_boot.c +++ b/common/cmd_boot.c @@ -63,7 +63,7 @@ int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) /* -------------------------------------------------------------------- */ U_BOOT_CMD( - go, CONFIG_SYS_MAXARGS, 1, do_go, + go, 0, 1, do_go, "start application at address 'addr'", "addr [arg ...]\n - start application at address 'addr'\n" " passing 'arg' as arguments" diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 23ab0c4..55f5a42 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -984,7 +984,7 @@ static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[] } U_BOOT_CMD( - bootm, CONFIG_SYS_MAXARGS, 1, do_bootm, + bootm, 0, 1, do_bootm, "boot application image from memory", "[addr [arg ...]]\n - boot application image stored in memory\n" "\tpassing arguments 'arg ...'; when booting a Linux kernel,\n" @@ -1133,7 +1133,7 @@ static int image_info (ulong addr) } U_BOOT_CMD( - iminfo, CONFIG_SYS_MAXARGS, 1, do_iminfo, + iminfo, 0, 1, do_iminfo, "print header information for application image", "addr [addr ...]\n" " - print header information for application image starting at\n" diff --git a/common/cmd_diag.c b/common/cmd_diag.c index 0436c49..c39b16c 100644 --- a/common/cmd_diag.c +++ b/common/cmd_diag.c @@ -65,7 +65,7 @@ int do_diag (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) /***************************************************/ U_BOOT_CMD( - diag, CONFIG_SYS_MAXARGS, 0, do_diag, + diag, 0, 0, do_diag, "perform board diagnostics", " - print list of available tests\n" "diag [test1 [test2]]\n" diff --git a/common/cmd_display.c b/common/cmd_display.c index 3422395..6851329 100644 --- a/common/cmd_display.c +++ b/common/cmd_display.c @@ -70,7 +70,7 @@ int do_display (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) /***************************************************/ U_BOOT_CMD( - display, CONFIG_SYS_MAXARGS, 1, do_display, + display, 0, 1, do_display, "display string on dot matrix display", "[<string>]\n" " - with <string> argument: display <string> on dot matrix display\n" diff --git a/common/cmd_echo.c b/common/cmd_echo.c index 3ec4d48..0f96efb 100644 --- a/common/cmd_echo.c +++ b/common/cmd_echo.c @@ -51,7 +51,7 @@ int do_echo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } U_BOOT_CMD( - echo, CONFIG_SYS_MAXARGS, 1, do_echo, + echo, 0, 1, do_echo, "echo args to console", "[args..]\n" " - echo args to console; \\c suppresses newline" diff --git a/common/cmd_help.c b/common/cmd_help.c index e860dfb..c729f79 100644 --- a/common/cmd_help.c +++ b/common/cmd_help.c @@ -32,7 +32,7 @@ int do_help(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) } U_BOOT_CMD( - help, CONFIG_SYS_MAXARGS, 1, do_help, + help, 0, 1, do_help, "print command description/usage", "\n" " - print brief description of all commands\n" @@ -42,7 +42,7 @@ U_BOOT_CMD( /* This does not use the U_BOOT_CMD macro as ? can't be used in symbol names */ cmd_tbl_t __u_boot_cmd_question_mark Struct_Section = { - "?", CONFIG_SYS_MAXARGS, 1, do_help, + "?", 0, 1, do_help, "alias for 'help'", #ifdef CONFIG_SYS_LONGHELP "" diff --git a/common/cmd_mp.c b/common/cmd_mp.c index d78c209..b8ddbf3 100644 --- a/common/cmd_mp.c +++ b/common/cmd_mp.c @@ -84,7 +84,7 @@ cpu_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) #endif U_BOOT_CMD( - cpu, CONFIG_SYS_MAXARGS, 1, cpu_cmd, + cpu, 0, 1, cpu_cmd, "Multiprocessor CPU boot manipulation and release", "<num> reset - Reset cpu <num>\n" "cpu <num> status - Status of cpu <num>\n" diff --git a/common/cmd_nand.c b/common/cmd_nand.c index 075a8af..430c115 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -475,7 +475,7 @@ usage: return 1; } -U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand, +U_BOOT_CMD(nand, 0, 1, do_nand, "NAND sub-system", "info - show available NAND devices\n" "nand device [dev] - show or set current device\n" diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index eb89e9e..6020e85 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -638,7 +638,7 @@ U_BOOT_CMD( #endif U_BOOT_CMD( - printenv, CONFIG_SYS_MAXARGS, 1, do_printenv, + printenv, 0, 1, do_printenv, "print environment variables", "\n - print values of all environment variables\n" "printenv name ...\n" @@ -646,7 +646,7 @@ U_BOOT_CMD( ); U_BOOT_CMD( - setenv, CONFIG_SYS_MAXARGS, 0, do_setenv, + setenv, 0, 0, do_setenv, "set environment variables", "name value ...\n" " - set environment variable 'name' to 'value ...'\n" @@ -657,7 +657,7 @@ U_BOOT_CMD( #if defined(CONFIG_CMD_ASKENV) U_BOOT_CMD( - askenv, CONFIG_SYS_MAXARGS, 1, do_askenv, + askenv, 0, 1, do_askenv, "get environment variables from stdin", "name [message] [size]\n" " - get environment variable 'name' from stdin (max 'size' chars)\n" @@ -674,7 +674,7 @@ U_BOOT_CMD( #if defined(CONFIG_CMD_RUN) int do_run (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); U_BOOT_CMD( - run, CONFIG_SYS_MAXARGS, 1, do_run, + run, 0, 1, do_run, "run commands in an environment variable", "var [...]\n" " - run the commands in the environment variable(s) 'var'" diff --git a/common/cmd_onenand.c b/common/cmd_onenand.c index 565257c..7701e21 100644 --- a/common/cmd_onenand.c +++ b/common/cmd_onenand.c @@ -481,7 +481,7 @@ usage: } U_BOOT_CMD( - onenand, CONFIG_SYS_MAXARGS, 1, do_onenand, + onenand, 0, 1, do_onenand, "OneNAND sub-system", "info - show available OneNAND devices\n" "onenand bad - show bad blocks\n" diff --git a/common/cmd_test.c b/common/cmd_test.c index d886f89..88ed2ba 100644 --- a/common/cmd_test.c +++ b/common/cmd_test.c @@ -145,7 +145,7 @@ int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } U_BOOT_CMD( - test, CONFIG_SYS_MAXARGS, 1, do_test, + test, 0, 1, do_test, "minimal test like /bin/sh", "[args..]" ); @@ -156,7 +156,7 @@ int do_false(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } U_BOOT_CMD( - false, CONFIG_SYS_MAXARGS, 1, do_false, + false, 0, 1, do_false, "do nothing, unsuccessfully", NULL ); @@ -167,7 +167,7 @@ int do_true(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } U_BOOT_CMD( - true, CONFIG_SYS_MAXARGS, 1, do_true, + true, 0, 1, do_true, "do nothing, successfully", NULL ); diff --git a/common/command.c b/common/command.c index 0c66b7a..246ace0 100644 --- a/common/command.c +++ b/common/command.c @@ -27,6 +27,7 @@ #include <common.h> #include <command.h> +#include <malloc.h> /* * Use puts() instead of printf() to avoid printf buffer overflow @@ -268,36 +269,6 @@ static int complete_cmdv(int argc, char *argv[], char last_char, int maxv, char return n_found; } -static int make_argv(char *s, int argvsz, char *argv[]) -{ - int argc = 0; - - /* split into argv */ - while (argc < argvsz - 1) { - - /* skip any white space */ - while ((*s == ' ') || (*s == '\t')) - ++s; - - if (*s == '\0') /* end of s, no more args */ - break; - - argv[argc++] = s; /* begin of argument string */ - - /* find end of string */ - while (*s && (*s != ' ') && (*s != '\t')) - ++s; - - if (*s == '\0') /* end of s, no more args */ - break; - - *s++ = '\0'; /* terminate current arg */ - } - argv[argc] = NULL; - - return argc; -} - static void print_argv(const char *banner, const char *leader, const char *sep, int linemax, char *argv[]) { int ll = leader != NULL ? strlen(leader) : 0; @@ -352,7 +323,7 @@ static char tmp_buf[CONFIG_SYS_CBSIZE]; /* copy of console I/O buffer */ int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp) { int n = *np, col = *colp; - char *argv[CONFIG_SYS_MAXARGS + 1]; /* NULL terminated */ + char **argv; /* NULL terminated */ char *cmdv[20]; char *s, *t; const char *sep; @@ -373,7 +344,9 @@ int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp) strcpy(tmp_buf, buf); /* separate into argv */ - argc = make_argv(tmp_buf, sizeof(argv)/sizeof(argv[0]), argv); + argc = arg_count(tmp_buf); + argv = (char **)malloc(sizeof(char *) * argc); + parse_line(tmp_buf, argv, argc); /* do the completion and return the possible completions */ i = complete_cmdv(argc, argv, last_char, sizeof(cmdv)/sizeof(cmdv[0]), cmdv); diff --git a/common/hush.c b/common/hush.c index 06c5ff8..1837a7f 100644 --- a/common/hush.c +++ b/common/hush.c @@ -1694,7 +1694,8 @@ static int run_pipe_real(struct pipe *pi) } #endif /* found - check max args */ - if ((child->argc - i) > cmdtp->maxargs) { + if (cmdtp->maxargs && + (child->argc - i) > cmdtp->maxargs) { cmd_usage(cmdtp); return -1; } @@ -3627,7 +3628,7 @@ int do_showvar (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } U_BOOT_CMD( - showvar, CONFIG_SYS_MAXARGS, 1, do_showvar, + showvar, 0, 1, do_showvar, "print local hushshell variables", "\n - print values of all hushshell variables\n" "showvar name ...\n" diff --git a/common/kgdb.c b/common/kgdb.c index 0531452..ac47c59 100644 --- a/common/kgdb.c +++ b/common/kgdb.c @@ -593,7 +593,7 @@ do_kgdb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } U_BOOT_CMD( - kgdb, CONFIG_SYS_MAXARGS, 1, do_kgdb, + kgdb, 0, 1, do_kgdb, "enter gdb remote debug mode", "[arg0 arg1 .. argN]\n" " - executes a breakpoint so that kgdb mode is\n" diff --git a/common/main.c b/common/main.c index 10d8904..64ec072 100644 --- a/common/main.c +++ b/common/main.c @@ -30,9 +30,7 @@ #include <common.h> #include <watchdog.h> #include <command.h> -#ifdef CONFIG_MODEM_SUPPORT #include <malloc.h> /* for free() prototype */ -#endif #ifdef CONFIG_SYS_HUSH_PARSER #include <hush.h> @@ -1112,15 +1110,35 @@ static char * delete_char (char *buffer, char *p, int *colp, int *np, int plen) } /****************************************************************************/ +int arg_count(char *line) +{ + int argc = 0; + + while (*line != '\0') { + + while ((*line == ' ') || (*line == '\t')) { + ++line; + } -int parse_line (char *line, char *argv[]) + argc++; + + /* find end of string */ + while (*line && (*line != ' ') && (*line != '\t')) { + ++line; + } + } + + return argc; +} + +int parse_line (char *line, char *argv[], uint argc) { int nargs = 0; #ifdef DEBUG_PARSER printf ("parse_line: \"%s\"\n", line); #endif - while (nargs < CONFIG_SYS_MAXARGS) { + while (nargs < argc) { /* skip any white space */ while ((*line == ' ') || (*line == '\t')) { @@ -1153,8 +1171,6 @@ int parse_line (char *line, char *argv[]) *line++ = '\0'; /* terminate current arg */ } - printf ("** Too many args (max. %d) **\n", CONFIG_SYS_MAXARGS); - #ifdef DEBUG_PARSER printf ("parse_line: nargs=%d\n", nargs); #endif @@ -1298,8 +1314,9 @@ int run_command (const char *cmd, int flag) char *sep; /* end of token (separator) in cmdbuf */ char finaltoken[CONFIG_SYS_CBSIZE]; char *str = cmdbuf; - char *argv[CONFIG_SYS_MAXARGS + 1]; /* NULL terminated */ - int argc, inquotes; + char **argv; + uint argc; + int inquotes; int repeatable = 1; int rc = 0; @@ -1365,7 +1382,9 @@ int run_command (const char *cmd, int flag) process_macros (token, finaltoken); /* Extract arguments */ - if ((argc = parse_line (finaltoken, argv)) == 0) { + argc = arg_count(finaltoken); + argv = (char **)malloc(sizeof(char *) * argc); + if (parse_line (finaltoken, argv, argc) == 0) { rc = -1; /* no command at all */ continue; } @@ -1378,7 +1397,7 @@ int run_command (const char *cmd, int flag) } /* found - check max args */ - if (argc > cmdtp->maxargs) { + if (cmdtp->maxargs && argc > cmdtp->maxargs) { cmd_usage(cmdtp); rc = -1; continue; @@ -1407,6 +1426,8 @@ int run_command (const char *cmd, int flag) repeatable &= cmdtp->repeatable; + free(argv); + /* Did the user stop this? */ if (had_ctrlc ()) return -1; /* if stopped then not repeatable */ diff --git a/cpu/arm_cortexa8/mx51/clock.c b/cpu/arm_cortexa8/mx51/clock.c index 38480ac..b594caf 100644 --- a/cpu/arm_cortexa8/mx51/clock.c +++ b/cpu/arm_cortexa8/mx51/clock.c @@ -288,7 +288,7 @@ int do_mx51_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) /***************************************************/ U_BOOT_CMD( - clockinfo, CONFIG_SYS_MAXARGS, 1, do_mx51_showclocks, + clockinfo, 0, 1, do_mx51_showclocks, "display mx51 clocks\n", "" ); diff --git a/cpu/mpc512x/diu.c b/cpu/mpc512x/diu.c index a24f395..bbb8421 100644 --- a/cpu/mpc512x/diu.c +++ b/cpu/mpc512x/diu.c @@ -126,7 +126,7 @@ int mpc5121diu_init_show_bmp(cmd_tbl_t *cmdtp, } U_BOOT_CMD( - diufb, CONFIG_SYS_MAXARGS, 1, mpc5121diu_init_show_bmp, + diufb, 0, 1, mpc5121diu_init_show_bmp, "Init or Display BMP file", "init\n - initialize DIU\n" "addr\n - display bmp at address 'addr'" diff --git a/cpu/mpc512x/iim.c b/cpu/mpc512x/iim.c index 8f2eb37..ae3de0b 100644 --- a/cpu/mpc512x/iim.c +++ b/cpu/mpc512x/iim.c @@ -374,7 +374,7 @@ int do_ads5121_fuse(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } U_BOOT_CMD( - fuse, CONFIG_SYS_MAXARGS, 0, do_ads5121_fuse, + fuse, 0, 0, do_ads5121_fuse, " - Read, Sense, Override or Program Fuses\n", "bank <n> - sets active Fuse Bank to 0 or 1\n" " no args shows current active bank\n" diff --git a/include/command.h b/include/command.h index 55caa6e..725df9f 100644 --- a/include/command.h +++ b/include/command.h @@ -45,7 +45,7 @@ struct cmd_tbl_s { char *name; /* Command Name */ - int maxargs; /* maximum number of arguments */ + unsigned int maxargs; /* maximum number of arguments */ int repeatable; /* autorepeat allowed? */ /* Implementation function */ int (*cmd)(struct cmd_tbl_s *, int, int, char *[]); diff --git a/include/common.h b/include/common.h index a133e34..6c15c02 100644 --- a/include/common.h +++ b/include/common.h @@ -1,3 +1,4 @@ + /* * (C) Copyright 2000-2009 * Wolfgang Denk, DENX Software Engineering, w...@denx.de. @@ -226,7 +227,8 @@ void main_loop (void); int run_command (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 *[]); +int arg_count(char *); +int parse_line (char *, char *[], uint); void init_cmd_timeout(void); void reset_cmd_timeout(void); -- 1.6.0.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot