1 #ifndef lint 2 static char sccsid[] = "@(#)main.c 4.3 03/19/85"; 3 #endif 4 5 # 6 /* 7 * UNIX shell 8 * 9 * S. R. Bourne 10 * Bell Telephone Laboratories 11 * 12 */ 13 14 #include "defs.h" 15 #include "sym.h" 16 #include "timeout.h" 17 #include <sys/types.h> 18 #include <sys/stat.h> 19 #include <sgtty.h> 20 #include <signal.h> 21 22 UFD output = 2; 23 LOCAL BOOL beenhere = FALSE; 24 CHAR tmpout[20] = "/tmp/sh-"; 25 FILEBLK stdfile; 26 FILE standin = &stdfile; 27 #ifdef stupid 28 #include <execargs.h> 29 #endif 30 31 PROC VOID exfile(); 32 33 34 35 36 main(c, v) 37 INT c; 38 STRING v[]; 39 { 40 REG INT rflag=ttyflg; 41 42 /* initialise storage allocation */ 43 stdsigs(); 44 setbrk(BRKINCR); 45 addblok((POS)0); 46 47 /* set names from userenv */ 48 setupenv(); 49 50 /* look for restricted */ 51 /* IF c>0 ANDF any('r', *v) THEN rflag=0 FI */ 52 53 /* look for options */ 54 dolc=options(c,v); 55 IF dolc<2 THEN flags |= stdflg FI 56 IF (flags&stdflg)==0 57 THEN dolc--; 58 FI 59 dolv=v+c-dolc; dolc--; 60 61 /* return here for shell file execution */ 62 setjmp(subshell); 63 64 /* number of positional parameters */ 65 assnum(&dolladr,dolc); 66 cmdadr=dolv[0]; 67 68 /* set pidname */ 69 assnum(&pidadr, getpid()); 70 71 /* set up temp file names */ 72 settmp(); 73 74 /* default ifs */ 75 dfault(&ifsnod, sptbnl); 76 77 IF (beenhere++)==FALSE 78 THEN /* ? profile */ 79 IF *cmdadr=='-' 80 ANDF (input=pathopen(nullstr, profile))>=0 81 THEN exfile(rflag); flags &= ~ttyflg; 82 FI 83 IF rflag==0 THEN flags |= rshflg FI 84 85 /* open input file if specified */ 86 IF comdiv 87 THEN estabf(comdiv); input = -1; 88 ELSE input=((flags&stdflg) ? 0 : chkopen(cmdadr)); 89 comdiv--; 90 FI 91 #ifdef stupid 92 ELSE *execargs=dolv; /* for `ps' cmd */ 93 #endif 94 FI 95 96 exfile(0); 97 done(); 98 } 99 100 LOCAL VOID exfile(prof) 101 BOOL prof; 102 { 103 REG L_INT mailtime = 0; 104 REG INT userid; 105 struct stat statb; 106 107 /* move input */ 108 IF input>0 109 THEN Ldup(input,INIO); 110 input=INIO; 111 FI 112 113 /* move output to safe place */ 114 IF output==2 115 THEN Ldup(dup(2),OTIO); 116 output=OTIO; 117 FI 118 119 userid=getuid(); 120 121 /* decide whether interactive */ 122 IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF gtty(output,&statb)==0 ANDF gtty(input,&statb)==0) 123 THEN dfault(&ps1nod, (userid?stdprompt:supprompt)); 124 dfault(&ps2nod, readmsg); 125 flags |= ttyflg|prompt; ignsig(KILL); 126 /* 127 { 128 #include <signal.h> 129 signal(SIGTTIN, SIG_IGN); 130 signal(SIGTTOU, SIG_IGN); 131 signal(SIGTSTP, SIG_IGN); 132 } 133 */ 134 ELSE flags |= prof; flags &= ~prompt; 135 FI 136 137 IF setjmp(errshell) ANDF prof 138 THEN close(input); return; 139 FI 140 141 /* error return here */ 142 loopcnt=breakcnt=peekc=0; iopend=0; 143 IF input>=0 THEN initf(input) FI 144 145 /* command loop */ 146 LOOP tdystak(0); 147 stakchk(); /* may reduce sbrk */ 148 exitset(); 149 IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof 150 THEN IF mailnod.namval 151 ANDF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size 152 ANDF (statb.st_mtime != mailtime) 153 ANDF mailtime 154 THEN prs(mailmsg) 155 FI 156 mailtime=statb.st_mtime; 157 prs(ps1nod.namval); 158 FI 159 160 trapnote=0; peekc=readc(); 161 IF eof 162 THEN return; 163 FI 164 execute(cmd(NL,MTFLG),0); 165 eof |= (flags&oneflg); 166 POOL 167 } 168 169 chkpr(eor) 170 char eor; 171 { 172 IF (flags&prompt) ANDF standin->fstak==0 ANDF eor==NL 173 THEN prs(ps2nod.namval); 174 FI 175 } 176 177 settmp() 178 { 179 itos(getpid()); serial=0; 180 tmpnam=movstr(numbuf,&tmpout[TMPNAM]); 181 } 182 183 Ldup(fa, fb) 184 REG INT fa, fb; 185 { 186 dup2(fa, fb); 187 close(fa); 188 ioctl(fb, FIOCLEX, 0); 189 } 190