hush: drop REDIRECT_INVALID; other minor tweaks
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
df5131cf3d
commit
764b2f0ec0
80
shell/hush.c
80
shell/hush.c
@ -173,23 +173,6 @@ typedef struct nommu_save_t {
|
||||
} nommu_save_t;
|
||||
#endif
|
||||
|
||||
/* The descrip member of this structure is only used to make
|
||||
* debugging output pretty */
|
||||
static const struct {
|
||||
int mode;
|
||||
signed char default_fd;
|
||||
char descrip[3];
|
||||
} redir_table[] = {
|
||||
{ 0, 0, "??" },
|
||||
{ O_RDONLY, 0, "<" },
|
||||
{ O_CREAT|O_TRUNC|O_WRONLY, 1, ">" },
|
||||
{ O_CREAT|O_APPEND|O_WRONLY, 1, ">>" },
|
||||
{ O_RDONLY, 0, "<<" },
|
||||
{ O_CREAT|O_RDWR, 1, "<>" },
|
||||
/* Should not be needed. Bogus default_fd helps in debugging */
|
||||
/* { O_RDONLY, 77, "<<" }, */
|
||||
};
|
||||
|
||||
typedef enum reserved_style {
|
||||
RES_NONE = 0,
|
||||
#if ENABLE_HUSH_IF
|
||||
@ -262,6 +245,22 @@ typedef struct in_str {
|
||||
#define i_getch(input) ((input)->get(input))
|
||||
#define i_peek(input) ((input)->peek(input))
|
||||
|
||||
/* The descrip member of this structure is only used to make
|
||||
* debugging output pretty */
|
||||
static const struct {
|
||||
int mode;
|
||||
signed char default_fd;
|
||||
char descrip[3];
|
||||
} redir_table[] = {
|
||||
{ O_RDONLY, 0, "<" },
|
||||
{ O_CREAT|O_TRUNC|O_WRONLY, 1, ">" },
|
||||
{ O_CREAT|O_APPEND|O_WRONLY, 1, ">>" },
|
||||
{ O_CREAT|O_RDWR, 1, "<>" },
|
||||
{ O_RDONLY, 0, "<<" },
|
||||
/* Should not be needed. Bogus default_fd helps in debugging */
|
||||
/* { O_RDONLY, 77, "<<" }, */
|
||||
};
|
||||
|
||||
struct redir_struct {
|
||||
struct redir_struct *next;
|
||||
char *rd_filename; /* filename */
|
||||
@ -271,18 +270,17 @@ struct redir_struct {
|
||||
smallint rd_type; /* (enum redir_type) */
|
||||
/* note: for heredocs, rd_filename contains heredoc delimiter,
|
||||
* and subsequently heredoc itself; and rd_dup is a bitmask:
|
||||
* 1: do we need to trim leading tabs?
|
||||
* 2: is heredoc quoted (<<'delim' syntax) ?
|
||||
* bit 0: do we need to trim leading tabs?
|
||||
* bit 1: is heredoc quoted (<<'delim' syntax) ?
|
||||
*/
|
||||
};
|
||||
typedef enum redir_type {
|
||||
REDIRECT_INVALID = 0,
|
||||
REDIRECT_INPUT = 1,
|
||||
REDIRECT_OVERWRITE = 2,
|
||||
REDIRECT_APPEND = 3,
|
||||
REDIRECT_INPUT = 0,
|
||||
REDIRECT_OVERWRITE = 1,
|
||||
REDIRECT_APPEND = 2,
|
||||
REDIRECT_IO = 3,
|
||||
REDIRECT_HEREDOC = 4,
|
||||
REDIRECT_IO = 5,
|
||||
REDIRECT_HEREDOC2 = 6, /* REDIRECT_HEREDOC after heredoc is loaded */
|
||||
REDIRECT_HEREDOC2 = 5, /* REDIRECT_HEREDOC after heredoc is loaded */
|
||||
|
||||
REDIRFD_CLOSE = -3,
|
||||
REDIRFD_SYNTAX_ERR = -2,
|
||||
@ -3093,13 +3091,13 @@ static void unset_func(const char *name)
|
||||
}
|
||||
|
||||
# if BB_MMU
|
||||
#define exec_function(nommu_save, funcp, argv) \
|
||||
#define exec_function(to_free, funcp, argv) \
|
||||
exec_function(funcp, argv)
|
||||
# endif
|
||||
static void exec_function(nommu_save_t *nommu_save,
|
||||
static void exec_function(char ***to_free,
|
||||
const struct function *funcp,
|
||||
char **argv) NORETURN;
|
||||
static void exec_function(nommu_save_t *nommu_save,
|
||||
static void exec_function(char ***to_free,
|
||||
const struct function *funcp,
|
||||
char **argv)
|
||||
{
|
||||
@ -3116,7 +3114,7 @@ static void exec_function(nommu_save_t *nommu_save,
|
||||
fflush(NULL);
|
||||
_exit(n);
|
||||
# else
|
||||
re_execute_shell(&nommu_save->argv_from_re_execing,
|
||||
re_execute_shell(to_free,
|
||||
funcp->body_as_string,
|
||||
G.global_argv[0],
|
||||
argv + 1,
|
||||
@ -3185,16 +3183,16 @@ static int run_function(const struct function *funcp, char **argv)
|
||||
|
||||
|
||||
# if BB_MMU
|
||||
#define exec_builtin(nommu_save, x, argv) \
|
||||
#define exec_builtin(to_free, x, argv) \
|
||||
exec_builtin(x, argv)
|
||||
# else
|
||||
#define exec_builtin(nommu_save, x, argv) \
|
||||
exec_builtin(nommu_save, argv)
|
||||
#define exec_builtin(to_free, x, argv) \
|
||||
exec_builtin(to_free, argv)
|
||||
# endif
|
||||
static void exec_builtin(nommu_save_t *nommu_save,
|
||||
static void exec_builtin(char ***to_free,
|
||||
const struct built_in_command *x,
|
||||
char **argv) NORETURN;
|
||||
static void exec_builtin(nommu_save_t *nommu_save,
|
||||
static void exec_builtin(char ***to_free,
|
||||
const struct built_in_command *x,
|
||||
char **argv)
|
||||
{
|
||||
@ -3206,7 +3204,7 @@ static void exec_builtin(nommu_save_t *nommu_save,
|
||||
/* On NOMMU, we must never block!
|
||||
* Example: { sleep 99 | read line; } & echo Ok
|
||||
*/
|
||||
re_execute_shell(&nommu_save->argv_from_re_execing,
|
||||
re_execute_shell(to_free,
|
||||
argv[0],
|
||||
G.global_argv[0],
|
||||
G.global_argv + 1,
|
||||
@ -3277,7 +3275,7 @@ static void pseudo_exec_argv(nommu_save_t *nommu_save,
|
||||
const struct built_in_command *x;
|
||||
x = BB_MMU ? find_builtin(argv[0]) : find_builtin1(argv[0]);
|
||||
if (x) {
|
||||
exec_builtin(nommu_save, x, argv);
|
||||
exec_builtin(&nommu_save->argv_from_re_execing, x, argv);
|
||||
}
|
||||
}
|
||||
#if ENABLE_HUSH_FUNCTIONS
|
||||
@ -3285,7 +3283,7 @@ static void pseudo_exec_argv(nommu_save_t *nommu_save,
|
||||
{
|
||||
const struct function *funcp = find_function(argv[0]);
|
||||
if (funcp) {
|
||||
exec_function(nommu_save, funcp, argv);
|
||||
exec_function(&nommu_save->argv_from_re_execing, funcp, argv);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -5025,7 +5023,7 @@ static int fetch_heredocs(int heredoc_cnt, struct parse_context *ctx, struct in_
|
||||
char *p;
|
||||
|
||||
redir->rd_type = REDIRECT_HEREDOC2;
|
||||
/* redir->dup is (ab)used to indicate <<- */
|
||||
/* redir->rd_dup is (ab)used to indicate <<- */
|
||||
p = fetch_till_str(&ctx->as_string, input,
|
||||
redir->rd_filename, redir->rd_dup & HEREDOC_SKIPTABS);
|
||||
if (!p) {
|
||||
@ -6122,10 +6120,8 @@ static struct pipe *parse_stream(char **pstring,
|
||||
IF_HAS_KEYWORDS(struct parse_context *p2;)
|
||||
|
||||
/* Clean up allocated tree.
|
||||
* Samples for finding leaks on syntax error recovery path.
|
||||
* Run them from interactive shell, watch pmap `pidof hush`.
|
||||
* while if false; then false; fi do break; done
|
||||
* (bash accepts it)
|
||||
* Sample for finding leaks on syntax error recovery path.
|
||||
* Run it from interactive shell, watch pmap `pidof hush`.
|
||||
* while if false; then false; fi; do break; fi
|
||||
* Samples to catch leaks at execution:
|
||||
* while if (true | {true;}); then echo ok; fi; do break; done
|
||||
|
Loading…
Reference in New Issue
Block a user