1 diff -u -x CVS -x work -x core -x *.core -x #* -x *~ -x *.orig -x *.rej -I $Id.*$ -I $.+BSD.*$ name.c.orig name.c 2 --- name.c.orig Fri Jun 4 02:51:02 2004 3 +++ name.c Sat Jun 19 18:42:23 2004 4 @@ -9,33 +9,36 @@ 5 6 #include "defs.h" 7 8 -PROC BOOL chkid(); 9 +LOCAL BOOL chkid(CSTRING); 10 +LOCAL VOID namwalk(NAMPTR); 11 +LOCAL STRING staknam(NAMPTR); 12 +LOCAL VOID countnam(NAMPTR); 13 +LOCAL VOID pushnam(NAMPTR); 14 + 15 +NAMNOD ps2nod = { NIL, NIL, ps2name, NIL,NIL,0}, 16 + fngnod = { NIL, NIL, fngname, NIL,NIL,0}, 17 + pathnod = { NIL, NIL, pathname, NIL,NIL,0}, 18 + ifsnod = { NIL, NIL, ifsname, NIL,NIL,0}, 19 + ps1nod = { &pathnod, &ps2nod, ps1name, NIL,NIL,0}, 20 + homenod = { &fngnod, &ifsnod, homename, NIL,NIL,0}, 21 + mailnod = { &homenod, &ps1nod, mailname, NIL,NIL,0}; 22 23 - 24 -NAMNOD ps2nod = { NIL, NIL, ps2name}, 25 - fngnod = { NIL, NIL, fngname}, 26 - pathnod = { NIL, NIL, pathname}, 27 - ifsnod = { NIL, NIL, ifsname}, 28 - ps1nod = { &pathnod, &ps2nod, ps1name}, 29 - homenod = { &fngnod, &ifsnod, homename}, 30 - mailnod = { &homenod, &ps1nod, mailname}; 31 - 32 -NAMPTR namep = &mailnod; 33 +LOCAL NAMPTR namep = &mailnod; 34 35 36 /* ======== variable and string handling ======== */ 37 38 -syslook(w,syswds) 39 +INT syslook(w,syswds) 40 STRING w; 41 SYSTAB syswds; 42 { 43 - REG CHAR first; 44 - REG STRING s; 45 + REG INT first; 46 + REG CSTRING s; 47 REG SYSPTR syscan; 48 49 syscan=syswds; first = *w; 50 51 - WHILE s=syscan->sysnam 52 + WHILE (s=syscan->sysnam)!=NIL /* GCC */ 53 DO IF first == *s 54 ANDF eq(w,s) 55 THEN return(syscan->sysval); 56 @@ -45,7 +48,7 @@ 57 return(0); 58 } 59 60 -setlist(arg,xp) 61 +VOID setlist(arg,xp) 62 REG ARGPTR arg; 63 INT xp; 64 { 65 @@ -60,52 +63,107 @@ 66 OD 67 } 68 69 +#if defined(SYSIII) 70 +INT setname(argi, xp) 71 +#else /* V7 */ 72 VOID setname(argi, xp) 73 +#endif 74 STRING argi; 75 INT xp; 76 { 77 +#if defined(SYSIII) 78 + INT rsflag=1; /* local restricted flag */ 79 +#endif 80 REG STRING argscan=argi; 81 REG NAMPTR n; 82 83 - IF letter(*argscan) 84 - THEN WHILE alphanum(*argscan) DO argscan++ OD 85 + IF letter((INT) *argscan) 86 + THEN WHILE alphanum((INT) *argscan) DO argscan++ OD 87 IF *argscan=='=' 88 + /* make name a cohesive string */ 89 THEN *argscan = 0; 90 +#if defined(SYSIII) 91 + /* restricted stuff excluded from research */ 92 + IF eq(argi, "SHELL") ANDF !(flags&rshflg) 93 + THEN argscan++; 94 + IF any('r', simple(argscan)) 95 + THEN rsflag=0; /* restricted shell */ 96 + FI 97 + argscan--; 98 + FI 99 + IF eq(argi,pathname) ANDF (flags&rshflg) /* cannot set PATH */ 100 + THEN failed(argi,restricted); 101 + /*NOTREACHED*/ 102 + ELIF eq(argi, "SHELL") ANDF (flags&rshflg) 103 + THEN failed(argi, restricted); 104 + /*NOTREACHED*/ 105 + ELSE 106 +#endif 107 n=lookup(argi); 108 *argscan++ = '='; 109 attrib(n, xp); 110 IF xp&N_ENVNAM 111 +#if defined(RENO) 112 + THEN 113 + /* 114 + * Importing IFS can be very dangerous 115 + */ 116 + IF !bcmp(argi, "IFS=", sizeof("IFS=") - 1) 117 + THEN 118 + UID uid; 119 + IF (uid = getuid())!=geteuid() ORF !uid 120 + THEN 121 +#if defined(SYSIII) 122 + return(0); 123 +#else /* V7 */ 124 + return; 125 +#endif 126 + FI 127 + FI 128 + n->namenv = n->namval = argscan; 129 +#else /* V7 */ 130 THEN n->namenv = n->namval = argscan; 131 +#endif 132 ELSE assign(n, argscan); 133 FI 134 +#if defined(SYSIII) 135 + return(rsflag); 136 + FI 137 +#else /* V7 */ 138 return; 139 +#endif 140 FI 141 FI 142 failed(argi,notid); 143 + /*NOTREACHED*/ 144 +#if defined(SYSIII) 145 + return(0); 146 +#endif 147 } 148 149 -replace(a, v) 150 +VOID replace(a, v) 151 REG STRING *a; 152 - STRING v; 153 + CSTRING v; 154 { 155 - free(*a); *a=make(v); 156 + free((BLKPTR) *a); *a=make(v); 157 } 158 159 -dfault(n,v) 160 +VOID dfault(n,v) 161 NAMPTR n; 162 - STRING v; 163 + CSTRING v; 164 { 165 IF n->namval==0 166 THEN assign(n,v) 167 FI 168 } 169 170 -assign(n,v) 171 +VOID assign(n,v) 172 NAMPTR n; 173 - STRING v; 174 + CSTRING v; 175 { 176 IF n->namflg&N_RDONLY 177 THEN failed(n->namid,wtfailed); 178 + /*NOTREACHED*/ 179 ELSE replace(&n->namval,v); 180 FI 181 } 182 @@ -114,18 +172,24 @@ 183 STRING *names; 184 { 185 FILEBLK fb; 186 - REG FILE f = &fb; 187 - REG CHAR c; 188 + REG FILEPTR f = &fb; 189 + REG INT c; 190 REG INT rc=0; 191 NAMPTR n=lookup(*names++); /* done now to avoid storage mess */ 192 - STKPTR rel=relstak(); 193 + STKPTR rel=(STKPTR) relstak(); 194 195 push(f); initf(dup(0)); 196 - IF lseek(0,0L,1)==-1 197 + IF lseek(0,(OFFSET) 0,SEEK_CUR)==-1 198 THEN f->fsiz=1; 199 FI 200 201 +#if defined(SYSIII) 202 + /* strip leading IFS characters */ 203 + WHILE (any((c=nextc(0)), ifsnod.namval)) ANDF !(eolchar(c)) DONE 204 + LOOP 205 +#else /* V7 */ 206 LOOP c=nextc(0); 207 +#endif 208 IF (*names ANDF any(c, ifsnod.namval)) ORF eolchar(c) 209 THEN zerostak(); 210 assign(n,absstak(rel)); setstak(rel); 211 @@ -135,8 +199,16 @@ 212 FI 213 IF eolchar(c) 214 THEN break; 215 +#if defined(SYSIII) 216 + ELSE /* strip imbedded IFS characters */ 217 + WHILE (any((c=nextc(0)), ifsnod.namval)) ANDF 218 + !(eolchar(c)) DONE 219 +#endif 220 FI 221 ELSE pushstak(c); 222 +#if defined(SYSIII) 223 + c=nextc(0); 224 +#endif 225 FI 226 POOL 227 WHILE n 228 @@ -145,12 +217,12 @@ 229 OD 230 231 IF eof THEN rc=1 FI 232 - lseek(0, (long)(f->fnxt-f->fend), 1); 233 + lseek(0, (OFFSET) (f->fnxt-f->fend), SEEK_CUR); 234 pop(); 235 return(rc); 236 } 237 238 -assnum(p, i) 239 +VOID assnum(p, i) 240 STRING *p; 241 INT i; 242 { 243 @@ -158,27 +230,28 @@ 244 } 245 246 STRING make(v) 247 - STRING v; 248 + CSTRING v; 249 { 250 REG STRING p; 251 252 IF v 253 - THEN movstr(v,p=alloc(length(v))); 254 + THEN movstr(v,p=(STRING) alloc((POS) length(v))); 255 return(p); 256 ELSE return(0); 257 FI 258 } 259 260 261 -NAMPTR lookup(nam) 262 - REG STRING nam; 263 +NAMPTR lookup(nam) 264 + REG CSTRING nam; 265 { 266 REG NAMPTR nscan=namep; 267 - REG NAMPTR *prev; 268 + REG NAMPTR *prev=NIL; /* GCC */ 269 INT LR; 270 271 IF !chkid(nam) 272 THEN failed(nam,notid); 273 + /*NOTREACHED*/ 274 FI 275 WHILE nscan 276 DO IF (LR=cf(nam,nscan->namid))==0 277 @@ -191,7 +264,7 @@ 278 OD 279 280 /* add name node */ 281 - nscan=alloc(sizeof *nscan); 282 + nscan=(NAMPTR) alloc(sizeof *nscan); 283 nscan->namlft=nscan->namrgt=NIL; 284 nscan->namid=make(nam); 285 nscan->namval=0; nscan->namflg=N_DEFAULT; nscan->namenv=0; 286 @@ -199,14 +272,14 @@ 287 } 288 289 LOCAL BOOL chkid(nam) 290 - STRING nam; 291 + CSTRING nam; 292 { 293 - REG CHAR * cp=nam; 294 + REG CSTRING cp=nam; 295 296 - IF !letter(*cp) 297 + IF !letter((INT) *cp) 298 THEN return(FALSE); 299 ELSE WHILE *++cp 300 - DO IF !alphanum(*cp) 301 + DO IF !alphanum((INT) *cp) 302 THEN return(FALSE); 303 FI 304 OD 305 @@ -214,9 +287,10 @@ 306 return(TRUE); 307 } 308 309 -LOCAL VOID (*namfn)(); 310 -namscan(fn) 311 - VOID (*fn)(); 312 +LOCAL VOID (*namfn)(NAMPTR); 313 + 314 +VOID namscan(fn) 315 + VOID (*fn)(NAMPTR); 316 { 317 namfn=fn; 318 namwalk(namep); 319 @@ -238,7 +312,7 @@ 320 REG STRING s; 321 322 sigchk(); 323 - IF s=n->namval 324 + IF (s=n->namval)!=NIL /* GCC */ 325 THEN prs(n->namid); 326 prc('='); prs(s); 327 newline(); 328 @@ -253,16 +327,16 @@ 329 p=movstr(n->namid,staktop); 330 p=movstr("=",p); 331 p=movstr(n->namval,p); 332 - return(getstak(p+1-ADR(stakbot))); 333 + return(getstak((POS) (p+1-ADR(stakbot)))); 334 } 335 336 VOID exname(n) 337 REG NAMPTR n; 338 { 339 IF n->namflg&N_EXPORT 340 - THEN free(n->namenv); 341 + THEN free((BLKPTR) n->namenv); 342 n->namenv = make(n->namval); 343 - ELSE free(n->namval); 344 + ELSE free((BLKPTR) n->namval); 345 n->namval = make(n->namenv); 346 FI 347 } 348 @@ -281,6 +355,16 @@ 349 FI 350 } 351 352 +#if defined(SYSIII) 353 +INT getenv() 354 +{ 355 + INT rsflag=1; /* local restricted flag */ 356 + REG STRING *e=environ; 357 + 358 + WHILE *e DO rsflag=setname(*e++, N_ENVNAM) & rsflag OD 359 + return(rsflag); 360 +} 361 +#else /* V7 */ 362 VOID getenv() 363 { 364 REG STRING *e=environ; 365 @@ -288,18 +372,20 @@ 366 WHILE *e 367 DO setname(*e++, N_ENVNAM) OD 368 } 369 +#endif 370 371 -LOCAL INT namec; 372 +LOCAL POS namec; 373 374 -VOID countnam(n) 375 +LOCAL VOID countnam(n) 376 NAMPTR n; 377 { 378 + n=n; /* GCC */ 379 namec++; 380 } 381 382 LOCAL STRING *argnam; 383 384 -VOID pushnam(n) 385 +LOCAL VOID pushnam(n) 386 NAMPTR n; 387 { 388 IF n->namval 389 @@ -313,7 +399,7 @@ 390 391 namec=0; 392 namscan(countnam); 393 - argnam = er = getstak(namec*BYTESPERWORD+BYTESPERWORD); 394 + argnam = er = (STRING *) getstak(namec*BYTESPERWORD+BYTESPERWORD); 395 namscan(pushnam); 396 *argnam++ = 0; 397 return(er); 398