Support disabling pipe and redirect support
This commit is contained in:
parent
a0e4c3f119
commit
ff9ad47d79
49
shell/lash.c
49
shell/lash.c
@ -56,14 +56,18 @@
|
||||
#include <glob.h>
|
||||
#define expand_t glob_t
|
||||
|
||||
/* Always enable for the moment... */
|
||||
#define CONFIG_LASH_PIPE_N_REDIRECTS
|
||||
|
||||
static const int MAX_READ = 128; /* size of input buffer for `read' builtin */
|
||||
#define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n"
|
||||
|
||||
|
||||
#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
|
||||
enum redir_type { REDIRECT_INPUT, REDIRECT_OVERWRITE,
|
||||
REDIRECT_APPEND
|
||||
};
|
||||
#endif
|
||||
|
||||
static const unsigned int DEFAULT_CONTEXT=0x1;
|
||||
static const unsigned int IF_TRUE_CONTEXT=0x2;
|
||||
@ -71,25 +75,28 @@ static const unsigned int IF_FALSE_CONTEXT=0x4;
|
||||
static const unsigned int THEN_EXP_CONTEXT=0x8;
|
||||
static const unsigned int ELSE_EXP_CONTEXT=0x10;
|
||||
|
||||
|
||||
struct jobset {
|
||||
struct job *head; /* head of list of running jobs */
|
||||
struct job *fg; /* current foreground job */
|
||||
};
|
||||
|
||||
#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
|
||||
struct redir_struct {
|
||||
enum redir_type type; /* type of redirection */
|
||||
int fd; /* file descriptor being redirected */
|
||||
char *filename; /* file to redirect fd to */
|
||||
};
|
||||
#endif
|
||||
|
||||
struct child_prog {
|
||||
pid_t pid; /* 0 if exited */
|
||||
char **argv; /* program name and arguments */
|
||||
int num_redirects; /* elements in redirection array */
|
||||
struct redir_struct *redirects; /* I/O redirects */
|
||||
int is_stopped; /* is the program currently running? */
|
||||
struct job *family; /* pointer back to the child's parent job */
|
||||
#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
|
||||
struct redir_struct *redirects; /* I/O redirects */
|
||||
#endif
|
||||
};
|
||||
|
||||
struct jobset {
|
||||
struct job *head; /* head of list of running jobs */
|
||||
struct job *fg; /* current foreground job */
|
||||
};
|
||||
|
||||
struct job {
|
||||
@ -514,8 +521,10 @@ static void free_job(struct job *cmd)
|
||||
|
||||
for (i = 0; i < cmd->num_progs; i++) {
|
||||
free(cmd->progs[i].argv);
|
||||
#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
|
||||
if (cmd->progs[i].redirects)
|
||||
free(cmd->progs[i].redirects);
|
||||
#endif
|
||||
}
|
||||
free(cmd->progs);
|
||||
free(cmd->text);
|
||||
@ -601,6 +610,7 @@ static void checkjobs(struct jobset *j_list)
|
||||
bb_perror_msg("waitpid");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
|
||||
/* squirrel != NULL means we squirrel away copies of stdin, stdout,
|
||||
* and stderr if they are redirected. */
|
||||
static int setup_redirects(struct child_prog *prog, int squirrel[])
|
||||
@ -656,6 +666,15 @@ static void restore_redirects(int squirrel[])
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline int setup_redirects(struct child_prog *prog, int squirrel[])
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void restore_redirects(int squirrel[])
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void cmdedit_set_initial_prompt(void)
|
||||
{
|
||||
@ -953,14 +972,18 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
|
||||
{
|
||||
char *command;
|
||||
char *return_command = NULL;
|
||||
char *src, *buf, *chptr;
|
||||
char *src, *buf;
|
||||
int argc_l = 0;
|
||||
int done = 0;
|
||||
int argv_alloced;
|
||||
int i, saw_quote = 0;
|
||||
int saw_quote = 0;
|
||||
char quote = '\0';
|
||||
int count;
|
||||
struct child_prog *prog;
|
||||
#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
|
||||
int i;
|
||||
char *chptr;
|
||||
#endif
|
||||
|
||||
/* skip leading white space */
|
||||
while (**command_ptr && isspace(**command_ptr))
|
||||
@ -988,9 +1011,11 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
|
||||
|
||||
prog = job->progs;
|
||||
prog->num_redirects = 0;
|
||||
prog->redirects = NULL;
|
||||
prog->is_stopped = 0;
|
||||
prog->family = job;
|
||||
#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
|
||||
prog->redirects = NULL;
|
||||
#endif
|
||||
|
||||
argv_alloced = 5;
|
||||
prog->argv = xmalloc(sizeof(*prog->argv) * argv_alloced);
|
||||
@ -1046,6 +1071,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
|
||||
done = 1;
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
|
||||
case '>': /* redirects */
|
||||
case '<':
|
||||
i = prog->num_redirects++;
|
||||
@ -1143,6 +1169,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
|
||||
src--; /* we'll ++ it at the end of the loop */
|
||||
|
||||
break;
|
||||
#endif
|
||||
|
||||
case '&': /* background */
|
||||
*inbg = 1;
|
||||
@ -1336,8 +1363,8 @@ static int run_command(struct job *newjob, int inbg, int outpipe[2])
|
||||
if (newjob->num_progs == 1) {
|
||||
for (x = bltins; x->cmd; x++) {
|
||||
if (strcmp(child->argv[0], x->cmd) == 0 ) {
|
||||
int squirrel[] = {-1, -1, -1};
|
||||
int rcode;
|
||||
int squirrel[] = {-1, -1, -1};
|
||||
setup_redirects(child, squirrel);
|
||||
rcode = x->function(child);
|
||||
restore_redirects(squirrel);
|
||||
|
Loading…
x
Reference in New Issue
Block a user