diff options
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 256 |
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 */ | |||
| 168 | struct jmploc { | 168 | struct jmploc { |
| 169 | jmp_buf loc; | 169 | jmp_buf loc; |
| 170 | }; | 170 | }; |
| 171 | static struct jmploc *handler; | 171 | static struct jmploc *exception_handler; |
| 172 | static int exception; | 172 | static int exception; |
| 173 | /* exceptions */ | 173 | /* exceptions */ |
| 174 | #define EXINT 0 /* SIGINT received */ | 174 | #define EXINT 0 /* SIGINT received */ |
| @@ -208,12 +208,12 @@ static void | |||
| 208 | raise_exception(int e) | 208 | raise_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 | 3652 | static void shellexec(char **, const char *, int) ATTRIBUTE_NORETURN; | |
| 3653 | static void | 3653 | static void |
| 3654 | shellexec(char **argv, const char *path, int idx) | 3654 | shellexec(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); | |||
| 4499 | static size_t esclen(const char *, const char *); | 4499 | static size_t esclen(const char *, const char *); |
| 4500 | static char *scanleft(char *, char *, char *, char *, int, int); | 4500 | static char *scanleft(char *, char *, char *, char *, int, int); |
| 4501 | static char *scanright(char *, char *, char *, char *, int, int); | 4501 | static char *scanright(char *, char *, char *, char *, int, int); |
| 4502 | static void varunset(const char *, const char *, const char *, int) | 4502 | static 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 | ||
| 5876 | static void varunset(const char *, const char *, const char *, int) ATTRIBUTE_NORETURN; | ||
| 5877 | static void | 5877 | static void |
| 5878 | varunset(const char *end, const char *var, const char *umsg, int varflags) | 5878 | varunset(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) | |||
| 8413 | static int | 8412 | static int |
| 8414 | number(const char *s) | 8413 | number(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 | |||
| 8426 | is_number(const char *p) | 8425 | is_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); |
