hush: remove env builtin (it is buggy). Add comments
This commit is contained in:
parent
3bc18253b0
commit
f2fffd0014
33
shell/hush.c
33
shell/hush.c
@ -332,7 +332,6 @@ static void __syntax(int line)
|
|||||||
/* Index of subroutines: */
|
/* Index of subroutines: */
|
||||||
/* function prototypes for builtins */
|
/* function prototypes for builtins */
|
||||||
static int builtin_cd(char **argv);
|
static int builtin_cd(char **argv);
|
||||||
static int builtin_env(char **argv);
|
|
||||||
static int builtin_eval(char **argv);
|
static int builtin_eval(char **argv);
|
||||||
static int builtin_exec(char **argv);
|
static int builtin_exec(char **argv);
|
||||||
static int builtin_exit(char **argv);
|
static int builtin_exit(char **argv);
|
||||||
@ -432,7 +431,6 @@ static const struct built_in_command bltins[] = {
|
|||||||
{ "break", "Exit for, while or until loop", builtin_not_written },
|
{ "break", "Exit for, while or until loop", builtin_not_written },
|
||||||
{ "cd", "Change working directory", builtin_cd },
|
{ "cd", "Change working directory", builtin_cd },
|
||||||
{ "continue", "Continue for, while or until loop", builtin_not_written },
|
{ "continue", "Continue for, while or until loop", builtin_not_written },
|
||||||
{ "env", "Print all environment variables", builtin_env },
|
|
||||||
{ "eval", "Construct and run shell command", builtin_eval },
|
{ "eval", "Construct and run shell command", builtin_eval },
|
||||||
{ "exec", "Exec command, replacing this shell with the exec'd process",
|
{ "exec", "Exec command, replacing this shell with the exec'd process",
|
||||||
builtin_exec },
|
builtin_exec },
|
||||||
@ -643,19 +641,6 @@ static int builtin_cd(char **argv)
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* built-in 'env' handler */
|
|
||||||
static int builtin_env(char **argv ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
/* TODO: call env applet's code instead */
|
|
||||||
char **e = environ;
|
|
||||||
if (e == NULL)
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
while (*e) {
|
|
||||||
puts(*e++);
|
|
||||||
}
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* built-in 'exec' handler */
|
/* built-in 'exec' handler */
|
||||||
static int builtin_exec(char **argv)
|
static int builtin_exec(char **argv)
|
||||||
{
|
{
|
||||||
@ -670,13 +655,15 @@ static int builtin_exit(char **argv)
|
|||||||
{
|
{
|
||||||
// TODO: bash does it ONLY on top-level sh exit (+interacive only?)
|
// TODO: bash does it ONLY on top-level sh exit (+interacive only?)
|
||||||
//puts("exit"); /* bash does it */
|
//puts("exit"); /* bash does it */
|
||||||
|
// TODO: warn if we have background jobs: "There are stopped jobs"
|
||||||
|
// On second consecutive 'exit', exit anyway.
|
||||||
|
|
||||||
if (argv[1] == NULL)
|
if (argv[1] == NULL)
|
||||||
hush_exit(last_return_code);
|
hush_exit(last_return_code);
|
||||||
/* mimic bash: exit 123abc == exit 255 + error msg */
|
/* mimic bash: exit 123abc == exit 255 + error msg */
|
||||||
xfunc_error_retval = 255;
|
xfunc_error_retval = 255;
|
||||||
/* bash: exit -2 == exit 254, no error msg */
|
/* bash: exit -2 == exit 254, no error msg */
|
||||||
hush_exit(xatoi(argv[1]));
|
hush_exit(xatoi(argv[1]) & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* built-in 'export VAR=value' handler */
|
/* built-in 'export VAR=value' handler */
|
||||||
@ -686,7 +673,15 @@ static int builtin_export(char **argv)
|
|||||||
char *name = argv[1];
|
char *name = argv[1];
|
||||||
|
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
return builtin_env(argv);
|
// TODO:
|
||||||
|
// ash emits: export VAR='VAL'
|
||||||
|
// bash: declare -x VAR="VAL"
|
||||||
|
// (both also escape as needed (quotes, $, etc))
|
||||||
|
char **e = environ;
|
||||||
|
if (e)
|
||||||
|
while (*e)
|
||||||
|
puts(*e++);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
name = strdup(name);
|
name = strdup(name);
|
||||||
@ -1321,6 +1316,8 @@ static void pseudo_exec_argv(char **argv)
|
|||||||
|
|
||||||
static void pseudo_exec(struct child_prog *child)
|
static void pseudo_exec(struct child_prog *child)
|
||||||
{
|
{
|
||||||
|
// FIXME: buggy wrt NOMMU! Must not modify any global data
|
||||||
|
// until it does exec/_exit, but currently it does.
|
||||||
int rcode;
|
int rcode;
|
||||||
|
|
||||||
if (child->argv) {
|
if (child->argv) {
|
||||||
@ -1852,6 +1849,8 @@ static int run_pipe_real(struct pipe *pi)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NB: called by pseudo_exec, and therefore must not modify any
|
||||||
|
// global data until exec/_exit (we can be a child after vfork!)
|
||||||
static int run_list_real(struct pipe *pi)
|
static int run_list_real(struct pipe *pi)
|
||||||
{
|
{
|
||||||
char *save_name = NULL;
|
char *save_name = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user