Remove trailing whitespace. Update copyright to include 2004.
This commit is contained in:
@ -41,7 +41,7 @@ config CONFIG_ASH
|
||||
the most complete and most pedantically correct shell included with
|
||||
busybox. This shell is actually a derivative of the Debian 'dash'
|
||||
shell (by Herbert Xu), which was created by porting the 'ash' shell
|
||||
(written by Kenneth Almquist) from NetBSD.
|
||||
(written by Kenneth Almquist) from NetBSD.
|
||||
|
||||
comment "Ash Shell Options"
|
||||
depends on CONFIG_ASH
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Makefile for busybox
|
||||
#
|
||||
# Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org>
|
||||
# Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Makefile for busybox
|
||||
#
|
||||
# Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org>
|
||||
# Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
@ -7615,7 +7615,7 @@ cmdputs(const char *s)
|
||||
int quoted = 0;
|
||||
static const char *const vstype[16] = {
|
||||
nullstr, "}", "-", "+", "?", "=",
|
||||
"%", "%%", "#", "##", nullstr
|
||||
"%", "%%", "#", "##", nullstr
|
||||
};
|
||||
|
||||
nextc = makestrspace((strlen(s) + 1) * 8, cmdnextc);
|
||||
|
112
shell/hush.c
112
shell/hush.c
@ -12,7 +12,7 @@
|
||||
* written Dec 2000 and Jan 2001 by Larry Doolittle. The
|
||||
* execution engine, the builtins, and much of the underlying
|
||||
* support has been adapted from busybox-0.49pre's lash, which is
|
||||
* Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org>
|
||||
* Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
|
||||
* written by Erik Andersen <andersen@codepoet.org>. That, in turn,
|
||||
* is based in part on ladsh.c, by Michael K. Johnson and Erik W.
|
||||
* Troan, which they placed in the public domain. I don't know
|
||||
@ -197,7 +197,7 @@ struct redir_struct {
|
||||
redir_type type; /* type of redirection */
|
||||
int fd; /* file descriptor being redirected */
|
||||
int dup; /* -1, or file descriptor being duplicated */
|
||||
struct redir_struct *next; /* pointer to the next redirect in the list */
|
||||
struct redir_struct *next; /* pointer to the next redirect in the list */
|
||||
glob_t word; /* *word.gl_pathv is the filename */
|
||||
};
|
||||
|
||||
@ -248,7 +248,7 @@ char **global_argv;
|
||||
unsigned int global_argc;
|
||||
unsigned int last_return_code;
|
||||
extern char **environ; /* This is in <unistd.h>, but protected with __USE_GNU */
|
||||
|
||||
|
||||
/* "globals" within this file */
|
||||
static char *ifs;
|
||||
static char map[256];
|
||||
@ -421,7 +421,7 @@ static struct built_in_command bltins[] = {
|
||||
{"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},
|
||||
{"exec", "Exec command, replacing this shell with the exec'd process",
|
||||
{"exec", "Exec command, replacing this shell with the exec'd process",
|
||||
builtin_exec},
|
||||
{"exit", "Exit from shell()", builtin_exit},
|
||||
{"export", "Set environment variable", builtin_export},
|
||||
@ -456,10 +456,10 @@ static int builtin_eval(struct child_prog *child)
|
||||
{
|
||||
char *str = NULL;
|
||||
int rcode = EXIT_SUCCESS;
|
||||
|
||||
|
||||
if (child->argv[1]) {
|
||||
str = make_string(child->argv + 1);
|
||||
parse_string_outer(str, FLAG_EXIT_FROM_LOOP |
|
||||
parse_string_outer(str, FLAG_EXIT_FROM_LOOP |
|
||||
FLAG_PARSE_SEMICOLON);
|
||||
free(str);
|
||||
rcode = last_return_code;
|
||||
@ -873,7 +873,7 @@ static inline void cmdedit_set_initial_prompt(void)
|
||||
PS1 = getenv("PS1");
|
||||
if(PS1==0)
|
||||
PS1 = "\\w \\$ ";
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void setup_prompt_string(int promptmode, char **prompt_str)
|
||||
@ -919,7 +919,7 @@ static void get_user_input(struct in_str *i)
|
||||
i->p = the_command;
|
||||
}
|
||||
|
||||
/* This is the magic location that prints prompts
|
||||
/* This is the magic location that prints prompts
|
||||
* and gets data back from the user */
|
||||
static int file_get(struct in_str *i)
|
||||
{
|
||||
@ -1110,14 +1110,14 @@ static void pseudo_exec(struct child_prog *child)
|
||||
}
|
||||
|
||||
/* Check if the command matches any busybox internal commands
|
||||
* ("applets") here.
|
||||
* ("applets") here.
|
||||
* FIXME: This feature is not 100% safe, since
|
||||
* BusyBox is not fully reentrant, so we have no guarantee the things
|
||||
* from the .bss are still zeroed, or that things from .data are still
|
||||
* at their defaults. We could exec ourself from /proc/self/exe, but I
|
||||
* really dislike relying on /proc for things. We could exec ourself
|
||||
* from global_argv[0], but if we are in a chroot, we may not be able
|
||||
* to find ourself... */
|
||||
* to find ourself... */
|
||||
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||
{
|
||||
int argc_l;
|
||||
@ -1196,7 +1196,7 @@ static void insert_bg_job(struct pipe *pi)
|
||||
}
|
||||
}
|
||||
|
||||
/* we don't wait for background thejobs to return -- append it
|
||||
/* we don't wait for background thejobs to return -- append it
|
||||
to the list of backgrounded thejobs and leave it alone */
|
||||
printf("[%d] %d\n", thejob->jobid, thejob->progs[0].pid);
|
||||
last_bg_pid = thejob->progs[0].pid;
|
||||
@ -1226,7 +1226,7 @@ static void remove_bg_job(struct pipe *pi)
|
||||
free(pi);
|
||||
}
|
||||
|
||||
/* Checks to see if any processes have exited -- if they
|
||||
/* Checks to see if any processes have exited -- if they
|
||||
have, figure out why and see if a job has completed */
|
||||
static int checkjobs(struct pipe* fg_pipe)
|
||||
{
|
||||
@ -1246,7 +1246,7 @@ static int checkjobs(struct pipe* fg_pipe)
|
||||
int i, rcode = 0;
|
||||
for (i=0; i < fg_pipe->num_progs; i++) {
|
||||
if (fg_pipe->progs[i].pid == childpid) {
|
||||
if (i==fg_pipe->num_progs-1)
|
||||
if (i==fg_pipe->num_progs-1)
|
||||
rcode=WEXITSTATUS(status);
|
||||
(fg_pipe->num_progs)--;
|
||||
return(rcode);
|
||||
@ -1289,7 +1289,7 @@ static int checkjobs(struct pipe* fg_pipe)
|
||||
if (pi->stopped_progs == pi->num_progs) {
|
||||
printf("\n"JOB_STATUS_FORMAT, pi->jobid, "Stopped", pi->text);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -1378,7 +1378,7 @@ static int run_pipe_real(struct pipe *pi)
|
||||
/* Ok, this case is tricky. We have to decide if this is a
|
||||
* local variable, or an already exported variable. If it is
|
||||
* already exported, we have to export the new value. If it is
|
||||
* not exported, we need only set this as a local variable.
|
||||
* not exported, we need only set this as a local variable.
|
||||
* This junk is all to decide whether or not to export this
|
||||
* variable. */
|
||||
int export_me=0;
|
||||
@ -1408,7 +1408,7 @@ static int run_pipe_real(struct pipe *pi)
|
||||
}
|
||||
if (child->sp) {
|
||||
char * str = NULL;
|
||||
|
||||
|
||||
str = make_string((child->argv + i));
|
||||
parse_string_outer(str, FLAG_EXIT_FROM_LOOP | FLAG_REPARSING);
|
||||
free(str);
|
||||
@ -1454,7 +1454,7 @@ static int run_pipe_real(struct pipe *pi)
|
||||
#if !defined(__UCLIBC__) || defined(__UCLIBC_HAS_MMU__)
|
||||
if (!(child->pid = fork()))
|
||||
#else
|
||||
if (!(child->pid = vfork()))
|
||||
if (!(child->pid = vfork()))
|
||||
#endif
|
||||
{
|
||||
/* Set the handling for job control signals back to the default. */
|
||||
@ -1465,7 +1465,7 @@ static int run_pipe_real(struct pipe *pi)
|
||||
signal(SIGTTIN, SIG_DFL);
|
||||
signal(SIGTTOU, SIG_DFL);
|
||||
signal(SIGCHLD, SIG_DFL);
|
||||
|
||||
|
||||
close_all();
|
||||
|
||||
if (nextin != 0) {
|
||||
@ -1497,7 +1497,7 @@ static int run_pipe_real(struct pipe *pi)
|
||||
|
||||
pseudo_exec(child);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* put our child in the process group whose leader is the
|
||||
first process in this pipe */
|
||||
@ -1513,7 +1513,7 @@ static int run_pipe_real(struct pipe *pi)
|
||||
if (nextout != 1)
|
||||
close(nextout);
|
||||
|
||||
/* If there isn't another process, nextin is garbage
|
||||
/* If there isn't another process, nextin is garbage
|
||||
but it doesn't matter */
|
||||
nextin = pipefds[0];
|
||||
}
|
||||
@ -1539,12 +1539,12 @@ static int run_list_real(struct pipe *pi)
|
||||
(rpipe->next == NULL)) {
|
||||
syntax();
|
||||
return 1;
|
||||
}
|
||||
if ((rpipe->r_mode == RES_IN &&
|
||||
(rpipe->next->r_mode == RES_IN &&
|
||||
}
|
||||
if ((rpipe->r_mode == RES_IN &&
|
||||
(rpipe->next->r_mode == RES_IN &&
|
||||
rpipe->next->progs->argv != NULL))||
|
||||
(rpipe->r_mode == RES_FOR &&
|
||||
rpipe->next->r_mode != RES_IN)) {
|
||||
rpipe->next->r_mode != RES_IN)) {
|
||||
syntax();
|
||||
return 1;
|
||||
}
|
||||
@ -1572,7 +1572,7 @@ static int run_list_real(struct pipe *pi)
|
||||
if (rmode == RES_ELIF && !if_code) continue;
|
||||
if (rmode == RES_FOR && pi->num_progs) {
|
||||
if (!list) {
|
||||
/* if no variable values after "in" we skip "for" */
|
||||
/* if no variable values after "in" we skip "for" */
|
||||
if (!pi->next->progs->argv) continue;
|
||||
/* create list of variable values */
|
||||
list = make_list_in(pi->next->progs->argv,
|
||||
@ -1581,7 +1581,7 @@ static int run_list_real(struct pipe *pi)
|
||||
save_name = pi->progs->argv[0];
|
||||
pi->progs->argv[0] = NULL;
|
||||
flag_rep = 1;
|
||||
}
|
||||
}
|
||||
if (!(*list)) {
|
||||
free(pi->progs->argv[0]);
|
||||
free(save_list);
|
||||
@ -1591,26 +1591,26 @@ static int run_list_real(struct pipe *pi)
|
||||
pi->progs->glob_result.gl_pathv[0] =
|
||||
pi->progs->argv[0];
|
||||
continue;
|
||||
} else {
|
||||
} else {
|
||||
/* insert new value from list for variable */
|
||||
if (pi->progs->argv[0])
|
||||
if (pi->progs->argv[0])
|
||||
free(pi->progs->argv[0]);
|
||||
pi->progs->argv[0] = *list++;
|
||||
pi->progs->glob_result.gl_pathv[0] =
|
||||
pi->progs->argv[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rmode == RES_IN) continue;
|
||||
if (rmode == RES_DO) {
|
||||
if (!flag_rep) continue;
|
||||
}
|
||||
}
|
||||
if ((rmode == RES_DONE)) {
|
||||
if (flag_rep) {
|
||||
flag_restore = 1;
|
||||
} else {
|
||||
rpipe = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (pi->num_progs == 0) continue;
|
||||
save_num_progs = pi->num_progs; /* save number of programs */
|
||||
rcode = run_pipe_real(pi);
|
||||
@ -1642,9 +1642,9 @@ static int run_list_real(struct pipe *pi)
|
||||
pi->num_progs = save_num_progs; /* restore number of programs */
|
||||
if ( rmode == RES_IF || rmode == RES_ELIF )
|
||||
next_if_code=rcode; /* can be overwritten a number of times */
|
||||
if (rmode == RES_WHILE)
|
||||
if (rmode == RES_WHILE)
|
||||
flag_rep = !last_return_code;
|
||||
if (rmode == RES_UNTIL)
|
||||
if (rmode == RES_UNTIL)
|
||||
flag_rep = last_return_code;
|
||||
if ( (rcode==EXIT_SUCCESS && pi->followup==PIPE_OR) ||
|
||||
(rcode!=EXIT_SUCCESS && pi->followup==PIPE_AND) )
|
||||
@ -1723,7 +1723,7 @@ static int free_pipe_list(struct pipe *head, int indent)
|
||||
pi->next=NULL;
|
||||
free(pi);
|
||||
}
|
||||
return rcode;
|
||||
return rcode;
|
||||
}
|
||||
|
||||
/* Select which version we will use */
|
||||
@ -1732,7 +1732,7 @@ static int run_list(struct pipe *pi)
|
||||
int rcode=0;
|
||||
if (fake_mode==0) {
|
||||
rcode = run_list_real(pi);
|
||||
}
|
||||
}
|
||||
/* free_pipe_list has the side effect of clearing memory
|
||||
* In the long run that function can be merged with run_list_real,
|
||||
* but doing that now would hobble the debugging effort. */
|
||||
@ -1862,7 +1862,7 @@ static int set_local_var(const char *s, int flg_export)
|
||||
|
||||
/* Assume when we enter this function that we are already in
|
||||
* NAME=VALUE format. So the first order of business is to
|
||||
* split 's' on the '=' into 'name' and 'value' */
|
||||
* split 's' on the '=' into 'name' and 'value' */
|
||||
value = strchr(name, '=');
|
||||
if (value==0 && ++value==0) {
|
||||
free(name);
|
||||
@ -1991,7 +1991,7 @@ static int setup_redirect(struct p_context *ctx, int fd, redir_type style,
|
||||
|
||||
debug_printf("Redirect type %d%s\n", redir->fd, redir_table[style].descrip);
|
||||
|
||||
/* Check for a '2>&1' type redirect */
|
||||
/* Check for a '2>&1' type redirect */
|
||||
redir->dup = redirect_dup_num(input);
|
||||
if (redir->dup == -2) return 1; /* syntax error */
|
||||
if (redir->dup != -1) {
|
||||
@ -2377,9 +2377,9 @@ static int parse_group(o_string *dest, struct p_context *ctx,
|
||||
static char *lookup_param(char *src)
|
||||
{
|
||||
char *p=NULL;
|
||||
if (src) {
|
||||
if (src) {
|
||||
p = getenv(src);
|
||||
if (!p)
|
||||
if (!p)
|
||||
p = get_local_var(src);
|
||||
}
|
||||
return p;
|
||||
@ -2499,7 +2499,7 @@ int parse_stream(o_string *dest, struct p_context *ctx,
|
||||
if (m==2) { /* unquoted IFS */
|
||||
if (done_word(dest, ctx)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* If we aren't performing a substitution, treat a newline as a
|
||||
* command separator. */
|
||||
if (end_trigger != '\0' && ch=='\n')
|
||||
@ -2624,7 +2624,7 @@ int parse_stream(o_string *dest, struct p_context *ctx,
|
||||
}
|
||||
/* complain if quote? No, maybe we just finished a command substitution
|
||||
* that was quoted. Example:
|
||||
* $ echo "`cat foo` plus more"
|
||||
* $ echo "`cat foo` plus more"
|
||||
* and we just got the EOF generated by the subshell that ran "cat foo"
|
||||
* The only real complaint is if we got an EOF when end_trigger != '\0',
|
||||
* that is, we were really supposed to get end_trigger, and never got
|
||||
@ -2684,7 +2684,7 @@ int parse_stream_outer(struct in_str *inp, int flag)
|
||||
if (ctx.old_flag != 0) {
|
||||
free(ctx.stack);
|
||||
b_reset(&temp);
|
||||
}
|
||||
}
|
||||
temp.nonnull = 0;
|
||||
temp.quote = 0;
|
||||
inp->p = NULL;
|
||||
@ -2748,9 +2748,9 @@ int hush_main(int argc, char **argv)
|
||||
/* XXX what should these be while sourcing /etc/profile? */
|
||||
global_argc = argc;
|
||||
global_argv = argv;
|
||||
|
||||
|
||||
/* (re?) initialize globals. Sometimes hush_main() ends up calling
|
||||
* hush_main(), therefore we cannot rely on the BSS to zero out this
|
||||
* hush_main(), therefore we cannot rely on the BSS to zero out this
|
||||
* stuff. Reset these to 0 every time. */
|
||||
ifs = NULL;
|
||||
/* map[] is taken care of with call to update_ifs_map() */
|
||||
@ -2770,7 +2770,7 @@ int hush_main(int argc, char **argv)
|
||||
#endif
|
||||
PS2 = "> ";
|
||||
|
||||
/* initialize our shell local variables with the values
|
||||
/* initialize our shell local variables with the values
|
||||
* currently living in the environment */
|
||||
if (e) {
|
||||
for (; *e; e++)
|
||||
@ -2790,7 +2790,7 @@ int hush_main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
input=stdin;
|
||||
|
||||
|
||||
while ((opt = getopt(argc, argv, "c:xif")) > 0) {
|
||||
switch (opt) {
|
||||
case 'c':
|
||||
@ -2832,13 +2832,13 @@ int hush_main(int argc, char **argv)
|
||||
debug_printf("\ninteractive=%d\n", interactive);
|
||||
if (interactive) {
|
||||
/* Looks like they want an interactive shell */
|
||||
#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
|
||||
#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
|
||||
printf( "\n\n" BB_BANNER " hush - the humble shell v0.01 (testing)\n");
|
||||
printf( "Enter 'help' for a list of built-in commands.\n\n");
|
||||
#endif
|
||||
setup_job_control();
|
||||
}
|
||||
|
||||
|
||||
if (argv[optind]==NULL) {
|
||||
opt=parse_file_outer(stdin);
|
||||
goto final_return;
|
||||
@ -2877,7 +2877,7 @@ static char *insert_var_value(char *inp)
|
||||
int len;
|
||||
int done = 0;
|
||||
char *p, *p1, *res_str = NULL;
|
||||
|
||||
|
||||
while ((p = strchr(inp, SPECIAL_VAR_SYMBOL))) {
|
||||
if (p != inp) {
|
||||
len = p - inp;
|
||||
@ -2893,7 +2893,7 @@ static char *insert_var_value(char *inp)
|
||||
res_str = xrealloc(res_str, (1 + len));
|
||||
strcpy((res_str + res_str_len), p1);
|
||||
res_str_len = len;
|
||||
}
|
||||
}
|
||||
*p = SPECIAL_VAR_SYMBOL;
|
||||
inp = ++p;
|
||||
done = 1;
|
||||
@ -2915,8 +2915,8 @@ static char **make_list_in(char **inp, char *name)
|
||||
int n = 0;
|
||||
char **list;
|
||||
char *p1, *p2, *p3;
|
||||
|
||||
/* create list of variable values */
|
||||
|
||||
/* create list of variable values */
|
||||
list = xmalloc(sizeof(*list));
|
||||
for (i = 0; inp[i]; i++) {
|
||||
p3 = insert_var_value(inp[i]);
|
||||
@ -2928,13 +2928,13 @@ static char **make_list_in(char **inp, char *name)
|
||||
}
|
||||
if ((p2 = strchr(p1, ' '))) {
|
||||
len = p2 - p1;
|
||||
} else {
|
||||
} else {
|
||||
len = strlen(p1);
|
||||
p2 = p1 + len;
|
||||
}
|
||||
/* we use n + 2 in realloc for list,because we add
|
||||
/* we use n + 2 in realloc for list,because we add
|
||||
* new element and then we will add NULL element */
|
||||
list = xrealloc(list, sizeof(*list) * (n + 2));
|
||||
list = xrealloc(list, sizeof(*list) * (n + 2));
|
||||
list[n] = xmalloc(2 + name_len + len);
|
||||
strcpy(list[n], name);
|
||||
strcat(list[n], "=");
|
||||
@ -2946,7 +2946,7 @@ static char **make_list_in(char **inp, char *name)
|
||||
}
|
||||
list[n] = NULL;
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
||||
/* Make new string for parser */
|
||||
static char * make_string(char ** inp)
|
||||
|
@ -2,7 +2,7 @@
|
||||
/*
|
||||
* lash -- the BusyBox Lame-Ass SHell
|
||||
*
|
||||
* Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org>
|
||||
* Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
|
||||
*
|
||||
* Based in part on ladsh.c by Michael K. Johnson and Erik W. Troan, which is
|
||||
* under the following liberal license: "We have placed this source code in the
|
||||
@ -927,7 +927,7 @@ static int expand_arguments(char *command)
|
||||
|
||||
}
|
||||
if (var) {
|
||||
/* a single character construction was found, and
|
||||
/* a single character construction was found, and
|
||||
* already handled in the case statement */
|
||||
src=dst+2;
|
||||
} else {
|
||||
@ -1093,7 +1093,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
|
||||
|
||||
prog->redirects[i].fd = -1;
|
||||
if (buf != prog->argv[argc_l]) {
|
||||
/* the stuff before this character may be the file number
|
||||
/* the stuff before this character may be the file number
|
||||
being redirected */
|
||||
prog->redirects[i].fd =
|
||||
strtol(prog->argv[argc_l], &chptr, 10);
|
||||
|
54
shell/msh.c
54
shell/msh.c
@ -23,7 +23,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*
|
||||
* Original copyright notice is retained at the end of this file.
|
||||
*/
|
||||
|
||||
@ -770,7 +770,7 @@ extern int msh_main(int argc, char **argv)
|
||||
if (--argc > 0)
|
||||
PUSHIO(aword, *++argv, iof = nlchar);
|
||||
break;
|
||||
|
||||
|
||||
case 'q':
|
||||
qflag = SIG_DFL;
|
||||
break;
|
||||
@ -784,7 +784,7 @@ extern int msh_main(int argc, char **argv)
|
||||
setval(prompt, "");
|
||||
iof = linechar;
|
||||
break;
|
||||
|
||||
|
||||
case 'i':
|
||||
interactive++;
|
||||
default:
|
||||
@ -809,7 +809,7 @@ extern int msh_main(int argc, char **argv)
|
||||
PUSHIO(afile, 0, iof);
|
||||
if (isatty(0) && isatty(1) && !cflag) {
|
||||
interactive++;
|
||||
#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
|
||||
#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
|
||||
printf( "\n\n" BB_BANNER " Built-in shell (msh)\n");
|
||||
printf( "Enter 'help' for a list of built-in commands.\n\n");
|
||||
#endif
|
||||
@ -838,7 +838,7 @@ extern int msh_main(int argc, char **argv)
|
||||
ap++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
setval(lookup("#"), putn((--dolc < 0) ? (dolc = 0) : dolc));
|
||||
|
||||
for (;;) {
|
||||
@ -2303,7 +2303,7 @@ int act;
|
||||
#if __GNUC__
|
||||
/* Avoid longjmp clobbering */
|
||||
(void) ℘
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
if (t == NULL)
|
||||
@ -2318,7 +2318,7 @@ int act;
|
||||
case TPAREN:
|
||||
rv = execute(t->left, pin, pout, 0);
|
||||
break;
|
||||
|
||||
|
||||
case TCOM:
|
||||
{
|
||||
int child;
|
||||
@ -2395,7 +2395,7 @@ int act;
|
||||
} else {
|
||||
i = -1;
|
||||
while (*wp++ != NULL)
|
||||
;
|
||||
;
|
||||
}
|
||||
vp = lookup(t->str);
|
||||
while (setjmp(bc.brkpt))
|
||||
@ -2497,7 +2497,7 @@ forkexec( register struct op *t, int *pin, int *pout, int act, char **wp, int *p
|
||||
(void) &cp;
|
||||
(void) &resetsig;
|
||||
(void) &owp;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
owp = wp;
|
||||
resetsig = 0;
|
||||
@ -2532,7 +2532,7 @@ forkexec( register struct op *t, int *pin, int *pout, int act, char **wp, int *p
|
||||
hintr = intr;
|
||||
hbrklist = brklist;
|
||||
hexecflg = execflg;
|
||||
|
||||
|
||||
i = vfork();
|
||||
if (i != 0) {
|
||||
/* who wrote this crappy non vfork safe shit? */
|
||||
@ -2563,7 +2563,7 @@ forkexec( register struct op *t, int *pin, int *pout, int act, char **wp, int *p
|
||||
(*pforked)++;
|
||||
brklist = 0;
|
||||
execflg = 0;
|
||||
}
|
||||
}
|
||||
if (owp != NULL)
|
||||
while ((cp = *owp++) != NULL && assign(cp, COPYV))
|
||||
if (shcom == NULL)
|
||||
@ -2841,7 +2841,7 @@ char *c, **v, **envp;
|
||||
#endif
|
||||
optind = 1;
|
||||
if (find_applet_by_name(name)) {
|
||||
/* We have to exec here since we vforked. Running
|
||||
/* We have to exec here since we vforked. Running
|
||||
* run_applet_by_name() won't work and bad things
|
||||
* will happen. */
|
||||
execve("/proc/self/exe", v, envp);
|
||||
@ -2964,8 +2964,8 @@ static int dohelp(struct op *t )
|
||||
for (i=0, applet = applets; i < NUM_APPLETS; applet++, i++) {
|
||||
if (!applet->name)
|
||||
continue;
|
||||
|
||||
col += printf("%s%s", ((col == 0) ? "\t" : " "),
|
||||
|
||||
col += printf("%s%s", ((col == 0) ? "\t" : " "),
|
||||
applet->name);
|
||||
if (col > 60) {
|
||||
printf("\n");
|
||||
@ -3194,7 +3194,7 @@ register struct op *t;
|
||||
if (n == SIGINT)
|
||||
setsig(n, onintr);
|
||||
else
|
||||
setsig(n, n == SIGQUIT ? SIG_IGN
|
||||
setsig(n, n == SIGQUIT ? SIG_IGN
|
||||
: SIG_DFL);
|
||||
else
|
||||
setsig(n, SIG_DFL);
|
||||
@ -3784,7 +3784,7 @@ int quoted;
|
||||
/* Avoid longjmp clobbering */
|
||||
(void) &cp;
|
||||
#endif
|
||||
|
||||
|
||||
for (cp = e.iop->argp->aword; *cp != '`'; cp++)
|
||||
if (*cp == 0) {
|
||||
err("no closing `");
|
||||
@ -3837,7 +3837,7 @@ int quoted;
|
||||
err("unclosed ${\n");
|
||||
return(0);
|
||||
}
|
||||
if (operator) {
|
||||
if (operator) {
|
||||
src++;
|
||||
while (*src && (*src != '}')) {
|
||||
alt_value[alt_index++] = *src++;
|
||||
@ -3875,7 +3875,7 @@ int quoted;
|
||||
}
|
||||
}
|
||||
*dest = '\0';
|
||||
|
||||
|
||||
if (openpipe(pf) < 0)
|
||||
return(0);
|
||||
while ((i = vfork()) == -1 && errno == EAGAIN)
|
||||
@ -3897,7 +3897,7 @@ int quoted;
|
||||
for (j=0; j<=_NSIG; j++)
|
||||
if (ourtrap[j] && signal(j, SIG_IGN) != SIG_IGN)
|
||||
signal(j, SIG_DFL);
|
||||
|
||||
|
||||
dup2(pf[1], 1);
|
||||
closepipe(pf);
|
||||
|
||||
@ -4121,7 +4121,7 @@ register struct wdblock *wb;
|
||||
wb->w_words[wb->w_nword++] = wd;
|
||||
return(wb);
|
||||
}
|
||||
static
|
||||
static
|
||||
char **
|
||||
getwords(wb)
|
||||
register struct wdblock *wb;
|
||||
@ -4557,7 +4557,7 @@ register struct ioarg *ap;
|
||||
c = mycommand[position];
|
||||
position++;
|
||||
return(c);
|
||||
} else
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
i = safe_read(ap->afile, &c, sizeof(c));
|
||||
@ -4858,7 +4858,7 @@ int xdoll;
|
||||
char c;
|
||||
char tname[30] = ".msh_XXXXXX";
|
||||
jmp_buf ev;
|
||||
|
||||
|
||||
tf = mkstemp(tname);
|
||||
if (tf < 0)
|
||||
return (-1);
|
||||
@ -4917,24 +4917,24 @@ int area;
|
||||
/*
|
||||
* Copyright (c) 1987,1997, Prentice Hall
|
||||
* All rights reserved.
|
||||
*
|
||||
*
|
||||
* Redistribution and use of the MINIX operating system in source and
|
||||
* binary forms, with or without modification, are permitted provided
|
||||
* that the following conditions are met:
|
||||
*
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
*
|
||||
* Neither the name of Prentice Hall nor the names of the software
|
||||
* authors or contributors may be used to endorse or promote
|
||||
* products derived from this software without specific prior
|
||||
* written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND
|
||||
* CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
|
Reference in New Issue
Block a user