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