hush: feeble attempt at making it more NOMMU-friendly
This commit is contained in:
parent
a0898170d8
commit
8412d7959a
38
shell/hush.c
38
shell/hush.c
@ -86,6 +86,15 @@ extern char **environ; /* This is in <unistd.h>, but protected with __USE_GNU */
|
|||||||
#include "busybox.h" /* for struct bb_applet */
|
#include "busybox.h" /* for struct bb_applet */
|
||||||
|
|
||||||
|
|
||||||
|
#if !BB_MMU
|
||||||
|
/* A bit drastic. Can allow some simpler commands
|
||||||
|
* by analysing command in generate_stream_from_list()
|
||||||
|
*/
|
||||||
|
#undef ENABLE_HUSH_TICK
|
||||||
|
#define ENABLE_HUSH_TICK 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* If you comment out one of these below, it will be #defined later
|
/* If you comment out one of these below, it will be #defined later
|
||||||
* to perform debug printfs to stderr: */
|
* to perform debug printfs to stderr: */
|
||||||
#define debug_printf(...) do {} while (0)
|
#define debug_printf(...) do {} while (0)
|
||||||
@ -1268,7 +1277,7 @@ static int setup_redirects(struct child_prog *prog, int squirrel[])
|
|||||||
squirrel[redir->fd] = dup(redir->fd);
|
squirrel[redir->fd] = dup(redir->fd);
|
||||||
}
|
}
|
||||||
if (openfd == -3) {
|
if (openfd == -3) {
|
||||||
close(openfd);
|
//close(openfd); // close(-3) ??!
|
||||||
} else {
|
} else {
|
||||||
dup2(openfd, redir->fd);
|
dup2(openfd, redir->fd);
|
||||||
if (redir->dup == -1)
|
if (redir->dup == -1)
|
||||||
@ -1291,8 +1300,9 @@ static void restore_redirects(int squirrel[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* never returns */
|
/* Called after [v]fork() in run_pipe_real(), or from builtin_exec().
|
||||||
/* XXX no exit() here. If you don't exec, use _exit instead.
|
* Never returns.
|
||||||
|
* XXX no exit() here. If you don't exec, use _exit instead.
|
||||||
* The at_exit handlers apparently confuse the calling process,
|
* The at_exit handlers apparently confuse the calling process,
|
||||||
* in particular stdin handling. Not sure why? -- because of vfork! (vda) */
|
* in particular stdin handling. Not sure why? -- because of vfork! (vda) */
|
||||||
static void pseudo_exec_argv(char **argv)
|
static void pseudo_exec_argv(char **argv)
|
||||||
@ -1359,6 +1369,8 @@ static void pseudo_exec_argv(char **argv)
|
|||||||
_exit(1);
|
_exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Called after [v]fork() in run_pipe_real()
|
||||||
|
*/
|
||||||
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
|
// FIXME: buggy wrt NOMMU! Must not modify any global data
|
||||||
@ -1370,7 +1382,9 @@ static void pseudo_exec(struct child_prog *child)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (child->group) {
|
if (child->group) {
|
||||||
// FIXME: do not modify globals! Think vfork!
|
#if !BB_MMU
|
||||||
|
bb_error_msg_and_exit("nested lists are not supported on NOMMU");
|
||||||
|
#else
|
||||||
#if ENABLE_HUSH_INTERACTIVE
|
#if ENABLE_HUSH_INTERACTIVE
|
||||||
debug_printf_exec("pseudo_exec: setting interactive_fd=0\n");
|
debug_printf_exec("pseudo_exec: setting interactive_fd=0\n");
|
||||||
interactive_fd = 0; /* crucial!!!! */
|
interactive_fd = 0; /* crucial!!!! */
|
||||||
@ -1380,6 +1394,7 @@ static void pseudo_exec(struct child_prog *child)
|
|||||||
/* OK to leak memory by not calling free_pipe_list,
|
/* OK to leak memory by not calling free_pipe_list,
|
||||||
* since this process is about to exit */
|
* since this process is about to exit */
|
||||||
_exit(rcode);
|
_exit(rcode);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Can happen. See what bash does with ">foo" by itself. */
|
/* Can happen. See what bash does with ">foo" by itself. */
|
||||||
@ -1787,14 +1802,8 @@ static int run_pipe_real(struct pipe *pi)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* in non-interactive case fatal sigs are already SIG_DFL */
|
/* in non-interactive case fatal sigs are already SIG_DFL */
|
||||||
if (nextin != 0) {
|
xmove_fd(nextin, 0);
|
||||||
dup2(nextin, 0);
|
xmove_fd(nextout, 1);
|
||||||
close(nextin);
|
|
||||||
}
|
|
||||||
if (nextout != 1) {
|
|
||||||
dup2(nextout, 1);
|
|
||||||
close(nextout);
|
|
||||||
}
|
|
||||||
if (pipefds[0] != -1) {
|
if (pipefds[0] != -1) {
|
||||||
close(pipefds[0]); /* opposite end of our output pipe */
|
close(pipefds[0]); /* opposite end of our output pipe */
|
||||||
}
|
}
|
||||||
@ -3084,17 +3093,14 @@ static int redirect_opt_num(o_string *o)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE_HUSH_TICK
|
#if ENABLE_HUSH_TICK
|
||||||
|
/* NB: currently disabled on NOMMU */
|
||||||
static FILE *generate_stream_from_list(struct pipe *head)
|
static FILE *generate_stream_from_list(struct pipe *head)
|
||||||
{
|
{
|
||||||
FILE *pf;
|
FILE *pf;
|
||||||
int pid, channel[2];
|
int pid, channel[2];
|
||||||
|
|
||||||
xpipe(channel);
|
xpipe(channel);
|
||||||
#if BB_MMU
|
|
||||||
pid = fork();
|
pid = fork();
|
||||||
#else
|
|
||||||
pid = vfork();
|
|
||||||
#endif
|
|
||||||
if (pid < 0) {
|
if (pid < 0) {
|
||||||
bb_perror_msg_and_die("fork");
|
bb_perror_msg_and_die("fork");
|
||||||
} else if (pid == 0) {
|
} else if (pid == 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user