lash: "forking" applets are actually can be treated the same way as "non-forked".
Also save a bit of space on trailing NULL array elements.
This commit is contained in:
parent
7cced6e574
commit
b69f35effe
45
shell/lash.c
45
shell/lash.c
@ -136,18 +136,18 @@ static const struct built_in_command bltins[] = {
|
|||||||
{"unset" , "Unset environment variable", builtin_unset},
|
{"unset" , "Unset environment variable", builtin_unset},
|
||||||
{"read" , "Input environment variable", builtin_read},
|
{"read" , "Input environment variable", builtin_read},
|
||||||
{"." , "Source-in and run commands in a file", builtin_source},
|
{"." , "Source-in and run commands in a file", builtin_source},
|
||||||
/* to do: add ulimit */
|
/* These were "forked applets", but distinction was nuked */
|
||||||
{NULL, NULL, NULL}
|
/* Original comment retained: */
|
||||||
};
|
|
||||||
|
|
||||||
/* Table of forking built-in functions (things that fork cannot change global
|
/* Table of forking built-in functions (things that fork cannot change global
|
||||||
* variables in the parent process, such as the current working directory) */
|
* variables in the parent process, such as the current working directory) */
|
||||||
static struct built_in_command bltins_forking[] = {
|
|
||||||
{"pwd" , "Print current directory", builtin_pwd},
|
{"pwd" , "Print current directory", builtin_pwd},
|
||||||
{"help" , "List shell built-in commands", builtin_help},
|
{"help" , "List shell built-in commands", builtin_help},
|
||||||
{NULL, NULL, NULL}
|
/* to do: add ulimit */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define VEC_SIZE(v) (sizeof(v)/sizeof(v[0]))
|
||||||
|
#define VEC_LAST(v) v[VEC_SIZE(v)-1]
|
||||||
|
|
||||||
|
|
||||||
static int shell_context; /* Type prompt trigger (PS1 or PS2) */
|
static int shell_context; /* Type prompt trigger (PS1 or PS2) */
|
||||||
|
|
||||||
@ -318,12 +318,7 @@ static int builtin_help(struct child_prog ATTRIBUTE_UNUSED *dummy)
|
|||||||
|
|
||||||
printf("\nBuilt-in commands:\n"
|
printf("\nBuilt-in commands:\n"
|
||||||
"-------------------\n");
|
"-------------------\n");
|
||||||
for (x = bltins; x->cmd; x++) {
|
for (x = bltins; x <= &VEC_LAST(bltins); x++) {
|
||||||
if (x->descr == NULL)
|
|
||||||
continue;
|
|
||||||
printf("%s\t%s\n", x->cmd, x->descr);
|
|
||||||
}
|
|
||||||
for (x = bltins_forking; x->cmd; x++) {
|
|
||||||
if (x->descr == NULL)
|
if (x->descr == NULL)
|
||||||
continue;
|
continue;
|
||||||
printf("%s\t%s\n", x->cmd, x->descr);
|
printf("%s\t%s\n", x->cmd, x->descr);
|
||||||
@ -963,7 +958,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
|
|||||||
*src == ']') *buf++ = '\\';
|
*src == ']') *buf++ = '\\';
|
||||||
*buf++ = *src;
|
*buf++ = *src;
|
||||||
} else if (isspace(*src)) {
|
} else if (isspace(*src)) {
|
||||||
if (*prog->argv[argc_l] || flag & LASH_OPT_SAW_QUOTE) {
|
if (*prog->argv[argc_l] || (flag & LASH_OPT_SAW_QUOTE)) {
|
||||||
buf++, argc_l++;
|
buf++, argc_l++;
|
||||||
/* +1 here leaves room for the NULL which ends argv */
|
/* +1 here leaves room for the NULL which ends argv */
|
||||||
if ((argc_l + 1) == argv_alloced) {
|
if ((argc_l + 1) == argv_alloced) {
|
||||||
@ -1143,19 +1138,13 @@ static int pseudo_exec(struct child_prog *child)
|
|||||||
* easier to waste a few CPU cycles than it is to figure out
|
* easier to waste a few CPU cycles than it is to figure out
|
||||||
* if this is one of those cases.
|
* if this is one of those cases.
|
||||||
*/
|
*/
|
||||||
for (x = bltins; x->cmd; x++) {
|
/* Check if the command matches any of the forking builtins. */
|
||||||
|
for (x = bltins; x <= &VEC_LAST(bltins); x++) {
|
||||||
if (strcmp(child->argv[0], x->cmd) == 0) {
|
if (strcmp(child->argv[0], x->cmd) == 0) {
|
||||||
_exit(x->function(child));
|
_exit(x->function(child));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the command matches any of the forking builtins. */
|
|
||||||
for (x = bltins_forking; x->cmd; x++) {
|
|
||||||
if (strcmp(child->argv[0], x->cmd) == 0) {
|
|
||||||
applet_name = x->cmd;
|
|
||||||
_exit(x->function(child));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if the command matches any busybox internal
|
/* Check if the command matches any busybox internal
|
||||||
* commands ("applets") here. Following discussions from
|
* commands ("applets") here. Following discussions from
|
||||||
@ -1237,22 +1226,18 @@ static int run_command(struct job *newjob, int inbg, int outpipe[2])
|
|||||||
const struct built_in_command *x;
|
const struct built_in_command *x;
|
||||||
struct child_prog *child;
|
struct child_prog *child;
|
||||||
|
|
||||||
nextin = 0, nextout = 1;
|
nextin = 0;
|
||||||
for (i = 0; i < newjob->num_progs; i++) {
|
for (i = 0; i < newjob->num_progs; i++) {
|
||||||
child = &(newjob->progs[i]);
|
child = &(newjob->progs[i]);
|
||||||
|
|
||||||
|
nextout = 1;
|
||||||
if ((i + 1) < newjob->num_progs) {
|
if ((i + 1) < newjob->num_progs) {
|
||||||
if (pipe(pipefds) < 0)
|
if (pipe(pipefds) < 0)
|
||||||
bb_perror_msg_and_die("pipe");
|
bb_perror_msg_and_die("pipe");
|
||||||
nextout = pipefds[1];
|
nextout = pipefds[1];
|
||||||
} else {
|
} else if (outpipe[1] != -1) {
|
||||||
if (outpipe[1] != -1) {
|
|
||||||
nextout = outpipe[1];
|
nextout = outpipe[1];
|
||||||
} else {
|
|
||||||
nextout = 1;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Check if the command matches any non-forking builtins,
|
/* Check if the command matches any non-forking builtins,
|
||||||
* but only if this is a simple command.
|
* but only if this is a simple command.
|
||||||
@ -1267,7 +1252,7 @@ static int run_command(struct job *newjob, int inbg, int outpipe[2])
|
|||||||
return builtin_export(child);
|
return builtin_export(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (x = bltins; x->cmd; x++) {
|
for (x = bltins; x <= &VEC_LAST(bltins); x++) {
|
||||||
if (strcmp(child->argv[0], x->cmd) == 0) {
|
if (strcmp(child->argv[0], x->cmd) == 0) {
|
||||||
int rcode;
|
int rcode;
|
||||||
int squirrel[] = {-1, -1, -1};
|
int squirrel[] = {-1, -1, -1};
|
||||||
@ -1279,7 +1264,7 @@ static int run_command(struct job *newjob, int inbg, int outpipe[2])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(__UCLIBC__) || defined(__ARCH_HAS_MMU__)
|
#if BB_MMU
|
||||||
child->pid = fork();
|
child->pid = fork();
|
||||||
#else
|
#else
|
||||||
child->pid = vfork();
|
child->pid = vfork();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user