msh.c
来自「手机嵌入式Linux下可用的busybox源码」· C语言 代码 · 共 3,606 行 · 第 1/5 页
C
3,606 行
dolv[n] = dolv[0]; dolv += n; dolc -= n; setval(lookup("#"), putn(dolc)); return (0);}/* * execute login and newgrp directly */int dologin(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(0)); prs(t->words[0]); prs(": "); err(cp); return (1);}int doumask(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;) put1c('0' + ((i >> n) & 07)); put1c('\n'); } else { for (n = 0; *cp >= '0' && *cp <= '9'; cp++) n = n * 8 + (*cp - '0'); umask(n); } return (0);}int doexec(t)register struct op *t;{ 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);}int dodot(t)struct op *t;{ 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);}int dowait(t)struct op *t;{ 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);}int doread(t)struct op *t;{ register char *cp, **wp; 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);}int doeval(t)register struct op *t;{ return (RUN(awordlist, t->words + 1, wdchar));}int dotrap(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 = digit(*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);}int getsig(s)char *s;{ register int n; if ((n = getn(s)) < 0 || n > _NSIG) { err("trap: bad signal number"); n = 0; } return (n);}void setsig(n, f)int n;void (*f) (int);{ if (n == 0) return; if (signal(n, SIG_IGN) != SIG_IGN || ourtrap[n]) { ourtrap[n] = 1; signal(n, f); }}int getn(as)char *as;{ register char *s; int n, m; s = as; m = 1; if (*s == '-') { m = -1; s++; } for (n = 0; digit(*s); s++) n = (n * 10) + (*s - '0'); if (*s) { prs(as); err(": bad number"); } return (n * m);}int dobreak(t)struct op *t;{ return (brkcontin(t->words[1], 1));}int docontinue(t)struct op *t;{ return (brkcontin(t->words[1], 0));}static int brkcontin(cp, val)register char *cp;int val;{ register struct brkcon *bc; 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 */}int doexit(t)struct op *t;{ register char *cp; execflg = 0; if ((cp = t->words[1]) != NULL) setstatus(getn(cp)); leave(); /* NOTREACHED */}int doexport(t)struct op *t;{ rdexp(t->words + 1, export, EXPORT); return (0);}int doreadonly(t)struct op *t;{ rdexp(t->words + 1, ronly, RONLY); return (0);}static void rdexp(wp, f, key)register char **wp;void (*f) ();int key;{ if (*wp != NULL) { for (; *wp != NULL; wp++) if (checkname(*wp)) (*f) (lookup(*wp)); else badid(*wp); } else putvlist(key, 1);}static void badid(s)register char *s;{ prs(s); err(": bad identifier");}int doset(t)register struct op *t;{ register struct var *vp; register char *cp; 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);}void varput(s, out)register char *s;int out;{ if (letnum(*s)) { write(out, s, strlen(s)); write(out, "\n", 1); }}#define SECS 60L#define MINS 3600Lint dotimes(){ struct tms tbuf; times(&tbuf); prn((int) (tbuf.tms_cutime / MINS)); prs("m"); prn((int) ((tbuf.tms_cutime % MINS) / SECS)); prs("s "); prn((int) (tbuf.tms_cstime / MINS)); prs("m"); prn((int) ((tbuf.tms_cstime % MINS) / SECS)); prs("s\n"); return (0);}struct builtin { char *command; int (*fn) ();};static struct builtin builtin[] = { {":", dolabel}, {"cd", dochdir}, {"shift", doshift}, {"exec", doexec}, {"wait", dowait}, {"read", doread}, {"eval", doeval}, {"trap", dotrap}, {"break", dobreak}, {"continue", docontinue}, {"exit", doexit}, {"export", doexport}, {"readonly", doreadonly}, {"set", doset}, {".", dodot}, {"umask", doumask}, {"login", dologin}, {"newgrp", dologin}, {"times", dotimes}, {0, 0}};int (*inbuilt(s)) ()register char *s;{ register struct builtin *bp; for (bp = builtin; bp->command != NULL; bp++) if (strcmp(bp->command, s) == 0) return (bp->fn); return ((int (*)()) NULL);}/* -------- eval.c -------- *//* * ${} * `command` * blank interpretation * quoting * glob */static int expand(char *cp, struct wdblock **wbp, int f);static char *blank(int f);static int dollar(int quoted);static int grave(int quoted);static void globname(char *we, char *pp);static char *generate(char *start1, char *end1, char *middle, char *end);static int anyspcl(struct wdblock *wb);static int xstrcmp(char *p1, char *p2);static void glob0(char *a0, unsigned int a1, int a2, int (*a3) (char *, char *));static void glob1(char *base, char *lim);static void glob2(char *i, char *j);static void glob3(char *i, char *j, char *k);char **eval(ap, f)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. */char **makenv(int all){ register struct wdblock *wb; register struct var *vp; wb = NULL; for (vp = vlist; vp; vp = vp->next) if (all || vp->status & EXPORT) wb = addword(vp->name, wb); wb = addword((char *) 0, wb); return (getwords(wb));}char *evalstr(cp, f)char *cp;int f;{ struct wdblock *wb;#if __GNUC__ /* Avoid longjmp clobbering */ (void) &cp;#endif wb = NULL; if (expand(cp, &wb, f)) { if (wb == NULL || wb->w_nword == 0 || (cp = wb->w_words[0]) == NULL) cp = ""; freecell(wb); } else cp = NULL; return (cp);}static int expand(cp, wbp, f)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;{ 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; return (sp); default: if (f & DOBLANK && any(c, ifs->value)) goto loop; break; case '"': case '\'': scanequals = 0; if (INSUB()) break; for (c1 = c; (c = subgetc(c1, 1)) != c1;) { if (c == 0) break; if (c == '\'' || !any(c, "$`\"")) c |= QUOTE; *e.linep++ = c; } c = 0; } unget(c); if (!letter(c)) scanequals = 0; for (;;) { c = subgetc('"', foundequals); if (c == 0 || (f & DOBLANK && any(c, ifs->value)) || (!INSUB() && any(c, "\"'"))) { scanequals = 0; unget(c); if (any(c, "\"'")) goto loop; break; } if (scanequals) { if (c == '=') { foundequals = 1; scanequals = 0; } else if (!letnum(c)) scanequals = 0; } *e.linep++ = c; } *e.linep++ = 0; return (sp);}/* * Get characters, substituting for ` and $ */int subgetc(ec, quoted)register char ec;int quoted;{ register char c; again: c = getqc(ec); if (!INSUB() && ec != '\'') { if (c == '`') { if (grave(quoted) == 0) return (0); e.iop->task = XGRAVE; goto again; } if (c == '$' && (c = dollar(quoted)) == 0) { e.iop->task = XDOLL; goto again; } } return (c);}/* * Prepare to generate the string returned by ${} substitution. */static int dollar(quoted)int quoted;{ int otask; struct io *oiop; char *dolp; register char *s, c, *cp; struct var *vp; c = readc(); s = e.linep; if (c != '{') { *e.linep++ = c; if (letter(c)) { while ((c = readc()) != 0 && letnum(c)) if (e.linep < elinep) *e.linep++ = c; unget(c); } c = 0; } else { oiop = e.iop; otask = e.iop->task; e.iop->task = XOTHER; while ((c = subgetc('"', 0)) != 0 && c != '}' && c != '\n') if (e.linep < elinep) *e.linep++ = c; if (oiop == e.iop) e.iop->task = otask; if (c != '}') { err("unclosed ${"); gflg++; return (c); } } if (e.linep >= elinep) { err("string in ${} too long"); gflg++; e.linep -= 10; } *e.linep = 0; if (*s) { for (cp = s + 1; *cp; cp++) if (any(*cp, "=-+?")) { c = *cp; *cp++ = 0; break; } } else { cp = s; } if
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?