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;
|
} nommu_save_t;
|
||||||
#endif
|
#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 {
|
typedef enum reserved_style {
|
||||||
RES_NONE = 0,
|
RES_NONE = 0,
|
||||||
#if ENABLE_HUSH_IF
|
#if ENABLE_HUSH_IF
|
||||||
@ -262,6 +245,22 @@ typedef struct in_str {
|
|||||||
#define i_getch(input) ((input)->get(input))
|
#define i_getch(input) ((input)->get(input))
|
||||||
#define i_peek(input) ((input)->peek(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 {
|
||||||
struct redir_struct *next;
|
struct redir_struct *next;
|
||||||
char *rd_filename; /* filename */
|
char *rd_filename; /* filename */
|
||||||
@ -271,18 +270,17 @@ struct redir_struct {
|
|||||||
smallint rd_type; /* (enum redir_type) */
|
smallint rd_type; /* (enum redir_type) */
|
||||||
/* note: for heredocs, rd_filename contains heredoc delimiter,
|
/* note: for heredocs, rd_filename contains heredoc delimiter,
|
||||||
* and subsequently heredoc itself; and rd_dup is a bitmask:
|
* and subsequently heredoc itself; and rd_dup is a bitmask:
|
||||||
* 1: do we need to trim leading tabs?
|
* bit 0: do we need to trim leading tabs?
|
||||||
* 2: is heredoc quoted (<<'delim' syntax) ?
|
* bit 1: is heredoc quoted (<<'delim' syntax) ?
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
typedef enum redir_type {
|
typedef enum redir_type {
|
||||||
REDIRECT_INVALID = 0,
|
REDIRECT_INPUT = 0,
|
||||||
REDIRECT_INPUT = 1,
|
REDIRECT_OVERWRITE = 1,
|
||||||
REDIRECT_OVERWRITE = 2,
|
REDIRECT_APPEND = 2,
|
||||||
REDIRECT_APPEND = 3,
|
REDIRECT_IO = 3,
|
||||||
REDIRECT_HEREDOC = 4,
|
REDIRECT_HEREDOC = 4,
|
||||||
REDIRECT_IO = 5,
|
REDIRECT_HEREDOC2 = 5, /* REDIRECT_HEREDOC after heredoc is loaded */
|
||||||
REDIRECT_HEREDOC2 = 6, /* REDIRECT_HEREDOC after heredoc is loaded */
|
|
||||||
|
|
||||||
REDIRFD_CLOSE = -3,
|
REDIRFD_CLOSE = -3,
|
||||||
REDIRFD_SYNTAX_ERR = -2,
|
REDIRFD_SYNTAX_ERR = -2,
|
||||||
@ -3093,13 +3091,13 @@ static void unset_func(const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
# if BB_MMU
|
# if BB_MMU
|
||||||
#define exec_function(nommu_save, funcp, argv) \
|
#define exec_function(to_free, funcp, argv) \
|
||||||
exec_function(funcp, argv)
|
exec_function(funcp, argv)
|
||||||
# endif
|
# endif
|
||||||
static void exec_function(nommu_save_t *nommu_save,
|
static void exec_function(char ***to_free,
|
||||||
const struct function *funcp,
|
const struct function *funcp,
|
||||||
char **argv) NORETURN;
|
char **argv) NORETURN;
|
||||||
static void exec_function(nommu_save_t *nommu_save,
|
static void exec_function(char ***to_free,
|
||||||
const struct function *funcp,
|
const struct function *funcp,
|
||||||
char **argv)
|
char **argv)
|
||||||
{
|
{
|
||||||
@ -3116,7 +3114,7 @@ static void exec_function(nommu_save_t *nommu_save,
|
|||||||
fflush(NULL);
|
fflush(NULL);
|
||||||
_exit(n);
|
_exit(n);
|
||||||
# else
|
# else
|
||||||
re_execute_shell(&nommu_save->argv_from_re_execing,
|
re_execute_shell(to_free,
|
||||||
funcp->body_as_string,
|
funcp->body_as_string,
|
||||||
G.global_argv[0],
|
G.global_argv[0],
|
||||||
argv + 1,
|
argv + 1,
|
||||||
@ -3185,16 +3183,16 @@ static int run_function(const struct function *funcp, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
# if BB_MMU
|
# if BB_MMU
|
||||||
#define exec_builtin(nommu_save, x, argv) \
|
#define exec_builtin(to_free, x, argv) \
|
||||||
exec_builtin(x, argv)
|
exec_builtin(x, argv)
|
||||||
# else
|
# else
|
||||||
#define exec_builtin(nommu_save, x, argv) \
|
#define exec_builtin(to_free, x, argv) \
|
||||||
exec_builtin(nommu_save, argv)
|
exec_builtin(to_free, argv)
|
||||||
# endif
|
# endif
|
||||||
static void exec_builtin(nommu_save_t *nommu_save,
|
static void exec_builtin(char ***to_free,
|
||||||
const struct built_in_command *x,
|
const struct built_in_command *x,
|
||||||
char **argv) NORETURN;
|
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,
|
const struct built_in_command *x,
|
||||||
char **argv)
|
char **argv)
|
||||||
{
|
{
|
||||||
@ -3206,7 +3204,7 @@ static void exec_builtin(nommu_save_t *nommu_save,
|
|||||||
/* On NOMMU, we must never block!
|
/* On NOMMU, we must never block!
|
||||||
* Example: { sleep 99 | read line; } & echo Ok
|
* Example: { sleep 99 | read line; } & echo Ok
|
||||||
*/
|
*/
|
||||||
re_execute_shell(&nommu_save->argv_from_re_execing,
|
re_execute_shell(to_free,
|
||||||
argv[0],
|
argv[0],
|
||||||
G.global_argv[0],
|
G.global_argv[0],
|
||||||
G.global_argv + 1,
|
G.global_argv + 1,
|
||||||
@ -3277,7 +3275,7 @@ static void pseudo_exec_argv(nommu_save_t *nommu_save,
|
|||||||
const struct built_in_command *x;
|
const struct built_in_command *x;
|
||||||
x = BB_MMU ? find_builtin(argv[0]) : find_builtin1(argv[0]);
|
x = BB_MMU ? find_builtin(argv[0]) : find_builtin1(argv[0]);
|
||||||
if (x) {
|
if (x) {
|
||||||
exec_builtin(nommu_save, x, argv);
|
exec_builtin(&nommu_save->argv_from_re_execing, x, argv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if ENABLE_HUSH_FUNCTIONS
|
#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]);
|
const struct function *funcp = find_function(argv[0]);
|
||||||
if (funcp) {
|
if (funcp) {
|
||||||
exec_function(nommu_save, funcp, argv);
|
exec_function(&nommu_save->argv_from_re_execing, funcp, argv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -5025,7 +5023,7 @@ static int fetch_heredocs(int heredoc_cnt, struct parse_context *ctx, struct in_
|
|||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
redir->rd_type = REDIRECT_HEREDOC2;
|
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,
|
p = fetch_till_str(&ctx->as_string, input,
|
||||||
redir->rd_filename, redir->rd_dup & HEREDOC_SKIPTABS);
|
redir->rd_filename, redir->rd_dup & HEREDOC_SKIPTABS);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
@ -6122,10 +6120,8 @@ static struct pipe *parse_stream(char **pstring,
|
|||||||
IF_HAS_KEYWORDS(struct parse_context *p2;)
|
IF_HAS_KEYWORDS(struct parse_context *p2;)
|
||||||
|
|
||||||
/* Clean up allocated tree.
|
/* Clean up allocated tree.
|
||||||
* Samples for finding leaks on syntax error recovery path.
|
* Sample for finding leaks on syntax error recovery path.
|
||||||
* Run them from interactive shell, watch pmap `pidof hush`.
|
* Run it from interactive shell, watch pmap `pidof hush`.
|
||||||
* while if false; then false; fi do break; done
|
|
||||||
* (bash accepts it)
|
|
||||||
* while if false; then false; fi; do break; fi
|
* while if false; then false; fi; do break; fi
|
||||||
* Samples to catch leaks at execution:
|
* Samples to catch leaks at execution:
|
||||||
* while if (true | {true;}); then echo ok; fi; do break; done
|
* while if (true | {true;}); then echo ok; fi; do break; done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user