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) &wp;	(void) &ap;#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 + -
显示快捷键?