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

📄 main.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#/* * UNIX shell * * S. R. Bourne * Bell Telephone Laboratories * */#include	"defs.h"#include	"dup.h"#include	"sym.h"#include	"timeout.h"#include	<sys/types.h>#include	<sys/stat.h>#include	<sgtty.h>UFD		output = 2;LOCAL BOOL	beenhere = FALSE;CHAR		tmpout[20] = "/tmp/sh-";FILEBLK		stdfile;FILE		standin = &stdfile;#include	<execargs.h>PROC VOID	exfile();main(c, v)	INT		c;	STRING		v[];{	REG INT		rflag=ttyflg;	/* initialise storage allocation */	stdsigs();	setbrk(BRKINCR);	addblok((POS)0);	/* set names from userenv */	getenv();	/* look for restricted *//*	IF c>0 ANDF any('r', *v) THEN rflag=0 FI */	/* look for options */	dolc=options(c,v);	IF dolc<2 THEN flags |= stdflg FI	IF (flags&stdflg)==0	THEN	dolc--;	FI	dolv=v+c-dolc; dolc--;	/* return here for shell file execution */	setjmp(subshell);	/* number of positional parameters */	assnum(&dolladr,dolc);	cmdadr=dolv[0];	/* set pidname */	assnum(&pidadr, getpid());	/* set up temp file names */	settmp();	/* default ifs */	dfault(&ifsnod, sptbnl);	IF (beenhere++)==FALSE	THEN	/* ? profile */		IF *cmdadr=='-'		    ANDF (input=pathopen(nullstr, profile))>=0		THEN	exfile(rflag); flags &= ~ttyflg;		FI		IF rflag==0 THEN flags |= rshflg FI		/* open input file if specified */		IF comdiv		THEN	estabf(comdiv); input = -1;		ELSE	input=((flags&stdflg) ? 0 : chkopen(cmdadr));			comdiv--;		FI	ELSE	*execargs=dolv;	/* for `ps' cmd */	FI	exfile(0);	done();}LOCAL VOID	exfile(prof)BOOL		prof;{	REG L_INT	mailtime = 0;	REG INT		userid;	struct stat	statb;	/* move input */	IF input>0	THEN	Ldup(input,INIO);		input=INIO;	FI	/* move output to safe place */	IF output==2	THEN	Ldup(dup(2),OTIO);		output=OTIO;	FI	userid=getuid();	/* decide whether interactive */	IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF gtty(output,&statb)==0 ANDF gtty(input,&statb)==0)	THEN	dfault(&ps1nod, (userid?stdprompt:supprompt));		dfault(&ps2nod, readmsg);		flags |= ttyflg|prompt; ignsig(KILL);	ELSE	flags |= prof; flags &= ~prompt;	FI	IF setjmp(errshell) ANDF prof	THEN	close(input); return;	FI	/* error return here */	loopcnt=breakcnt=peekc=0; iopend=0;	IF input>=0 THEN initf(input) FI	/* command loop */	LOOP	tdystak(0);		stakchk(); /* may reduce sbrk */		exitset();		IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof		THEN	IF mailnod.namval			    ANDF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size			    ANDF (statb.st_mtime != mailtime)			    ANDF mailtime			THEN	prs(mailmsg)			FI			mailtime=statb.st_mtime;			prs(ps1nod.namval); alarm(TIMEOUT); flags |= waiting;		FI		trapnote=0; peekc=readc();		IF eof		THEN	return;		FI		alarm(0); flags &= ~waiting;		execute(cmd(NL,MTFLG),0);		eof |= (flags&oneflg);	POOL}chkpr(eor)char eor;{	IF (flags&prompt) ANDF standin->fstak==0 ANDF eor==NL	THEN	prs(ps2nod.namval);	FI}settmp(){	itos(getpid()); serial=0;	tmpnam=movstr(numbuf,&tmpout[TMPNAM]);}Ldup(fa, fb)	REG INT		fa, fb;{	dup(fa|DUPFLG, fb);	close(fa);	ioctl(fb, FIOCLEX, 0);}

⌨️ 快捷键说明

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