]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
cli: Support macro processing with a fixed-size buffer
authorSimon Glass <sjg@chromium.org>
Thu, 5 Nov 2020 17:33:47 +0000 (10:33 -0700)
committerTom Rini <trini@konsulko.com>
Fri, 4 Dec 2020 21:10:01 +0000 (16:10 -0500)
At present cli_simple_process_macros() requires that the caller provide
an output buffer that is exactly CONFIG_SYS_CBSIZE bytes in length. This
makes sense since it is designed to be used from the command line. But we
also want to use it for bootargs substitution.

Update the function to allow the caller to specify the buffer size. Also
return an error if the buffer is exhausted. The caller can ignore that if
preferred.

Signed-off-by: Simon Glass <sjg@chromium.org>
cmd/pxe_utils.c
common/cli_simple.c
include/cli.h

index 235522f4bbc64b5af8c855a3ccf161558c94ecab..b9d9a5786c265f3378c479249946c3b4c604ab38 100644 (file)
@@ -322,7 +322,8 @@ static int label_localboot(struct pxe_label *label)
        if (label->append) {
                char bootargs[CONFIG_SYS_CBSIZE];
 
-               cli_simple_process_macros(label->append, bootargs);
+               cli_simple_process_macros(label->append, bootargs,
+                                         sizeof(bootargs));
                env_set("bootargs", bootargs);
        }
 
@@ -430,7 +431,8 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label)
                strcat(bootargs, ip_str);
                strcat(bootargs, mac_str);
 
-               cli_simple_process_macros(bootargs, finalbootargs);
+               cli_simple_process_macros(bootargs, finalbootargs,
+                                         sizeof(finalbootargs));
                env_set("bootargs", finalbootargs);
                printf("append: %s\n", finalbootargs);
        }
index 7d91316a0fbd86d5ab617e6c21fc37567573ea07..e80ba488a5eb0f4234a920a404465471e353c558 100644 (file)
@@ -60,13 +60,14 @@ int cli_simple_parse_line(char *line, char *argv[])
        return nargs;
 }
 
-void cli_simple_process_macros(const char *input, char *output)
+int cli_simple_process_macros(const char *input, char *output, int max_size)
 {
        char c, prev;
        const char *varname_start = NULL;
        int inputcnt = strlen(input);
-       int outputcnt = CONFIG_SYS_CBSIZE;
+       int outputcnt = max_size;
        int state = 0;          /* 0 = waiting for '$'  */
+       int ret;
 
        /* 1 = waiting for '(' or '{' */
        /* 2 = waiting for ')' or '}' */
@@ -157,13 +158,18 @@ void cli_simple_process_macros(const char *input, char *output)
                prev = c;
        }
 
-       if (outputcnt)
+       ret = inputcnt ? -ENOSPC : 0;
+       if (outputcnt) {
                *output = 0;
-       else
+       } else {
                *(output - 1) = 0;
+               ret = -ENOSPC;
+       }
 
        debug_parser("[PROCESS_MACROS] OUTPUT len %zd: \"%s\"\n",
                     strlen(output_start), output_start);
+
+       return ret;
 }
 
  /*
@@ -239,7 +245,8 @@ int cli_simple_run_command(const char *cmd, int flag)
                debug_parser("token: \"%s\"\n", token);
 
                /* find macros in this token and replace them */
-               cli_simple_process_macros(token, finaltoken);
+               cli_simple_process_macros(token, finaltoken,
+                                         sizeof(finaltoken));
 
                /* Extract arguments */
                argc = cli_simple_parse_line(finaltoken, argv);
index 39b913743b55089266a38a32c6e94b9bb3cb077e..3449fa6ae72767a60b37d1fb55ecf76f7af61212 100644 (file)
@@ -34,8 +34,10 @@ int cli_simple_run_command(const char *cmd, int flag);
  *
  * @param input                Input string possible containing $() / ${} vars
  * @param output       Output string with $() / ${} vars expanded
+ * @param max_size     Maximum size of @output (including terminator)
+ * @return 0 if OK, -ENOSPC if we ran out of space in @output
  */
-void cli_simple_process_macros(const char *input, char *output);
+int cli_simple_process_macros(const char *input, char *output, int max_size);
 
 /**
  * cli_simple_run_command_list() - Execute a list of command