aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorvda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2007-02-19 22:44:05 +0000
committervda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2007-02-19 22:44:05 +0000
commit26cff6c3a9282d8a928dee12f1952b669168fa97 (patch)
treed8cfbb24a3b7041ab10d6a300ecb7bcf742cd7fb /shell
parent00546df29f6b2bb32469353c219ec3e25a171957 (diff)
downloadbusybox-w32-26cff6c3a9282d8a928dee12f1952b669168fa97.tar.gz
busybox-w32-26cff6c3a9282d8a928dee12f1952b669168fa97.tar.bz2
busybox-w32-26cff6c3a9282d8a928dee12f1952b669168fa97.zip
ash: more renaming and style fixes
git-svn-id: svn://busybox.net/trunk/busybox@17932 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c256
1 files changed, 130 insertions, 126 deletions
diff --git a/shell/ash.c b/shell/ash.c
index ffe29e066..532dad15a 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -168,7 +168,7 @@ static char *arg0; /* value of $0 */
168struct jmploc { 168struct jmploc {
169 jmp_buf loc; 169 jmp_buf loc;
170}; 170};
171static struct jmploc *handler; 171static struct jmploc *exception_handler;
172static int exception; 172static int exception;
173/* exceptions */ 173/* exceptions */
174#define EXINT 0 /* SIGINT received */ 174#define EXINT 0 /* SIGINT received */
@@ -208,12 +208,12 @@ static void
208raise_exception(int e) 208raise_exception(int e)
209{ 209{
210#if DEBUG 210#if DEBUG
211 if (handler == NULL) 211 if (exception_handler == NULL)
212 abort(); 212 abort();
213#endif 213#endif
214 INT_OFF; 214 INT_OFF;
215 exception = e; 215 exception = e;
216 longjmp(handler->loc, 1); 216 longjmp(exception_handler->loc, 1);
217} 217}
218 218
219/* 219/*
@@ -1035,11 +1035,11 @@ static int SIT(int c, int syntax)
1035 indx = 0; 1035 indx = 0;
1036 else 1036 else
1037#endif 1037#endif
1038 if (U_C(c) >= U_C(CTLESC) && U_C(c) <= U_C(CTLQUOTEMARK)) 1038 if (U_C(c) >= U_C(CTLESC) && U_C(c) <= U_C(CTLQUOTEMARK))
1039 return CCTL; 1039 return CCTL;
1040 else { 1040 else {
1041 s = strchr(spec_symbls, c); 1041 s = strchr(spec_symbls, c);
1042 if (s == 0 || *s == 0) 1042 if (s == NULL || *s == '\0')
1043 return CWORD; 1043 return CWORD;
1044 indx = syntax_index_table[(s - spec_symbls)]; 1044 indx = syntax_index_table[(s - spec_symbls)];
1045 } 1045 }
@@ -1874,7 +1874,7 @@ static void init(void)
1874 struct stat st1, st2; 1874 struct stat st1, st2;
1875 1875
1876 initvar(); 1876 initvar();
1877 for (envp = environ ; envp && *envp ; envp++) { 1877 for (envp = environ; envp && *envp; envp++) {
1878 if (strchr(*envp, '=')) { 1878 if (strchr(*envp, '=')) {
1879 setvareq(*envp, VEXPORT|VTEXTFIXED); 1879 setvareq(*envp, VEXPORT|VTEXTFIXED);
1880 } 1880 }
@@ -2907,7 +2907,7 @@ evalfor(union node *n, int flags)
2907 2907
2908 setstackmark(&smark); 2908 setstackmark(&smark);
2909 arglist.lastp = &arglist.list; 2909 arglist.lastp = &arglist.list;
2910 for (argp = n->nfor.args ; argp ; argp = argp->narg.next) { 2910 for (argp = n->nfor.args; argp; argp = argp->narg.next) {
2911 expandarg(argp, &arglist, EXP_FULL | EXP_TILDE | EXP_RECORD); 2911 expandarg(argp, &arglist, EXP_FULL | EXP_TILDE | EXP_RECORD);
2912 /* XXX */ 2912 /* XXX */
2913 if (evalskip) 2913 if (evalskip)
@@ -2918,7 +2918,7 @@ evalfor(union node *n, int flags)
2918 exitstatus = 0; 2918 exitstatus = 0;
2919 loopnest++; 2919 loopnest++;
2920 flags &= EV_TESTED; 2920 flags &= EV_TESTED;
2921 for (sp = arglist.list ; sp ; sp = sp->next) { 2921 for (sp = arglist.list; sp; sp = sp->next) {
2922 setvar(n->nfor.var, sp->text, 0); 2922 setvar(n->nfor.var, sp->text, 0);
2923 evaltree(n->nfor.body, flags); 2923 evaltree(n->nfor.body, flags);
2924 if (evalskip) { 2924 if (evalskip) {
@@ -2949,8 +2949,8 @@ evalcase(union node *n, int flags)
2949 arglist.lastp = &arglist.list; 2949 arglist.lastp = &arglist.list;
2950 expandarg(n->ncase.expr, &arglist, EXP_TILDE); 2950 expandarg(n->ncase.expr, &arglist, EXP_TILDE);
2951 exitstatus = 0; 2951 exitstatus = 0;
2952 for (cp = n->ncase.cases ; cp && evalskip == 0 ; cp = cp->nclist.next) { 2952 for (cp = n->ncase.cases; cp && evalskip == 0; cp = cp->nclist.next) {
2953 for (patp = cp->nclist.pattern ; patp ; patp = patp->narg.next) { 2953 for (patp = cp->nclist.pattern; patp; patp = patp->narg.next) {
2954 if (casematch(patp, arglist.list->text)) { 2954 if (casematch(patp, arglist.list->text)) {
2955 if (evalskip == 0) { 2955 if (evalskip == 0) {
2956 evaltree(cp->nclist.body, flags); 2956 evaltree(cp->nclist.body, flags);
@@ -3005,9 +3005,10 @@ expredir(union node *n)
3005{ 3005{
3006 union node *redir; 3006 union node *redir;
3007 3007
3008 for (redir = n ; redir ; redir = redir->nfile.next) { 3008 for (redir = n; redir; redir = redir->nfile.next) {
3009 struct arglist fn; 3009 struct arglist fn;
3010 memset(&fn, 0, sizeof(struct arglist)); 3010
3011 memset(&fn, 0, sizeof(fn));
3011 fn.lastp = &fn.list; 3012 fn.lastp = &fn.list;
3012 switch (redir->type) { 3013 switch (redir->type) {
3013 case NFROMTO: 3014 case NFROMTO:
@@ -3022,10 +3023,9 @@ expredir(union node *n)
3022 case NTOFD: 3023 case NTOFD:
3023 if (redir->ndup.vname) { 3024 if (redir->ndup.vname) {
3024 expandarg(redir->ndup.vname, &fn, EXP_FULL | EXP_TILDE); 3025 expandarg(redir->ndup.vname, &fn, EXP_FULL | EXP_TILDE);
3025 if (fn.list != NULL) 3026 if (fn.list == NULL)
3026 fixredir(redir, fn.list->text, 1);
3027 else
3028 ash_msg_and_raise_error("redir error"); 3027 ash_msg_and_raise_error("redir error");
3028 fixredir(redir, fn.list->text, 1);
3029 } 3029 }
3030 break; 3030 break;
3031 } 3031 }
@@ -3050,13 +3050,13 @@ evalpipe(union node *n, int flags)
3050 3050
3051 TRACE(("evalpipe(0x%lx) called\n", (long)n)); 3051 TRACE(("evalpipe(0x%lx) called\n", (long)n));
3052 pipelen = 0; 3052 pipelen = 0;
3053 for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) 3053 for (lp = n->npipe.cmdlist; lp; lp = lp->next)
3054 pipelen++; 3054 pipelen++;
3055 flags |= EV_EXIT; 3055 flags |= EV_EXIT;
3056 INT_OFF; 3056 INT_OFF;
3057 jp = makejob(n, pipelen); 3057 jp = makejob(n, pipelen);
3058 prevfd = -1; 3058 prevfd = -1;
3059 for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) { 3059 for (lp = n->npipe.cmdlist; lp; lp = lp->next) {
3060 prehash(lp->n); 3060 prehash(lp->n);
3061 pip[1] = -1; 3061 pip[1] = -1;
3062 if (lp->next) { 3062 if (lp->next) {
@@ -3248,7 +3248,7 @@ evalcommand(union node *cmd, int flags)
3248 } 3248 }
3249 3249
3250 argv = nargv = stalloc(sizeof(char *) * (argc + 1)); 3250 argv = nargv = stalloc(sizeof(char *) * (argc + 1));
3251 for (sp = arglist.list ; sp ; sp = sp->next) { 3251 for (sp = arglist.list; sp; sp = sp->next) {
3252 TRACE(("evalcommand arg: %s\n", sp->text)); 3252 TRACE(("evalcommand arg: %s\n", sp->text));
3253 *nargv++ = sp->text; 3253 *nargv++ = sp->text;
3254 } 3254 }
@@ -3401,7 +3401,7 @@ evalcommand(union node *cmd, int flags)
3401 3401
3402 if (i == EXINT || spclbltin > 0) { 3402 if (i == EXINT || spclbltin > 0) {
3403 raise: 3403 raise:
3404 longjmp(handler->loc, 1); 3404 longjmp(exception_handler->loc, 1);
3405 } 3405 }
3406 FORCE_INT_ON; 3406 FORCE_INT_ON;
3407 } 3407 }
@@ -3437,8 +3437,8 @@ evalbltin(const struct builtincmd *cmd, int argc, char **argv)
3437 i = setjmp(jmploc.loc); 3437 i = setjmp(jmploc.loc);
3438 if (i) 3438 if (i)
3439 goto cmddone; 3439 goto cmddone;
3440 savehandler = handler; 3440 savehandler = exception_handler;
3441 handler = &jmploc; 3441 exception_handler = &jmploc;
3442 commandname = argv[0]; 3442 commandname = argv[0];
3443 argptr = argv + 1; 3443 argptr = argv + 1;
3444 optptr = NULL; /* initialize nextopt */ 3444 optptr = NULL; /* initialize nextopt */
@@ -3449,7 +3449,7 @@ evalbltin(const struct builtincmd *cmd, int argc, char **argv)
3449 clearerr(stdout); 3449 clearerr(stdout);
3450 commandname = savecmdname; 3450 commandname = savecmdname;
3451 exsig = 0; 3451 exsig = 0;
3452 handler = savehandler; 3452 exception_handler = savehandler;
3453 3453
3454 return i; 3454 return i;
3455} 3455}
@@ -3470,8 +3470,8 @@ evalfun(struct funcnode *func, int argc, char **argv, int flags)
3470 goto funcdone; 3470 goto funcdone;
3471 } 3471 }
3472 INT_OFF; 3472 INT_OFF;
3473 savehandler = handler; 3473 savehandler = exception_handler;
3474 handler = &jmploc; 3474 exception_handler = &jmploc;
3475 localvars = NULL; 3475 localvars = NULL;
3476 shellparam.malloc = 0; 3476 shellparam.malloc = 0;
3477 func->count++; 3477 func->count++;
@@ -3492,7 +3492,7 @@ funcdone:
3492 localvars = savelocalvars; 3492 localvars = savelocalvars;
3493 freeparam(&shellparam); 3493 freeparam(&shellparam);
3494 shellparam = saveparam; 3494 shellparam = saveparam;
3495 handler = savehandler; 3495 exception_handler = savehandler;
3496 INT_ON; 3496 INT_ON;
3497 evalskip &= ~SKIPFUNC; 3497 evalskip &= ~SKIPFUNC;
3498 return e; 3498 return e;
@@ -3649,7 +3649,7 @@ static void delete_cmd_entry(void);
3649 * Exec a program. Never returns. If you change this routine, you may 3649 * Exec a program. Never returns. If you change this routine, you may
3650 * have to change the find_command routine as well. 3650 * have to change the find_command routine as well.
3651 */ 3651 */
3652 3652static void shellexec(char **, const char *, int) ATTRIBUTE_NORETURN;
3653static void 3653static void
3654shellexec(char **argv, const char *path, int idx) 3654shellexec(char **argv, const char *path, int idx)
3655{ 3655{
@@ -3776,7 +3776,7 @@ padvance(const char **path, const char *name)
3776 if (*path == NULL) 3776 if (*path == NULL)
3777 return NULL; 3777 return NULL;
3778 start = *path; 3778 start = *path;
3779 for (p = start ; *p && *p != ':' && *p != '%' ; p++); 3779 for (p = start; *p && *p != ':' && *p != '%'; p++);
3780 len = p - start + strlen(name) + 2; /* "2" is for '/' and '\0' */ 3780 len = p - start + strlen(name) + 2; /* "2" is for '/' and '\0' */
3781 while (stackblocksize() < len) 3781 while (stackblocksize() < len)
3782 growstackblock(); 3782 growstackblock();
@@ -3833,8 +3833,8 @@ hashcmd(int argc, char **argv)
3833 return 0; 3833 return 0;
3834 } 3834 }
3835 if (*argptr == NULL) { 3835 if (*argptr == NULL) {
3836 for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) { 3836 for (pp = cmdtable; pp < &cmdtable[CMDTABLESIZE]; pp++) {
3837 for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { 3837 for (cmdp = *pp; cmdp; cmdp = cmdp->next) {
3838 if (cmdp->cmdtype == CMDNORMAL) 3838 if (cmdp->cmdtype == CMDNORMAL)
3839 printentry(cmdp); 3839 printentry(cmdp);
3840 } 3840 }
@@ -4077,8 +4077,8 @@ hashcd(void)
4077 struct tblentry **pp; 4077 struct tblentry **pp;
4078 struct tblentry *cmdp; 4078 struct tblentry *cmdp;
4079 4079
4080 for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) { 4080 for (pp = cmdtable; pp < &cmdtable[CMDTABLESIZE]; pp++) {
4081 for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { 4081 for (cmdp = *pp; cmdp; cmdp = cmdp->next) {
4082 if (cmdp->cmdtype == CMDNORMAL || ( 4082 if (cmdp->cmdtype == CMDNORMAL || (
4083 cmdp->cmdtype == CMDBUILTIN && 4083 cmdp->cmdtype == CMDBUILTIN &&
4084 !(IS_BUILTIN_REGULAR(cmdp->param.cmd)) && 4084 !(IS_BUILTIN_REGULAR(cmdp->param.cmd)) &&
@@ -4147,7 +4147,7 @@ clearcmdentry(int firstchange)
4147 struct tblentry *cmdp; 4147 struct tblentry *cmdp;
4148 4148
4149 INT_OFF; 4149 INT_OFF;
4150 for (tblp = cmdtable ; tblp < &cmdtable[CMDTABLESIZE] ; tblp++) { 4150 for (tblp = cmdtable; tblp < &cmdtable[CMDTABLESIZE]; tblp++) {
4151 pp = tblp; 4151 pp = tblp;
4152 while ((cmdp = *pp) != NULL) { 4152 while ((cmdp = *pp) != NULL) {
4153 if ((cmdp->cmdtype == CMDNORMAL && 4153 if ((cmdp->cmdtype == CMDNORMAL &&
@@ -4191,7 +4191,7 @@ cmdlookup(const char *name, int add)
4191 hashval += (unsigned char)*p++; 4191 hashval += (unsigned char)*p++;
4192 hashval &= 0x7FFF; 4192 hashval &= 0x7FFF;
4193 pp = &cmdtable[hashval % CMDTABLESIZE]; 4193 pp = &cmdtable[hashval % CMDTABLESIZE];
4194 for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { 4194 for (cmdp = *pp; cmdp; cmdp = cmdp->next) {
4195 if (equal(cmdp->cmdname, name)) 4195 if (equal(cmdp->cmdname, name))
4196 break; 4196 break;
4197 pp = &cmdp->next; 4197 pp = &cmdp->next;
@@ -4499,8 +4499,7 @@ static int cvtnum(arith_t);
4499static size_t esclen(const char *, const char *); 4499static size_t esclen(const char *, const char *);
4500static char *scanleft(char *, char *, char *, char *, int, int); 4500static char *scanleft(char *, char *, char *, char *, int, int);
4501static char *scanright(char *, char *, char *, char *, int, int); 4501static char *scanright(char *, char *, char *, char *, int, int);
4502static void varunset(const char *, const char *, const char *, int) 4502static void varunset(const char *, const char *, const char *, int) ATTRIBUTE_NORETURN;
4503 ATTRIBUTE_NORETURN;
4504 4503
4505 4504
4506#define pmatch(a, b) !fnmatch((a), (b), 0) 4505#define pmatch(a, b) !fnmatch((a), (b), 0)
@@ -5704,7 +5703,7 @@ expsort(struct strlist *str)
5704 struct strlist *sp; 5703 struct strlist *sp;
5705 5704
5706 len = 0; 5705 len = 0;
5707 for (sp = str ; sp ; sp = sp->next) 5706 for (sp = str; sp; sp = sp->next)
5708 len++; 5707 len++;
5709 return msort(str, len); 5708 return msort(str, len);
5710} 5709}
@@ -5722,7 +5721,7 @@ msort(struct strlist *list, int len)
5722 return list; 5721 return list;
5723 half = len >> 1; 5722 half = len >> 1;
5724 p = list; 5723 p = list;
5725 for (n = half ; --n >= 0 ; ) { 5724 for (n = half; --n >= 0; ) {
5726 q = p; 5725 q = p;
5727 p = p->next; 5726 p = p->next;
5728 } 5727 }
@@ -5874,6 +5873,7 @@ cvtnum(arith_t num)
5874 return len; 5873 return len;
5875} 5874}
5876 5875
5876static void varunset(const char *, const char *, const char *, int) ATTRIBUTE_NORETURN;
5877static void 5877static void
5878varunset(const char *end, const char *var, const char *umsg, int varflags) 5878varunset(const char *end, const char *var, const char *umsg, int varflags)
5879{ 5879{
@@ -6573,10 +6573,9 @@ killcmd(int argc, char **argv)
6573 return 0; 6573 return 0;
6574 } 6574 }
6575 name = get_signame(signo); 6575 name = get_signame(signo);
6576 if (isdigit(*name)) 6576 if (!isdigit(*name))
6577 out1fmt(snlfmt, name);
6578 else
6579 ash_msg_and_raise_error("invalid signal number or exit status: %s", *argptr); 6577 ash_msg_and_raise_error("invalid signal number or exit status: %s", *argptr);
6578 out1fmt(snlfmt, name);
6580 return 0; 6579 return 0;
6581 } 6580 }
6582 6581
@@ -6834,7 +6833,7 @@ freejob(struct job *jp)
6834 int i; 6833 int i;
6835 6834
6836 INT_OFF; 6835 INT_OFF;
6837 for (i = jp->nprocs, ps = jp->ps ; --i >= 0 ; ps++) { 6836 for (i = jp->nprocs, ps = jp->ps; --i >= 0; ps++) {
6838 if (ps->cmd != nullstr) 6837 if (ps->cmd != nullstr)
6839 free(ps->cmd); 6838 free(ps->cmd);
6840 } 6839 }
@@ -7001,7 +7000,7 @@ makejob(union node *node, int nprocs)
7001 int i; 7000 int i;
7002 struct job *jp; 7001 struct job *jp;
7003 7002
7004 for (i = njobs, jp = jobtab ; ; jp++) { 7003 for (i = njobs, jp = jobtab; ; jp++) {
7005 if (--i < 0) { 7004 if (--i < 0) {
7006 jp = growjobtab(); 7005 jp = growjobtab();
7007 break; 7006 break;
@@ -7772,7 +7771,7 @@ chkmail(void)
7772 break; 7771 break;
7773 if (*p == '\0') 7772 if (*p == '\0')
7774 continue; 7773 continue;
7775 for (q = p ; *q ; q++); 7774 for (q = p; *q; q++);
7776#if DEBUG 7775#if DEBUG
7777 if (q[-1] != '/') 7776 if (q[-1] != '/')
7778 abort(); 7777 abort();
@@ -7869,7 +7868,7 @@ int ash_main(int argc, char **argv)
7869 else 7868 else
7870 goto state4; 7869 goto state4;
7871 } 7870 }
7872 handler = &jmploc; 7871 exception_handler = &jmploc;
7873#if DEBUG 7872#if DEBUG
7874 opentrace(); 7873 opentrace();
7875 trputs("Shell args: "); trargs(argv); 7874 trputs("Shell args: "); trargs(argv);
@@ -8413,7 +8412,7 @@ prefix(const char *string, const char *pfx)
8413static int 8412static int
8414number(const char *s) 8413number(const char *s)
8415{ 8414{
8416 if (! is_number(s)) 8415 if (!is_number(s))
8417 ash_msg_and_raise_error(illnum, s); 8416 ash_msg_and_raise_error(illnum, s);
8418 return atoi(s); 8417 return atoi(s);
8419} 8418}
@@ -8426,7 +8425,7 @@ static int
8426is_number(const char *p) 8425is_number(const char *p)
8427{ 8426{
8428 do { 8427 do {
8429 if (! is_digit(*p)) 8428 if (!is_digit(*p))
8430 return 0; 8429 return 0;
8431 } while (*++p != '\0'); 8430 } while (*++p != '\0');
8432 return 1; 8431 return 1;
@@ -8886,7 +8885,7 @@ setparam(char **argv)
8886 char **ap; 8885 char **ap;
8887 int nparam; 8886 int nparam;
8888 8887
8889 for (nparam = 0 ; argv[nparam] ; nparam++); 8888 for (nparam = 0; argv[nparam]; nparam++);
8890 ap = newparam = ckmalloc((nparam + 1) * sizeof(*ap)); 8889 ap = newparam = ckmalloc((nparam + 1) * sizeof(*ap));
8891 while (*argv) { 8890 while (*argv) {
8892 *ap++ = savestr(*argv++); 8891 *ap++ = savestr(*argv++);
@@ -8912,7 +8911,7 @@ freeparam(volatile struct shparam *param)
8912 char **ap; 8911 char **ap;
8913 8912
8914 if (param->malloc) { 8913 if (param->malloc) {
8915 for (ap = param->p ; *ap ; ap++) 8914 for (ap = param->p; *ap; ap++)
8916 free(*ap); 8915 free(*ap);
8917 free(param->p); 8916 free(param->p);
8918 } 8917 }
@@ -8935,7 +8934,7 @@ shiftcmd(int argc, char **argv)
8935 ash_msg_and_raise_error("can't shift that many"); 8934 ash_msg_and_raise_error("can't shift that many");
8936 INT_OFF; 8935 INT_OFF;
8937 shellparam.nparam -= n; 8936 shellparam.nparam -= n;
8938 for (ap1 = shellparam.p ; --n >= 0 ; ap1++) { 8937 for (ap1 = shellparam.p; --n >= 0; ap1++) {
8939 if (shellparam.malloc) 8938 if (shellparam.malloc)
8940 free(*ap1); 8939 free(*ap1);
8941 } 8940 }
@@ -9163,7 +9162,7 @@ nextopt(const char *optstring)
9163 return '\0'; 9162 return '\0';
9164 } 9163 }
9165 c = *p++; 9164 c = *p++;
9166 for (q = optstring ; *q != c ; ) { 9165 for (q = optstring; *q != c; ) {
9167 if (*q == '\0') 9166 if (*q == '\0')
9168 ash_msg_and_raise_error("Illegal option -%c", c); 9167 ash_msg_and_raise_error("Illegal option -%c", c);
9169 if (*++q == ':') 9168 if (*++q == ':')
@@ -9378,8 +9377,8 @@ pipeline(void)
9378 n2->type = NNOT; 9377 n2->type = NNOT;
9379 n2->nnot.com = n1; 9378 n2->nnot.com = n1;
9380 return n2; 9379 return n2;
9381 } else 9380 }
9382 return n1; 9381 return n1;
9383} 9382}
9384 9383
9385 9384
@@ -10254,7 +10253,7 @@ checkend: {
10254 char *p, *q; 10253 char *p, *q;
10255 10254
10256 p = line; 10255 p = line;
10257 for (q = eofmark + 1 ; *q && *p == *q ; p++, q++); 10256 for (q = eofmark + 1; *q && *p == *q; p++, q++);
10258 if (*p == '\n' && *q == '\0') { 10257 if (*p == '\n' && *q == '\0') {
10259 c = PEOF; 10258 c = PEOF;
10260 plinno++; 10259 plinno++;
@@ -10464,8 +10463,8 @@ parsebackq: {
10464 if (str) 10463 if (str)
10465 free(str); 10464 free(str);
10466 parsebackquote = 0; 10465 parsebackquote = 0;
10467 handler = savehandler; 10466 exception_handler = savehandler;
10468 longjmp(handler->loc, 1); 10467 longjmp(exception_handler->loc, 1);
10469 } 10468 }
10470 INT_OFF; 10469 INT_OFF;
10471 str = NULL; 10470 str = NULL;
@@ -10474,8 +10473,8 @@ parsebackq: {
10474 str = ckmalloc(savelen); 10473 str = ckmalloc(savelen);
10475 memcpy(str, stackblock(), savelen); 10474 memcpy(str, stackblock(), savelen);
10476 } 10475 }
10477 savehandler = handler; 10476 savehandler = exception_handler;
10478 handler = &jmploc; 10477 exception_handler = &jmploc;
10479 INT_ON; 10478 INT_ON;
10480 if (oldstyle) { 10479 if (oldstyle) {
10481 /* We must read until the closing backquote, giving special 10480 /* We must read until the closing backquote, giving special
@@ -10586,7 +10585,7 @@ parsebackq: {
10586 INT_ON; 10585 INT_ON;
10587 } 10586 }
10588 parsebackquote = savepbq; 10587 parsebackquote = savepbq;
10589 handler = savehandler; 10588 exception_handler = savehandler;
10590 if (arinest || dblquote) 10589 if (arinest || dblquote)
10591 USTPUTC(CTLBACKQ | CTLQUOTE, out); 10590 USTPUTC(CTLBACKQ | CTLQUOTE, out);
10592 else 10591 else
@@ -10933,7 +10932,7 @@ static void dupredirect(union node *redir, int f)
10933 10932
10934 if (redir->nfile.type == NTOFD || redir->nfile.type == NFROMFD) { 10933 if (redir->nfile.type == NTOFD || redir->nfile.type == NFROMFD) {
10935 if (redir->ndup.dupfd >= 0) { /* if not ">&-" */ 10934 if (redir->ndup.dupfd >= 0) { /* if not ">&-" */
10936 copyfd(redir->ndup.dupfd, fd); 10935 copyfd(redir->ndup.dupfd, fd);
10937 } 10936 }
10938 return; 10937 return;
10939 } 10938 }
@@ -10973,7 +10972,7 @@ redirect(union node *redir, int flags)
10973 q->next = redirlist; 10972 q->next = redirlist;
10974 redirlist = q; 10973 redirlist = q;
10975 q->nullredirs = nullredirs - 1; 10974 q->nullredirs = nullredirs - 1;
10976 for (i = 0 ; i < 10 ; i++) 10975 for (i = 0; i < 10; i++)
10977 q->renamed[i] = EMPTY; 10976 q->renamed[i] = EMPTY;
10978 nullredirs = 0; 10977 nullredirs = 0;
10979 sv = q; 10978 sv = q;
@@ -11027,7 +11026,7 @@ popredir(int drop)
11027 return; 11026 return;
11028 INT_OFF; 11027 INT_OFF;
11029 rp = redirlist; 11028 rp = redirlist;
11030 for (i = 0 ; i < 10 ; i++) { 11029 for (i = 0; i < 10; i++) {
11031 if (rp->renamed[i] != EMPTY) { 11030 if (rp->renamed[i] != EMPTY) {
11032 if (!drop) { 11031 if (!drop) {
11033 close(i); 11032 close(i);
@@ -11075,8 +11074,7 @@ copyfd(int from, int to)
11075 if (newfd < 0) { 11074 if (newfd < 0) {
11076 if (errno == EMFILE) 11075 if (errno == EMFILE)
11077 return EMPTY; 11076 return EMPTY;
11078 else 11077 ash_msg_and_raise_error("%d: %m", from);
11079 ash_msg_and_raise_error("%d: %m", from);
11080 } 11078 }
11081 return newfd; 11079 return newfd;
11082} 11080}
@@ -11087,18 +11085,18 @@ redirectsafe(union node *redir, int flags)
11087{ 11085{
11088 int err; 11086 int err;
11089 volatile int saveint; 11087 volatile int saveint;
11090 struct jmploc *volatile savehandler = handler; 11088 struct jmploc *volatile savehandler = exception_handler;
11091 struct jmploc jmploc; 11089 struct jmploc jmploc;
11092 11090
11093 SAVE_INT(saveint); 11091 SAVE_INT(saveint);
11094 err = setjmp(jmploc.loc) * 2; 11092 err = setjmp(jmploc.loc) * 2;
11095 if (!err) { 11093 if (!err) {
11096 handler = &jmploc; 11094 exception_handler = &jmploc;
11097 redirect(redir, flags); 11095 redirect(redir, flags);
11098 } 11096 }
11099 handler = savehandler; 11097 exception_handler = savehandler;
11100 if (err && exception != EXERROR) 11098 if (err && exception != EXERROR)
11101 longjmp(handler->loc, 1); 11099 longjmp(exception_handler->loc, 1);
11102 RESTORE_INT(saveint); 11100 RESTORE_INT(saveint);
11103 return err; 11101 return err;
11104} 11102}
@@ -11152,7 +11150,7 @@ shtree(union node *n, int ind, char *pfx, FILE *fp)
11152 putc('\n', fp); 11150 putc('\n', fp);
11153 break; 11151 break;
11154 case NPIPE: 11152 case NPIPE:
11155 for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) { 11153 for (lp = n->npipe.cmdlist; lp; lp = lp->next) {
11156 shcmd(lp->n, fp); 11154 shcmd(lp->n, fp);
11157 if (lp->next) 11155 if (lp->next)
11158 fputs(" | ", fp); 11156 fputs(" | ", fp);
@@ -11180,24 +11178,24 @@ shcmd(union node *cmd, FILE *fp)
11180 int dftfd; 11178 int dftfd;
11181 11179
11182 first = 1; 11180 first = 1;
11183 for (np = cmd->ncmd.args ; np ; np = np->narg.next) { 11181 for (np = cmd->ncmd.args; np; np = np->narg.next) {
11184 if (! first) 11182 if (! first)
11185 putchar(' '); 11183 putchar(' ');
11186 sharg(np, fp); 11184 sharg(np, fp);
11187 first = 0; 11185 first = 0;
11188 } 11186 }
11189 for (np = cmd->ncmd.redirect ; np ; np = np->nfile.next) { 11187 for (np = cmd->ncmd.redirect; np; np = np->nfile.next) {
11190 if (! first) 11188 if (! first)
11191 putchar(' '); 11189 putchar(' ');
11192 switch (np->nfile.type) { 11190 switch (np->nfile.type) {
11193 case NTO: s = ">"; dftfd = 1; break; 11191 case NTO: s = ">"; dftfd = 1; break;
11194 case NCLOBBER: s = ">|"; dftfd = 1; break; 11192 case NCLOBBER: s = ">|"; dftfd = 1; break;
11195 case NAPPEND: s = ">>"; dftfd = 1; break; 11193 case NAPPEND: s = ">>"; dftfd = 1; break;
11196 case NTOFD: s = ">&"; dftfd = 1; break; 11194 case NTOFD: s = ">&"; dftfd = 1; break;
11197 case NFROM: s = "<"; dftfd = 0; break; 11195 case NFROM: s = "<"; dftfd = 0; break;
11198 case NFROMFD: s = "<&"; dftfd = 0; break; 11196 case NFROMFD: s = "<&"; dftfd = 0; break;
11199 case NFROMTO: s = "<>"; dftfd = 0; break; 11197 case NFROMTO: s = "<>"; dftfd = 0; break;
11200 default: s = "*error*"; dftfd = 0; break; 11198 default: s = "*error*"; dftfd = 0; break;
11201 } 11199 }
11202 if (np->nfile.fd != dftfd) 11200 if (np->nfile.fd != dftfd)
11203 fprintf(fp, "%d", np->nfile.fd); 11201 fprintf(fp, "%d", np->nfile.fd);
@@ -11224,7 +11222,7 @@ sharg(union node *arg, FILE *fp)
11224 abort(); 11222 abort();
11225 } 11223 }
11226 bqlist = arg->narg.backquote; 11224 bqlist = arg->narg.backquote;
11227 for (p = arg->narg.text ; *p ; p++) { 11225 for (p = arg->narg.text; *p; p++) {
11228 switch (*p) { 11226 switch (*p) {
11229 case CTLESC: 11227 case CTLESC:
11230 putc(*++p, fp); 11228 putc(*++p, fp);
@@ -11301,7 +11299,7 @@ indent(int amount, char *pfx, FILE *fp)
11301{ 11299{
11302 int i; 11300 int i;
11303 11301
11304 for (i = 0 ; i < amount ; i++) { 11302 for (i = 0; i < amount; i++) {
11305 if (pfx && i == amount - 1) 11303 if (pfx && i == amount - 1)
11306 fputs(pfx, fp); 11304 fputs(pfx, fp);
11307 putc('\t', fp); 11305 putc('\t', fp);
@@ -11364,7 +11362,7 @@ trstring(char *s)
11364 if (debug != 1) 11362 if (debug != 1)
11365 return; 11363 return;
11366 putc('"', tracefile); 11364 putc('"', tracefile);
11367 for (p = s ; *p ; p++) { 11365 for (p = s; *p; p++) {
11368 switch (*p) { 11366 switch (*p) {
11369 case '\n': c = 'n'; goto backslash; 11367 case '\n': c = 'n'; goto backslash;
11370 case '\t': c = 't'; goto backslash; 11368 case '\t': c = 't'; goto backslash;
@@ -11373,10 +11371,11 @@ trstring(char *s)
11373 case '\\': c = '\\'; goto backslash; 11371 case '\\': c = '\\'; goto backslash;
11374 case CTLESC: c = 'e'; goto backslash; 11372 case CTLESC: c = 'e'; goto backslash;
11375 case CTLVAR: c = 'v'; goto backslash; 11373 case CTLVAR: c = 'v'; goto backslash;
11376 case CTLVAR+CTLQUOTE: c = 'V'; goto backslash; 11374 case CTLVAR+CTLQUOTE: c = 'V'; goto backslash;
11377 case CTLBACKQ: c = 'q'; goto backslash; 11375 case CTLBACKQ: c = 'q'; goto backslash;
11378 case CTLBACKQ+CTLQUOTE: c = 'Q'; goto backslash; 11376 case CTLBACKQ+CTLQUOTE: c = 'Q'; goto backslash;
11379 backslash: putc('\\', tracefile); 11377 backslash:
11378 putc('\\', tracefile);
11380 putc(c, tracefile); 11379 putc(c, tracefile);
11381 break; 11380 break;
11382 default: 11381 default:
@@ -11478,7 +11477,7 @@ trapcmd(int argc, char **argv)
11478 nextopt(nullstr); 11477 nextopt(nullstr);
11479 ap = argptr; 11478 ap = argptr;
11480 if (!*ap) { 11479 if (!*ap) {
11481 for (signo = 0 ; signo < NSIG ; signo++) { 11480 for (signo = 0; signo < NSIG; signo++) {
11482 if (trap[signo] != NULL) { 11481 if (trap[signo] != NULL) {
11483 const char *sn; 11482 const char *sn;
11484 11483
@@ -11524,7 +11523,7 @@ clear_traps(void)
11524{ 11523{
11525 char **tp; 11524 char **tp;
11526 11525
11527 for (tp = trap ; tp < &trap[NSIG] ; tp++) { 11526 for (tp = trap; tp < &trap[NSIG]; tp++) {
11528 if (*tp && **tp) { /* trap not NULL or SIG_IGN */ 11527 if (*tp && **tp) { /* trap not NULL or SIG_IGN */
11529 INT_OFF; 11528 INT_OFF;
11530 free(*tp); 11529 free(*tp);
@@ -11596,8 +11595,8 @@ setsignal(int signo)
11596 return; 11595 return;
11597 } 11596 }
11598 if (act.sa_handler == SIG_IGN) { 11597 if (act.sa_handler == SIG_IGN) {
11599 if (mflag && (signo == SIGTSTP || signo == SIGTTIN 11598 if (mflag
11600 || signo == SIGTTOU) 11599 && (signo == SIGTSTP || signo == SIGTTIN || signo == SIGTTOU)
11601 ) { 11600 ) {
11602 tsig = S_IGN; /* don't hard ignore these */ 11601 tsig = S_IGN; /* don't hard ignore these */
11603 } else 11602 } else
@@ -11675,7 +11674,7 @@ dotrap(void)
11675 for (i = 0, q = gotsig; i < NSIG - 1; i++, q++) { 11674 for (i = 0, q = gotsig; i < NSIG - 1; i++, q++) {
11676 if (!*q) 11675 if (!*q)
11677 continue; 11676 continue;
11678 *q = 0; 11677 *q = '\0';
11679 11678
11680 p = trap[i + 1]; 11679 p = trap[i + 1];
11681 if (!p) 11680 if (!p)
@@ -11705,18 +11704,20 @@ setinteractive(int on)
11705 setsignal(SIGQUIT); 11704 setsignal(SIGQUIT);
11706 setsignal(SIGTERM); 11705 setsignal(SIGTERM);
11707#if !ENABLE_FEATURE_SH_EXTRA_QUIET 11706#if !ENABLE_FEATURE_SH_EXTRA_QUIET
11708 if (is_interactive > 1) { 11707 if (is_interactive > 1) {
11709 /* Looks like they want an interactive shell */ 11708 /* Looks like they want an interactive shell */
11710 static int do_banner; 11709 static int do_banner;
11711 11710
11712 if (!do_banner) { 11711 if (!do_banner) {
11713 out1fmt( 11712 out1fmt(
11714 "\n\n%s Built-in shell (ash)\n" 11713 "\n\n"
11715 "Enter 'help' for a list of built-in commands.\n\n", 11714 "%s Built-in shell (ash)\n"
11716 BB_BANNER); 11715 "Enter 'help' for a list of built-in commands."
11717 do_banner++; 11716 "\n\n",
11718 } 11717 BB_BANNER);
11718 do_banner++;
11719 } 11719 }
11720 }
11720#endif 11721#endif
11721} 11722}
11722 11723
@@ -11773,7 +11774,7 @@ exitshell(void)
11773 status = exitstatus; 11774 status = exitstatus;
11774 goto out; 11775 goto out;
11775 } 11776 }
11776 handler = &loc; 11777 exception_handler = &loc;
11777 p = trap[0]; 11778 p = trap[0];
11778 if (p) { 11779 if (p) {
11779 trap[0] = NULL; 11780 trap[0] = NULL;
@@ -11807,18 +11808,18 @@ setvarsafe(const char *name, const char *val, int flags)
11807{ 11808{
11808 int err; 11809 int err;
11809 volatile int saveint; 11810 volatile int saveint;
11810 struct jmploc *volatile savehandler = handler; 11811 struct jmploc *volatile savehandler = exception_handler;
11811 struct jmploc jmploc; 11812 struct jmploc jmploc;
11812 11813
11813 SAVE_INT(saveint); 11814 SAVE_INT(saveint);
11814 if (setjmp(jmploc.loc)) 11815 if (setjmp(jmploc.loc))
11815 err = 1; 11816 err = 1;
11816 else { 11817 else {
11817 handler = &jmploc; 11818 exception_handler = &jmploc;
11818 setvar(name, val, flags); 11819 setvar(name, val, flags);
11819 err = 0; 11820 err = 0;
11820 } 11821 }
11821 handler = savehandler; 11822 exception_handler = savehandler;
11822 RESTORE_INT(saveint); 11823 RESTORE_INT(saveint);
11823 return err; 11824 return err;
11824} 11825}
@@ -11966,7 +11967,7 @@ bltinlookup(const char *name)
11966{ 11967{
11967 struct strlist *sp; 11968 struct strlist *sp;
11968 11969
11969 for (sp = cmdenviron ; sp ; sp = sp->next) { 11970 for (sp = cmdenviron; sp; sp = sp->next) {
11970 if (varequal(sp->text, name)) 11971 if (varequal(sp->text, name))
11971 return strchrnul(sp->text, '=') + 1; 11972 return strchrnul(sp->text, '=') + 1;
11972 } 11973 }
@@ -11989,7 +11990,7 @@ listvars(int on, int off, char ***end)
11989 vpp = vartab; 11990 vpp = vartab;
11990 mask = on | off; 11991 mask = on | off;
11991 do { 11992 do {
11992 for (vp = *vpp ; vp ; vp = vp->next) 11993 for (vp = *vpp; vp; vp = vp->next)
11993 if ((vp->flags & mask) == on) { 11994 if ((vp->flags & mask) == on) {
11994 if (ep == stackstrend()) 11995 if (ep == stackstrend())
11995 ep = growstackstr(); 11996 ep = growstackstr();
@@ -12050,26 +12051,28 @@ exportcmd(int argc, char **argv)
12050 const char *p; 12051 const char *p;
12051 char **aptr; 12052 char **aptr;
12052 int flag = argv[0][0] == 'r'? VREADONLY : VEXPORT; 12053 int flag = argv[0][0] == 'r'? VREADONLY : VEXPORT;
12053 int notp;
12054 12054
12055 notp = nextopt("p") - 'p'; 12055 if (nextopt("p") != 'p') {
12056 if (notp && ((name = *(aptr = argptr)))) { 12056 aptr = argptr;
12057 do { 12057 name = *aptr;
12058 p = strchr(name, '='); 12058 if (name) {
12059 if (p != NULL) { 12059 do {
12060 p++; 12060 p = strchr(name, '=');
12061 } else { 12061 if (p != NULL) {
12062 vp = *findvar(hashvar(name), name); 12062 p++;
12063 if (vp) { 12063 } else {
12064 vp->flags |= flag; 12064 vp = *findvar(hashvar(name), name);
12065 continue; 12065 if (vp) {
12066 vp->flags |= flag;
12067 continue;
12068 }
12066 } 12069 }
12067 } 12070 setvar(name, p, flag);
12068 setvar(name, p, flag); 12071 } while ((name = *++aptr) != NULL);
12069 } while ((name = *++aptr) != NULL); 12072 return 0;
12070 } else { 12073 }
12071 showvars(argv[0], flag, 0);
12072 } 12074 }
12075 showvars(argv[0], flag, 0);
12073 return 0; 12076 return 0;
12074} 12077}
12075 12078
@@ -12187,7 +12190,7 @@ unsetcmd(int argc, char **argv)
12187 flag = i; 12190 flag = i;
12188 } 12191 }
12189 12192
12190 for (ap = argptr; *ap ; ap++) { 12193 for (ap = argptr; *ap; ap++) {
12191 if (flag != 'f') { 12194 if (flag != 'f') {
12192 i = unsetvar(*ap); 12195 i = unsetvar(*ap);
12193 ret |= i; 12196 ret |= i;
@@ -13368,7 +13371,8 @@ static arith_t arith(const char *expr, int *perrcode)
13368 numstackptr++; 13371 numstackptr++;
13369 lasttok = TOK_NUM; 13372 lasttok = TOK_NUM;
13370 continue; 13373 continue;
13371 } else if (is_digit(arithval)) { 13374 }
13375 if (is_digit(arithval)) {
13372 numstackptr->var = NULL; 13376 numstackptr->var = NULL;
13373#if ENABLE_ASH_MATH_SUPPORT_64 13377#if ENABLE_ASH_MATH_SUPPORT_64
13374 numstackptr->val = strtoll(expr, (char **) &expr, 0); 13378 numstackptr->val = strtoll(expr, (char **) &expr, 0);