📄 msh.c
字号:
*v = e.linep; execve(DEFAULT_SHELL, v, envp); *v = tp; return("no Shell"); case ENOMEM: return((char*)bb_msg_memory_exhausted); case E2BIG: return("argument list too long"); case EACCES: eacces++; break; } } return(errno==ENOENT ? "not found" : "cannot execute");}/* * Run the command produced by generator `f' * applied to stream `arg'. */static intrun(struct ioarg *argp, int (*f)(struct ioarg *)){ struct op *otree; struct wdblock *swdlist; struct wdblock *siolist; jmp_buf ev, rt; xint *ofail; int rv;#if __GNUC__ /* Avoid longjmp clobbering */ (void) &rv;#endif areanum++; swdlist = wdlist; siolist = iolist; otree = outtree; ofail = failpt; rv = -1; if (newenv(setjmp(errpt = ev)) == 0) { wdlist = 0; iolist = 0; pushio(argp, f); e.iobase = e.iop; yynerrs = 0; if (setjmp(failpt = rt) == 0 && yyparse() == 0) rv = execute(outtree, NOPIPE, NOPIPE, 0); quitenv(); } wdlist = swdlist; iolist = siolist; failpt = ofail; outtree = otree; freearea(areanum--); return(rv);}/* -------- do.c -------- *//* * built-in commands: doX */static int dohelp(struct op *t ){ int col; const struct builtincmd *x; printf("\nBuilt-in commands:\n"); printf("-------------------\n"); for (col=0, x = builtincmds; x->builtinfunc != NULL; x++) { if (!x->name) continue; col += printf("%s%s", ((col == 0) ? "\t" : " "), x->name); if (col > 60) { printf("\n"); col = 0; } }#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL { int i; const struct BB_applet *applet; extern const struct BB_applet applets[]; extern const size_t NUM_APPLETS; for (i=0, applet = applets; i < NUM_APPLETS; applet++, i++) { if (!applet->name) continue; col += printf("%s%s", ((col == 0) ? "\t" : " "), applet->name); if (col > 60) { printf("\n"); col = 0; } } }#endif printf("\n\n"); return EXIT_SUCCESS;}static int dolabel(struct op *t ){ return(0);}static intdochdir(t)register struct op *t;{ register char *cp, *er; if ((cp = t->words[1]) == NULL && (cp = homedir->value) == NULL) er = ": no home directory"; else if(chdir(cp) < 0) er = ": bad directory"; else return(0); prs(cp != NULL? cp: "cd"); err(er); return(1);}static intdoshift(t)register struct op *t;{ register int n; n = t->words[1]? getn(t->words[1]): 1; if(dolc < n) { err("nothing to shift"); return(1); } dolv[n] = dolv[0]; dolv += n; dolc -= n; setval(lookup("#"), putn(dolc)); return(0);}/* * execute login and newgrp directly */static intdologin(t)struct op *t;{ register char *cp; if (interactive) { signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); } cp = rexecve(t->words[0], t->words, makenv()); prs(t->words[0]); prs(": "); err(cp); return(1);}static intdoumask(t)register struct op *t;{ register int i, n; register char *cp; if ((cp = t->words[1]) == NULL) { i = umask(0); umask(i); for (n=3*4; (n-=3) >= 0;) putc('0'+((i>>n)&07), stderr); putc('\n', stderr); } else { for (n=0; *cp>='0' && *cp<='9'; cp++) n = n*8 + (*cp-'0'); umask(n); } return(0);}static intdoexec(t)register struct op *t;{ register int i; jmp_buf ex; xint *ofail; t->ioact = NULL; for(i = 0; (t->words[i]=t->words[i+1]) != NULL; i++) ; if (i == 0) return(1); execflg = 1; ofail = failpt; if (setjmp(failpt = ex) == 0) execute(t, NOPIPE, NOPIPE, FEXEC); failpt = ofail; execflg = 0; return(1);}static intdodot(t)struct op *t;{ register int i; register char *sp, *tp; char *cp; if ((cp = t->words[1]) == NULL) return(0); sp = any('/', cp)? ":": path->value; while (*sp) { tp = e.linep; while (*sp && (*tp = *sp++) != ':') tp++; if (tp != e.linep) *tp++ = '/'; for (i = 0; (*tp++ = cp[i++]) != '\0';) ; if ((i = open(e.linep, 0)) >= 0) { exstat = 0; next(remap(i)); return(exstat); } } prs(cp); err(": not found"); return(-1);}static intdowait(t)struct op *t;{ register int i; register char *cp; if ((cp = t->words[1]) != NULL) { i = getn(cp); if (i == 0) return(0); } else i = -1; setstatus(waitfor(i, 1)); return(0);}static intdoread(t)struct op *t;{ register char *cp, **wp; register int nb = 0; register int nl = 0; if (t->words[1] == NULL) { err("Usage: read name ..."); return(1); } for (wp = t->words+1; *wp; wp++) { for (cp = e.linep; !nl && cp < elinep-1; cp++) if ((nb = read(0, cp, sizeof(*cp))) != sizeof(*cp) || (nl = (*cp == '\n')) || (wp[1] && any(*cp, ifs->value))) break; *cp = 0; if (nb <= 0) break; setval(lookup(*wp), e.linep); } return(nb <= 0);}static intdoeval(t)register struct op *t;{ return(RUN(awordlist, t->words+1, wdchar));}static intdotrap(t)register struct op *t;{ register int n, i; register int resetsig; if (t->words[1] == NULL) { for (i=0; i<=_NSIG; i++) if (trap[i]) { prn(i); prs(": "); prs(trap[i]); prs("\n"); } return(0); } resetsig = isdigit(*t->words[1]); for (i = resetsig ? 1 : 2; t->words[i] != NULL; ++i) { n = getsig(t->words[i]); freecell(trap[n]); trap[n] = 0; if (!resetsig) { if (*t->words[1] != '\0') { trap[n] = strsave(t->words[1], 0); setsig(n, sig); } else setsig(n, SIG_IGN); } else { if (interactive) if (n == SIGINT) setsig(n, onintr); else setsig(n, n == SIGQUIT ? SIG_IGN : SIG_DFL); else setsig(n, SIG_DFL); } } return(0);}static intgetsig(s)char *s;{ register int n; if ((n = getn(s)) < 0 || n > _NSIG) { err("trap: bad signal number"); n = 0; } return(n);}static voidsetsig( register int n, sighandler_t f){ if (n == 0) return; if (signal(n, SIG_IGN) != SIG_IGN || ourtrap[n]) { ourtrap[n] = 1; signal(n, f); }}static intgetn(as)char *as;{ register char *s; register int n, m; s = as; m = 1; if (*s == '-') { m = -1; s++; } for (n = 0; isdigit(*s); s++) n = (n*10) + (*s-'0'); if (*s) { prs(as); err(": bad number"); } return(n*m);}static intdobreak(t)struct op *t;{ return(brkcontin(t->words[1], 1));}static intdocontinue(t)struct op *t;{ return(brkcontin(t->words[1], 0));}static intbrkcontin(cp, val)register char *cp;int val;{ register struct brkcon *bc; register int nl; nl = cp == NULL? 1: getn(cp); if (nl <= 0) nl = 999; do { if ((bc = brklist) == NULL) break; brklist = bc->nextlev; } while (--nl); if (nl) { err("bad break/continue level"); return(1); } isbreak = val; longjmp(bc->brkpt, 1); /* NOTREACHED */}static intdoexit(t)struct op *t;{ register char *cp; execflg = 0; if ((cp = t->words[1]) != NULL) setstatus(getn(cp)); leave(); /* NOTREACHED */ return(0);}static intdoexport(t)struct op *t;{ rdexp(t->words+1, export, EXPORT); return(0);}static intdoreadonly(t)struct op *t;{ rdexp(t->words+1, ronly, RONLY); return(0);}static void rdexp (char **wp, void (*f)(struct var *), int key){ if (*wp != NULL) { for (; *wp != NULL; wp++) { if (isassign(*wp)) { char *cp; assign(*wp, COPYV); for (cp = *wp; *cp != '='; cp++) ; *cp = '\0'; } if (checkname(*wp)) (*f)(lookup(*wp)); else badid(*wp); } } else putvlist(key, 1);}static voidbadid(s)register char *s;{ prs(s); err(": bad identifier");}static intdoset(t)register struct op *t;{ register struct var *vp; register char *cp; register int n; if ((cp = t->words[1]) == NULL) { for (vp = vlist; vp; vp = vp->next) varput(vp->name, 1); return(0); } if (*cp == '-') { /* bad: t->words++; */ for(n = 0; (t->words[n]=t->words[n+1]) != NULL; n++) ; if (*++cp == 0) flag['x'] = flag['v'] = 0; else for (; *cp; cp++) switch (*cp) { case 'e': if (!interactive) flag['e']++; break; default: if (*cp>='a' && *cp<='z') flag[(int)*cp]++; break; } setdash(); } if (t->words[1]) { t->words[0] = dolv[0]; for (n=1; t->words[n]; n++) setarea((char *)t->words[n], 0); dolc = n-1; dolv = t->words; setval(lookup("#"), putn(dolc)); setarea((char *)(dolv-1), 0); } return(0);}static voidvarput(s, out)register char *s;int out;{ if (isalnum(*s) || *s == '_') { write(out, s, strlen(s)); write(out, "\n", 1); }}/* * Copyright (c) 1999 Herbert Xu <herbert@debian.org> * This file contains code for the times builtin. */static int dotimes(struct op *t ){ struct tms buf; long int clk_tck = sysconf(_SC_CLK_TCK); times(&buf); printf("%dm%fs %dm%fs\n%dm%fs %dm%fs\n", (int) (buf.tms_utime / clk_tck / 60), ((double) buf.tms_utime) / clk_tck, (int) (buf.tms_stime / clk_tck / 60), ((double) buf.tms_stime) / clk_tck, (int) (buf.tms_cutime / clk_tck / 60), ((double) buf.tms_cutime) / clk_tck, (int) (buf.tms_cstime / clk_tck / 60), ((double) buf.tms_cstime) / clk_tck); return 0;}static int(*inbuilt(char *s))(struct op *){ const struct builtincmd *bp; for (bp = builtincmds; bp->name != NULL; bp++) if (strcmp(bp->name, s) == 0) return(bp->builtinfunc); return(NULL);}/* -------- eval.c -------- *//* * ${} * `command` * blank interpretation * quoting * glob */static char ** eval( char **ap, int f){ struct wdblock *wb; char **wp; char **wf; jmp_buf ev;#if __GNUC__ /* Avoid longjmp clobbering */ (void) ℘ (void) ≈#endif wp = NULL; wb = NULL; wf = NULL; if (newenv(setjmp(errpt = ev)) == 0) { while (*ap && isassign(*ap)) expand(*ap++, &wb, f & ~DOGLOB); if (flag['k']) { for (wf = ap; *wf; wf++) { if (isassign(*wf)) expand(*wf, &wb, f & ~DOGLOB); } } for (wb = addword((char *)0, wb); *ap; ap++) { if (!flag['k'] || !isassign(*ap)) expand(*ap, &wb, f & ~DOKEY); } wb = addword((char *)0, wb); wp = getwords(wb); quitenv(); } else gflg = 1; return(gflg? (char **)NULL: wp);}/* * Make the exported environment from the exported * names in the dictionary. Keyword assignments * will already have been done. */static char **makenv(){ register struct wdblock *wb; register struct var *vp; wb = NULL; for (vp = vlist; vp; vp = vp->next) if (vp->status & EXPORT) wb = addword(vp->name, wb); wb = addword((char *)0, wb); return(getwords(wb));}static char *evalstr(cp, f)register char *cp;int f;{ struct wdblock *wb; wb = NULL; if (expand(cp, &wb, f)) { if (wb == NULL || wb->w_nword == 0 || (cp = wb->w_words[0]) == NULL) cp = ""; DELETE(wb); } else cp = NULL; return(cp);}static intexpand( char *cp, register struct wdblock **wbp, int f){ jmp_buf ev;#if __GNUC__ /* Avoid longjmp clobbering */ (void) &cp;#endif gflg = 0; if (cp == NULL) return(0); if (!anys("$`'\"", cp) && !anys(ifs->value, cp) && ((f&DOGLOB)==0 || !anys("[*?", cp))) { cp = strsave(cp, areanum); if (f & DOTRIM) unquote(cp); *wbp = addword(cp, *wbp); return(1); } if (newenv(setjmp(errpt = ev)) == 0) { PUSHIO(aword, cp, strchar); e.iobase = e.iop; while ((cp = blank(f)) && gflg == 0) { e.linep = cp; cp = strsave(cp, areanum); if ((f&DOGLOB) == 0) { if (f & DOTRIM) unquote(cp); *wbp = addword(cp, *wbp); } else *wbp = glob(cp, *wbp); } quitenv(); } else gflg = 1; return(gflg == 0);}/* * Blank interpretation and quoting */static char *blank(f)int f;{ register int c, c1; register char *sp; int scanequals, foundequals; sp = e.linep; scanequals = f & DOKEY; foundequals = 0;loop: switch (c = subgetc('"', foundequals)) { case 0: if (sp == e.linep) return(0); *e.linep++ = 0; retur
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -