87b6398b46
The run command treats each argument an an environment variable. It gets the value of each variable and executes it as a command. If an environment variable contains a newline and the hush cli is used, it is supposed to execute each line one after the other. Normally a newline signals to hush to exit - this is used in normal command line entry - after a command is entered we want to return to allow the user to enter the next one. But environment variables obviously need to execute to completion. Add a special case for the execution of environment variables which continues when a newline is seen, and add a few tests to check this behaviour. Note: it's not impossible that this may cause regressions in other areas. I can't think of a case but with any change of behaviour with limited test coverage there is always a risk. From what I can tell this behaviour has been around since at least U-Boot 2011.03, although this pre-dates sandbox and I have not tested it on real hardware. Reported-by: Wolfgang Denk <wd@denx.de> Signed-off-by: Simon Glass <sjg@chromium.org>
28 lines
737 B
C
28 lines
737 B
C
/*
|
|
* (C) Copyright 2001
|
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#ifndef _CLI_HUSH_H_
|
|
#define _CLI_HUSH_H_
|
|
|
|
#define FLAG_EXIT_FROM_LOOP 1
|
|
#define FLAG_PARSE_SEMICOLON (1 << 1) /* symbol ';' is special for parser */
|
|
#define FLAG_REPARSING (1 << 2) /* >=2nd pass */
|
|
#define FLAG_CONT_ON_NEWLINE (1 << 3) /* continue when we see \n */
|
|
|
|
extern int u_boot_hush_start(void);
|
|
extern int parse_string_outer(const char *, int);
|
|
extern int parse_file_outer(void);
|
|
|
|
int set_local_var(const char *s, int flg_export);
|
|
void unset_local_var(const char *name);
|
|
char *get_local_var(const char *s);
|
|
|
|
#if defined(CONFIG_HUSH_INIT_VAR)
|
|
extern int hush_init_var (void);
|
|
#endif
|
|
#endif
|