|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)name.c 4.4 10/31/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: ! 16: PROC BOOL chkid(); ! 17: ! 18: ! 19: NAMNOD ps2nod = { NIL, NIL, ps2name}, ! 20: fngnod = { NIL, NIL, fngname}, ! 21: pathnod = { NIL, NIL, pathname}, ! 22: ifsnod = { NIL, NIL, ifsname}, ! 23: ps1nod = { &pathnod, &ps2nod, ps1name}, ! 24: homenod = { &fngnod, &ifsnod, homename}, ! 25: mailnod = { &homenod, &ps1nod, mailname}; ! 26: ! 27: NAMPTR namep = &mailnod; ! 28: ! 29: ! 30: /* ======== variable and string handling ======== */ ! 31: ! 32: syslook(w,syswds) ! 33: STRING w; ! 34: SYSTAB syswds; ! 35: { ! 36: REG CHAR first; ! 37: REG STRING s; ! 38: REG SYSPTR syscan; ! 39: ! 40: syscan=syswds; first = *w; ! 41: ! 42: WHILE s=syscan->sysnam ! 43: DO IF first == *s ! 44: ANDF eq(w,s) ! 45: THEN return(syscan->sysval); ! 46: FI ! 47: syscan++; ! 48: OD ! 49: return(0); ! 50: } ! 51: ! 52: setlist(arg,xp) ! 53: REG ARGPTR arg; ! 54: INT xp; ! 55: { ! 56: WHILE arg ! 57: DO REG STRING s=mactrim(arg->argval); ! 58: setname(s, xp); ! 59: arg=arg->argnxt; ! 60: IF flags&execpr ! 61: THEN prs(s); ! 62: IF arg THEN blank(); ELSE newline(); FI ! 63: FI ! 64: OD ! 65: } ! 66: ! 67: VOID setname(argi, xp) ! 68: STRING argi; ! 69: INT xp; ! 70: { ! 71: REG STRING argscan=argi; ! 72: REG NAMPTR n; ! 73: ! 74: IF letter(*argscan) ! 75: THEN WHILE alphanum(*argscan) DO argscan++ OD ! 76: IF *argscan=='=' ! 77: THEN *argscan = 0; ! 78: n=lookup(argi); ! 79: *argscan++ = '='; ! 80: attrib(n, xp); ! 81: IF xp&N_ENVNAM ! 82: THEN ! 83: /* ! 84: * Importing IFS can be very dangerous ! 85: */ ! 86: IF !bcmp(argi, "IFS=", sizeof("IFS=") - 1) ! 87: THEN ! 88: int uid; ! 89: IF (uid = getuid())!=geteuid() ORF !uid ! 90: THEN ! 91: return; ! 92: FI ! 93: FI ! 94: n->namenv = n->namval = argscan; ! 95: ELSE assign(n, argscan); ! 96: FI ! 97: return; ! 98: FI ! 99: FI ! 100: failed(argi,notid); ! 101: } ! 102: ! 103: replace(a, v) ! 104: REG STRING *a; ! 105: STRING v; ! 106: { ! 107: free(*a); *a=make(v); ! 108: } ! 109: ! 110: dfault(n,v) ! 111: NAMPTR n; ! 112: STRING v; ! 113: { ! 114: IF n->namval==0 ! 115: THEN assign(n,v) ! 116: FI ! 117: } ! 118: ! 119: assign(n,v) ! 120: NAMPTR n; ! 121: STRING v; ! 122: { ! 123: IF n->namflg&N_RDONLY ! 124: THEN failed(n->namid,wtfailed); ! 125: ELSE replace(&n->namval,v); ! 126: FI ! 127: } ! 128: ! 129: INT readvar(names) ! 130: STRING *names; ! 131: { ! 132: FILEBLK fb; ! 133: REG FILE f = &fb; ! 134: REG CHAR c; ! 135: REG INT rc=0; ! 136: NAMPTR n=lookup(*names++); /* done now to avoid storage mess */ ! 137: STKPTR rel=relstak(); ! 138: ! 139: push(f); initf(dup(0)); ! 140: IF lseek(0,0L,1)==-1 ! 141: THEN f->fsiz=1; ! 142: FI ! 143: ! 144: LOOP c=nextc(0); ! 145: IF (*names ANDF any(c, ifsnod.namval)) ORF eolchar(c) ! 146: THEN zerostak(); ! 147: assign(n,absstak(rel)); setstak(rel); ! 148: IF *names ! 149: THEN n=lookup(*names++); ! 150: ELSE n=0; ! 151: FI ! 152: IF eolchar(c) ! 153: THEN break; ! 154: FI ! 155: ELSE pushstak(c); ! 156: FI ! 157: POOL ! 158: WHILE n ! 159: DO assign(n, nullstr); ! 160: IF *names THEN n=lookup(*names++); ELSE n=0; FI ! 161: OD ! 162: ! 163: IF eof THEN rc=1 FI ! 164: lseek(0, (long)(f->fnxt-f->fend), 1); ! 165: pop(); ! 166: return(rc); ! 167: } ! 168: ! 169: assnum(p, i) ! 170: STRING *p; ! 171: INT i; ! 172: { ! 173: itos(i); replace(p,numbuf); ! 174: } ! 175: ! 176: STRING make(v) ! 177: STRING v; ! 178: { ! 179: REG STRING p; ! 180: ! 181: IF v ! 182: THEN movstr(v,p=alloc(length(v))); ! 183: return(p); ! 184: ELSE return(0); ! 185: FI ! 186: } ! 187: ! 188: ! 189: NAMPTR lookup(nam) ! 190: REG STRING nam; ! 191: { ! 192: REG NAMPTR nscan=namep; ! 193: REG NAMPTR *prev; ! 194: INT LR; ! 195: ! 196: IF !chkid(nam) ! 197: THEN failed(nam,notid); ! 198: FI ! 199: WHILE nscan ! 200: DO IF (LR=cf(nam,nscan->namid))==0 ! 201: THEN return(nscan); ! 202: ELIF LR<0 ! 203: THEN prev = &(nscan->namlft); ! 204: ELSE prev = &(nscan->namrgt); ! 205: FI ! 206: nscan = *prev; ! 207: OD ! 208: ! 209: /* add name node */ ! 210: nscan=alloc(sizeof *nscan); ! 211: nscan->namlft=nscan->namrgt=NIL; ! 212: nscan->namid=make(nam); ! 213: nscan->namval=0; nscan->namflg=N_DEFAULT; nscan->namenv=0; ! 214: return(*prev = nscan); ! 215: } ! 216: ! 217: LOCAL BOOL chkid(nam) ! 218: STRING nam; ! 219: { ! 220: REG CHAR * cp=nam; ! 221: ! 222: IF !letter(*cp) ! 223: THEN return(FALSE); ! 224: ELSE WHILE *++cp ! 225: DO IF !alphanum(*cp) ! 226: THEN return(FALSE); ! 227: FI ! 228: OD ! 229: FI ! 230: return(TRUE); ! 231: } ! 232: ! 233: LOCAL VOID (*namfn)(); ! 234: namscan(fn) ! 235: VOID (*fn)(); ! 236: { ! 237: namfn=fn; ! 238: namwalk(namep); ! 239: } ! 240: ! 241: LOCAL VOID namwalk(np) ! 242: REG NAMPTR np; ! 243: { ! 244: IF np ! 245: THEN namwalk(np->namlft); ! 246: (*namfn)(np); ! 247: namwalk(np->namrgt); ! 248: FI ! 249: } ! 250: ! 251: VOID printnam(n) ! 252: NAMPTR n; ! 253: { ! 254: REG STRING s; ! 255: ! 256: sigchk(); ! 257: IF s=n->namval ! 258: THEN prs(n->namid); ! 259: prc('='); prs(s); ! 260: newline(); ! 261: FI ! 262: } ! 263: ! 264: LOCAL STRING staknam(n) ! 265: REG NAMPTR n; ! 266: { ! 267: REG STRING p; ! 268: ! 269: p=movstr(n->namid,staktop); ! 270: p=movstr("=",p); ! 271: p=movstr(n->namval,p); ! 272: return(getstak(p+1-ADR(stakbot))); ! 273: } ! 274: ! 275: VOID exname(n) ! 276: REG NAMPTR n; ! 277: { ! 278: IF n->namflg&N_EXPORT ! 279: THEN free(n->namenv); ! 280: n->namenv = make(n->namval); ! 281: ELSE free(n->namval); ! 282: n->namval = make(n->namenv); ! 283: FI ! 284: } ! 285: ! 286: VOID printflg(n) ! 287: REG NAMPTR n; ! 288: { ! 289: IF n->namflg&N_EXPORT ! 290: THEN prs(export); blank(); ! 291: FI ! 292: IF n->namflg&N_RDONLY ! 293: THEN prs(readonly); blank(); ! 294: FI ! 295: IF n->namflg&(N_EXPORT|N_RDONLY) ! 296: THEN prs(n->namid); newline(); ! 297: FI ! 298: } ! 299: ! 300: VOID setupenv() ! 301: { ! 302: REG STRING *e=environ; ! 303: ! 304: WHILE *e ! 305: DO setname(*e++, N_ENVNAM) OD ! 306: } ! 307: ! 308: LOCAL INT namec; ! 309: ! 310: VOID countnam(n) ! 311: NAMPTR n; ! 312: { ! 313: namec++; ! 314: } ! 315: ! 316: LOCAL STRING *argnam; ! 317: ! 318: VOID pushnam(n) ! 319: NAMPTR n; ! 320: { ! 321: IF n->namval ! 322: THEN *argnam++ = staknam(n); ! 323: FI ! 324: } ! 325: ! 326: STRING *setenv() ! 327: { ! 328: REG STRING *er; ! 329: ! 330: namec=0; ! 331: namscan(countnam); ! 332: argnam = er = getstak(namec*BYTESPERWORD+BYTESPERWORD); ! 333: namscan(pushnam); ! 334: *argnam++ = 0; ! 335: return(er); ! 336: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.