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

📄 sh3.c

📁 操作系统源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	register int i;	register char *sp, *tp;	int eacces = 0, asis = 0;	sp = any('/', c)? "": path->value;	asis = *sp == '\0';	while (asis || *sp != '\0') {		asis = 0;		tp = e.linep;		for (; *sp != '\0'; tp++)			if ((*tp = *sp++) == ':') {				asis = *sp == '\0';				break;			}		if (tp != e.linep)			*tp++ = '/';		for (i = 0; (*tp++ = c[i++]) != '\0';)			;		execve(e.linep, v, envp);		switch (errno) {		case ENOEXEC:			*v = e.linep;			tp = *--v;			*v = e.linep;			execve("/bin/sh", v, envp);			*v = tp;			return("no Shell");		case ENOMEM:			return("program too big");		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'. */intrun(argp, f)struct ioarg *argp;int (*f)();{	struct op *otree;	struct wdblock *swdlist;	struct wdblock *siolist;	jmp_buf ev, rt;	xint *ofail;	int rv;	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 -------- *//* #include "sh.h" *//* * built-in commands: doX */intdolabel(){	return(0);}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);}intdoshift(t)register struct op *t;{	register 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 */intdologin(t)struct op *t;{	register char *cp;	if (talking) {		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);}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));		putc('\n');	} else {		for (n=0; *cp>='0' && *cp<='9'; cp++)			n = n*8 + (*cp-'0');		umask(n);	}	return(0);}intdoexec(t)register struct op *t;{	register 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);}intdodot(t)struct op *t;{	register 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);}intdowait(t)struct op *t;{	register 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);}intdoread(t)struct op *t;{	register char *cp, **wp;	register nb;	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);}intdoeval(t)register struct op *t;{	return(RUN(awordlist, t->words+1, wdchar));}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 = digit(*t->words[1]);	for (i = resetsig ? 1 : 2; t->words[i] != NULL; ++i) {		n = getsig(t->words[i]);		xfree(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 (talking)				if (n == SIGINT)					setsig(n, onintr);				else					setsig(n, n == SIGQUIT ? SIG_IGN 							       : SIG_DFL);			else				setsig(n, SIG_DFL);		}	}	return(0);}intgetsig(s)char *s;{	register int n;	if ((n = getn(s)) < 0 || n > _NSIG) {		err("trap: bad signal number");		n = 0;	}	return(n);}voidsetsig(n, f)register n;_PROTOTYPE(void (*f), (int));{	if (n == 0)		return;	if (signal(n, SIG_IGN) != SIG_IGN || ourtrap[n]) {		ourtrap[n] = 1;		signal(n, f);	}}intgetn(as)char *as;{	register char *s;	register 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);}intdobreak(t)struct op *t;{	return(brkcontin(t->words[1], 1));}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 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 */}intdoexit(t)struct op *t;{	register char *cp;	execflg = 0;	if ((cp = t->words[1]) != NULL)		setstatus(getn(cp));	leave();	/* NOTREACHED */}intdoexport(t)struct op *t;{	rdexp(t->words+1, export, EXPORT);	return(0);}intdoreadonly(t)struct op *t;{	rdexp(t->words+1, ronly, RONLY);	return(0);}static voidrdexp(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 voidbadid(s)register char *s;{	prs(s);	err(": bad identifier");}intdoset(t)register struct op *t;{	register struct var *vp;	register char *cp;	register 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 (!talking)						flag['e']++;					break;				default:					if (*cp>='a' && *cp<='z')						flag[*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);}voidvarput(s, out)register char *s;int out;{	if (letnum(*s)) {		write(out, s, strlen(s));		write(out, "\n", 1);	}}#define	SECS	60L#define	MINS	3600Lintdotimes(){	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,};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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -