⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msh.c

📁 shell-HHARM9200.rar 华恒 AT91rm9200 中Busybox shell的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			*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) &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. */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 + -