1 diff -u -x CVS -x work -x core -x *.core -x #* -x *~ -x *.orig -x *.rej -I $Id.*$ -I $.+BSD.*$ main.c.orig main.c 2 --- main.c.orig Fri Jun 4 02:51:01 2004 3 +++ main.c Sat Jun 19 18:42:23 2004 4 @@ -8,30 +8,43 @@ 5 */ 6 7 #include "defs.h" 8 -#include "dup.h" 9 #include "sym.h" 10 #include "timeout.h" 11 -#include <sys/types.h> 12 -#include <sys/stat.h> 13 -#include <sgtty.h> 14 - 15 -UFD output = 2; 16 -LOCAL BOOL beenhere = FALSE; 17 -CHAR tmpout[20] = "/tmp/sh-"; 18 -FILEBLK stdfile; 19 -FILE standin = &stdfile; 20 +#include "pathnames.h" 21 +#ifdef stupid 22 #include <execargs.h> 23 +#endif 24 25 -PROC VOID exfile(); 26 +LOCAL VOID exfile(BOOL); 27 +LOCAL VOID Ldup(INT, INT); 28 29 +LOCAL BOOL beenhere = FALSE; 30 +LOCAL FILEBLK stdfile; 31 32 +UFD output = 2; 33 +CHAR tmpout[20] = _PATH_TMPOUT; 34 +STRING tmpnam; 35 +FILEPTR standin = &stdfile; 36 +INT dolc; 37 +STRING *dolv; 38 +STRING dolladr; 39 +STRING cmdadr; 40 +STRING pidadr; 41 +STRING comdiv; 42 +INT flags; 43 +INT serial; 44 +jmp_buf subshell; 45 +jmp_buf errshell; 46 47 48 -main(c, v) 49 +INT main(c, v) 50 INT c; 51 STRING v[]; 52 { 53 REG INT rflag=ttyflg; 54 +#if defined(SYSIII) 55 + INT rsflag=1; /* local restricted flag */ 56 +#endif 57 58 /* initialise storage allocation */ 59 stdsigs(); 60 @@ -39,42 +52,72 @@ 61 addblok((POS)0); 62 63 /* set names from userenv */ 64 +#if !defined(SYSIII) 65 getenv(); 66 +#else /* SYSIII */ 67 + /* 'rsflag' is non-zero if SHELL variable is 68 + set in environment and contains an 'r' in 69 + the simple file part of the value. */ 70 + rsflag=getenv(); 71 72 /* look for restricted */ 73 -/* IF c>0 ANDF any('r', *v) THEN rflag=0 FI */ 74 - 75 + /* a shell is also restricted if argv(0) has 76 + an 'r' in its simple name */ 77 + IF c>0 ANDF any('r', simple(*v)) THEN rflag=0 FI 78 +#endif 79 /* look for options */ 80 + /* dolc is $# */ 81 dolc=options(c,v); 82 IF dolc<2 THEN flags |= stdflg FI 83 +#if defined(SYSIII) 84 + IF dolc < 2 85 + THEN REG STRING flagc = flagadr; 86 + WHILE *flagc DO flagc++ OD 87 + *flagc = STDFLG; 88 + FI 89 +#endif 90 IF (flags&stdflg)==0 91 THEN dolc--; 92 FI 93 dolv=v+c-dolc; dolc--; 94 95 /* return here for shell file execution */ 96 + /* but not for parenthesis subshells */ 97 setjmp(subshell); 98 99 - /* number of positional parameters */ 100 + /* number of positional parameters '$#' */ 101 assnum(&dolladr,dolc); 102 + /* comadr is $0 */ 103 cmdadr=dolv[0]; 104 105 - /* set pidname */ 106 + /* set pidname '$$' */ 107 assnum(&pidadr, getpid()); 108 109 /* set up temp file names */ 110 settmp(); 111 112 - /* default ifs */ 113 + /* default internal field separators - $IFS */ 114 dfault(&ifsnod, sptbnl); 115 116 IF (beenhere++)==FALSE 117 THEN /* ? profile */ 118 +#if defined(SYSIII) 119 + IF *simple(cmdadr) == '-' 120 + THEN IF (input=pathopen(nullstr, sysprofile))>=0 121 + THEN exfile(rflag); /* file exists */ 122 + FI 123 + IF (input=pathopen(homenod.namenv, profile))>=0 124 + THEN exfile(rflag); flags &= ~ttyflg; 125 + FI 126 + FI 127 + IF rsflag==0 ORF rflag==0 THEN flags |= rshflg FI 128 +#else /* V7 */ 129 IF *cmdadr=='-' 130 ANDF (input=pathopen(nullstr, profile))>=0 131 THEN exfile(rflag); flags &= ~ttyflg; 132 FI 133 IF rflag==0 THEN flags |= rshflg FI 134 +#endif 135 136 /* open input file if specified */ 137 IF comdiv 138 @@ -82,18 +125,22 @@ 139 ELSE input=((flags&stdflg) ? 0 : chkopen(cmdadr)); 140 comdiv--; 141 FI 142 - ELSE *execargs=dolv; /* for `ps' cmd */ 143 +#ifdef stupid 144 + ELSE *execargs=(STRING) dolv; /* for `ps' cmd */ 145 +#endif 146 FI 147 148 exfile(0); 149 done(); 150 + /*NOTREACHED*/ 151 + return(exitval); /* GCC */ 152 } 153 154 LOCAL VOID exfile(prof) 155 -BOOL prof; 156 + BOOL prof; 157 { 158 - REG L_INT mailtime = 0; 159 - REG INT userid; 160 + REG TIME mailtime = 0; 161 + REG UID userid; 162 struct stat statb; 163 164 /* move input */ 165 @@ -108,10 +155,14 @@ 166 output=OTIO; 167 FI 168 169 +#if defined(SYSIII) 170 + userid=geteuid(); 171 +#else /* V7 */ 172 userid=getuid(); 173 +#endif 174 175 /* decide whether interactive */ 176 - IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF gtty(output,&statb)==0 ANDF gtty(input,&statb)==0) 177 + IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF isatty(output) ANDF isatty(input)) 178 THEN dfault(&ps1nod, (userid?stdprompt:supprompt)); 179 dfault(&ps2nod, readmsg); 180 flags |= ttyflg|prompt; ignsig(KILL); 181 @@ -132,43 +183,63 @@ 182 exitset(); 183 IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof 184 THEN IF mailnod.namval 185 +#if defined(SYSIII) 186 + THEN IF stat(mailnod.namval,&statb)>=0 187 + THEN IF statb.st_size 188 + ANDF mailtime 189 + ANDF (statb.st_mtime != mailtime) 190 + THEN prs(mailmsg) 191 + FI 192 + mailtime=statb.st_mtime; 193 + ELIF mailtime==0 194 + THEN mailtime=1 195 + FI 196 + FI 197 +#else /* V7 */ 198 ANDF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size 199 ANDF (statb.st_mtime != mailtime) 200 ANDF mailtime 201 THEN prs(mailmsg) 202 FI 203 mailtime=statb.st_mtime; 204 +#endif 205 +#if TIMEOUT > 0 206 prs(ps1nod.namval); alarm(TIMEOUT); flags |= waiting; 207 +#else /* !TIMEOUT */ 208 + prs(ps1nod.namval); 209 +#endif 210 FI 211 212 trapnote=0; peekc=readc(); 213 IF eof 214 THEN return; 215 FI 216 +#if TIMEOUT > 0 217 alarm(0); flags &= ~waiting; 218 - execute(cmd(NL,MTFLG),0); 219 +#endif 220 + execute(cmd(NL,MTFLG),0,0,0); 221 eof |= (flags&oneflg); 222 POOL 223 } 224 225 -chkpr(eor) 226 -char eor; 227 +VOID chkpr(eor) 228 + INT eor; 229 { 230 IF (flags&prompt) ANDF standin->fstak==0 ANDF eor==NL 231 THEN prs(ps2nod.namval); 232 FI 233 } 234 235 -settmp() 236 +VOID settmp() 237 { 238 itos(getpid()); serial=0; 239 tmpnam=movstr(numbuf,&tmpout[TMPNAM]); 240 } 241 242 -Ldup(fa, fb) 243 +LOCAL VOID Ldup(fa, fb) 244 REG INT fa, fb; 245 { 246 - dup(fa|DUPFLG, fb); 247 + dup2(fa, fb); 248 close(fa); 249 - ioctl(fb, FIOCLEX, 0); 250 + fcntl(fb, F_SETFD, FD_CLOEXEC); 251 } 252