180753333Ssam #ifndef lint
2*e80642c4Sbostic static char sccsid[] = "@(#)name.c 4.5 05/21/93";
380753333Ssam #endif
49ca57245Smckusick
5*e80642c4Sbostic #include <unistd.h>
6*e80642c4Sbostic
79ca57245Smckusick #
89ca57245Smckusick /*
99ca57245Smckusick * UNIX shell
109ca57245Smckusick *
119ca57245Smckusick * S. R. Bourne
129ca57245Smckusick * Bell Telephone Laboratories
139ca57245Smckusick *
149ca57245Smckusick */
159ca57245Smckusick
169ca57245Smckusick #include "defs.h"
179ca57245Smckusick
189ca57245Smckusick PROC BOOL chkid();
199ca57245Smckusick
209ca57245Smckusick
219ca57245Smckusick NAMNOD ps2nod = { NIL, NIL, ps2name},
229ca57245Smckusick fngnod = { NIL, NIL, fngname},
239ca57245Smckusick pathnod = { NIL, NIL, pathname},
249ca57245Smckusick ifsnod = { NIL, NIL, ifsname},
259ca57245Smckusick ps1nod = { &pathnod, &ps2nod, ps1name},
269ca57245Smckusick homenod = { &fngnod, &ifsnod, homename},
279ca57245Smckusick mailnod = { &homenod, &ps1nod, mailname};
289ca57245Smckusick
299ca57245Smckusick NAMPTR namep = &mailnod;
309ca57245Smckusick
319ca57245Smckusick
329ca57245Smckusick /* ======== variable and string handling ======== */
339ca57245Smckusick
syslook(w,syswds)349ca57245Smckusick syslook(w,syswds)
359ca57245Smckusick STRING w;
369ca57245Smckusick SYSTAB syswds;
379ca57245Smckusick {
389ca57245Smckusick REG CHAR first;
399ca57245Smckusick REG STRING s;
409ca57245Smckusick REG SYSPTR syscan;
419ca57245Smckusick
429ca57245Smckusick syscan=syswds; first = *w;
439ca57245Smckusick
449ca57245Smckusick WHILE s=syscan->sysnam
459ca57245Smckusick DO IF first == *s
469ca57245Smckusick ANDF eq(w,s)
479ca57245Smckusick THEN return(syscan->sysval);
489ca57245Smckusick FI
499ca57245Smckusick syscan++;
509ca57245Smckusick OD
519ca57245Smckusick return(0);
529ca57245Smckusick }
539ca57245Smckusick
setlist(arg,xp)549ca57245Smckusick setlist(arg,xp)
559ca57245Smckusick REG ARGPTR arg;
569ca57245Smckusick INT xp;
579ca57245Smckusick {
589ca57245Smckusick WHILE arg
599ca57245Smckusick DO REG STRING s=mactrim(arg->argval);
609ca57245Smckusick setname(s, xp);
619ca57245Smckusick arg=arg->argnxt;
629ca57245Smckusick IF flags&execpr
639ca57245Smckusick THEN prs(s);
649ca57245Smckusick IF arg THEN blank(); ELSE newline(); FI
659ca57245Smckusick FI
669ca57245Smckusick OD
679ca57245Smckusick }
689ca57245Smckusick
setname(argi,xp)699ca57245Smckusick VOID setname(argi, xp)
709ca57245Smckusick STRING argi;
719ca57245Smckusick INT xp;
729ca57245Smckusick {
739ca57245Smckusick REG STRING argscan=argi;
749ca57245Smckusick REG NAMPTR n;
759ca57245Smckusick
769ca57245Smckusick IF letter(*argscan)
779ca57245Smckusick THEN WHILE alphanum(*argscan) DO argscan++ OD
789ca57245Smckusick IF *argscan=='='
799ca57245Smckusick THEN *argscan = 0;
809ca57245Smckusick n=lookup(argi);
819ca57245Smckusick *argscan++ = '=';
829ca57245Smckusick attrib(n, xp);
839ca57245Smckusick IF xp&N_ENVNAM
842d9956b5Sbloom THEN
852d9956b5Sbloom /*
862d9956b5Sbloom * Importing IFS can be very dangerous
872d9956b5Sbloom */
882d9956b5Sbloom IF !bcmp(argi, "IFS=", sizeof("IFS=") - 1)
892d9956b5Sbloom THEN
902d9956b5Sbloom int uid;
912d9956b5Sbloom IF (uid = getuid())!=geteuid() ORF !uid
922d9956b5Sbloom THEN
932d9956b5Sbloom return;
942d9956b5Sbloom FI
952d9956b5Sbloom FI
962d9956b5Sbloom n->namenv = n->namval = argscan;
979ca57245Smckusick ELSE assign(n, argscan);
989ca57245Smckusick FI
999ca57245Smckusick return;
1009ca57245Smckusick FI
1019ca57245Smckusick FI
1029ca57245Smckusick failed(argi,notid);
1039ca57245Smckusick }
1049ca57245Smckusick
replace(a,v)1059ca57245Smckusick replace(a, v)
1069ca57245Smckusick REG STRING *a;
1079ca57245Smckusick STRING v;
1089ca57245Smckusick {
1099ca57245Smckusick free(*a); *a=make(v);
1109ca57245Smckusick }
1119ca57245Smckusick
dfault(n,v)1129ca57245Smckusick dfault(n,v)
1139ca57245Smckusick NAMPTR n;
1149ca57245Smckusick STRING v;
1159ca57245Smckusick {
1169ca57245Smckusick IF n->namval==0
1179ca57245Smckusick THEN assign(n,v)
1189ca57245Smckusick FI
1199ca57245Smckusick }
1209ca57245Smckusick
assign(n,v)1219ca57245Smckusick assign(n,v)
1229ca57245Smckusick NAMPTR n;
1239ca57245Smckusick STRING v;
1249ca57245Smckusick {
1259ca57245Smckusick IF n->namflg&N_RDONLY
1269ca57245Smckusick THEN failed(n->namid,wtfailed);
1279ca57245Smckusick ELSE replace(&n->namval,v);
1289ca57245Smckusick FI
1299ca57245Smckusick }
1309ca57245Smckusick
readvar(names)1319ca57245Smckusick INT readvar(names)
1329ca57245Smckusick STRING *names;
1339ca57245Smckusick {
1349ca57245Smckusick FILEBLK fb;
1359ca57245Smckusick REG FILE f = &fb;
1369ca57245Smckusick REG CHAR c;
1379ca57245Smckusick REG INT rc=0;
1389ca57245Smckusick NAMPTR n=lookup(*names++); /* done now to avoid storage mess */
1399ca57245Smckusick STKPTR rel=relstak();
1409ca57245Smckusick
1419ca57245Smckusick push(f); initf(dup(0));
1429ca57245Smckusick IF lseek(0,0L,1)==-1
1439ca57245Smckusick THEN f->fsiz=1;
1449ca57245Smckusick FI
1459ca57245Smckusick
1469ca57245Smckusick LOOP c=nextc(0);
1479ca57245Smckusick IF (*names ANDF any(c, ifsnod.namval)) ORF eolchar(c)
1489ca57245Smckusick THEN zerostak();
1499ca57245Smckusick assign(n,absstak(rel)); setstak(rel);
1509ca57245Smckusick IF *names
1519ca57245Smckusick THEN n=lookup(*names++);
1529ca57245Smckusick ELSE n=0;
1539ca57245Smckusick FI
1549ca57245Smckusick IF eolchar(c)
1559ca57245Smckusick THEN break;
1569ca57245Smckusick FI
1579ca57245Smckusick ELSE pushstak(c);
1589ca57245Smckusick FI
1599ca57245Smckusick POOL
1609ca57245Smckusick WHILE n
1619ca57245Smckusick DO assign(n, nullstr);
1629ca57245Smckusick IF *names THEN n=lookup(*names++); ELSE n=0; FI
1639ca57245Smckusick OD
1649ca57245Smckusick
1659ca57245Smckusick IF eof THEN rc=1 FI
1669ca57245Smckusick lseek(0, (long)(f->fnxt-f->fend), 1);
1679ca57245Smckusick pop();
1689ca57245Smckusick return(rc);
1699ca57245Smckusick }
1709ca57245Smckusick
assnum(p,i)1719ca57245Smckusick assnum(p, i)
1729ca57245Smckusick STRING *p;
1739ca57245Smckusick INT i;
1749ca57245Smckusick {
1759ca57245Smckusick itos(i); replace(p,numbuf);
1769ca57245Smckusick }
1779ca57245Smckusick
make(v)1789ca57245Smckusick STRING make(v)
1799ca57245Smckusick STRING v;
1809ca57245Smckusick {
1819ca57245Smckusick REG STRING p;
1829ca57245Smckusick
1839ca57245Smckusick IF v
1849ca57245Smckusick THEN movstr(v,p=alloc(length(v)));
1859ca57245Smckusick return(p);
1869ca57245Smckusick ELSE return(0);
1879ca57245Smckusick FI
1889ca57245Smckusick }
1899ca57245Smckusick
1909ca57245Smckusick
lookup(nam)1919ca57245Smckusick NAMPTR lookup(nam)
1929ca57245Smckusick REG STRING nam;
1939ca57245Smckusick {
1949ca57245Smckusick REG NAMPTR nscan=namep;
1959ca57245Smckusick REG NAMPTR *prev;
1969ca57245Smckusick INT LR;
1979ca57245Smckusick
1989ca57245Smckusick IF !chkid(nam)
1999ca57245Smckusick THEN failed(nam,notid);
2009ca57245Smckusick FI
2019ca57245Smckusick WHILE nscan
2029ca57245Smckusick DO IF (LR=cf(nam,nscan->namid))==0
2039ca57245Smckusick THEN return(nscan);
2049ca57245Smckusick ELIF LR<0
2059ca57245Smckusick THEN prev = &(nscan->namlft);
2069ca57245Smckusick ELSE prev = &(nscan->namrgt);
2079ca57245Smckusick FI
2089ca57245Smckusick nscan = *prev;
2099ca57245Smckusick OD
2109ca57245Smckusick
2119ca57245Smckusick /* add name node */
2129ca57245Smckusick nscan=alloc(sizeof *nscan);
2139ca57245Smckusick nscan->namlft=nscan->namrgt=NIL;
2149ca57245Smckusick nscan->namid=make(nam);
2159ca57245Smckusick nscan->namval=0; nscan->namflg=N_DEFAULT; nscan->namenv=0;
2169ca57245Smckusick return(*prev = nscan);
2179ca57245Smckusick }
2189ca57245Smckusick
chkid(nam)2199ca57245Smckusick LOCAL BOOL chkid(nam)
2209ca57245Smckusick STRING nam;
2219ca57245Smckusick {
2229ca57245Smckusick REG CHAR * cp=nam;
2239ca57245Smckusick
2249ca57245Smckusick IF !letter(*cp)
2259ca57245Smckusick THEN return(FALSE);
2269ca57245Smckusick ELSE WHILE *++cp
2279ca57245Smckusick DO IF !alphanum(*cp)
2289ca57245Smckusick THEN return(FALSE);
2299ca57245Smckusick FI
2309ca57245Smckusick OD
2319ca57245Smckusick FI
2329ca57245Smckusick return(TRUE);
2339ca57245Smckusick }
2349ca57245Smckusick
2359ca57245Smckusick LOCAL VOID (*namfn)();
2369ca57245Smckusick namscan(fn)
2379ca57245Smckusick VOID (*fn)();
2389ca57245Smckusick {
2399ca57245Smckusick namfn=fn;
2409ca57245Smckusick namwalk(namep);
2419ca57245Smckusick }
2429ca57245Smckusick
namwalk(np)2439ca57245Smckusick LOCAL VOID namwalk(np)
2449ca57245Smckusick REG NAMPTR np;
2459ca57245Smckusick {
2469ca57245Smckusick IF np
2479ca57245Smckusick THEN namwalk(np->namlft);
2489ca57245Smckusick (*namfn)(np);
2499ca57245Smckusick namwalk(np->namrgt);
2509ca57245Smckusick FI
2519ca57245Smckusick }
2529ca57245Smckusick
printnam(n)2539ca57245Smckusick VOID printnam(n)
2549ca57245Smckusick NAMPTR n;
2559ca57245Smckusick {
2569ca57245Smckusick REG STRING s;
2579ca57245Smckusick
2589ca57245Smckusick sigchk();
2599ca57245Smckusick IF s=n->namval
2609ca57245Smckusick THEN prs(n->namid);
2619ca57245Smckusick prc('='); prs(s);
2629ca57245Smckusick newline();
2639ca57245Smckusick FI
2649ca57245Smckusick }
2659ca57245Smckusick
staknam(n)2669ca57245Smckusick LOCAL STRING staknam(n)
2679ca57245Smckusick REG NAMPTR n;
2689ca57245Smckusick {
2699ca57245Smckusick REG STRING p;
2709ca57245Smckusick
2719ca57245Smckusick p=movstr(n->namid,staktop);
2729ca57245Smckusick p=movstr("=",p);
2739ca57245Smckusick p=movstr(n->namval,p);
2749ca57245Smckusick return(getstak(p+1-ADR(stakbot)));
2759ca57245Smckusick }
2769ca57245Smckusick
exname(n)2779ca57245Smckusick VOID exname(n)
2789ca57245Smckusick REG NAMPTR n;
2799ca57245Smckusick {
2809ca57245Smckusick IF n->namflg&N_EXPORT
2819ca57245Smckusick THEN free(n->namenv);
2829ca57245Smckusick n->namenv = make(n->namval);
2839ca57245Smckusick ELSE free(n->namval);
2849ca57245Smckusick n->namval = make(n->namenv);
2859ca57245Smckusick FI
2869ca57245Smckusick }
2879ca57245Smckusick
printflg(n)2889ca57245Smckusick VOID printflg(n)
2899ca57245Smckusick REG NAMPTR n;
2909ca57245Smckusick {
2919ca57245Smckusick IF n->namflg&N_EXPORT
2929ca57245Smckusick THEN prs(export); blank();
2939ca57245Smckusick FI
2949ca57245Smckusick IF n->namflg&N_RDONLY
2959ca57245Smckusick THEN prs(readonly); blank();
2969ca57245Smckusick FI
2979ca57245Smckusick IF n->namflg&(N_EXPORT|N_RDONLY)
2989ca57245Smckusick THEN prs(n->namid); newline();
2999ca57245Smckusick FI
3009ca57245Smckusick }
3019ca57245Smckusick
setupenv()302508044c8Smckusick VOID setupenv()
3039ca57245Smckusick {
3049ca57245Smckusick REG STRING *e=environ;
3059ca57245Smckusick
3069ca57245Smckusick WHILE *e
3079ca57245Smckusick DO setname(*e++, N_ENVNAM) OD
3089ca57245Smckusick }
3099ca57245Smckusick
3109ca57245Smckusick LOCAL INT namec;
3119ca57245Smckusick
countnam(n)3129ca57245Smckusick VOID countnam(n)
3139ca57245Smckusick NAMPTR n;
3149ca57245Smckusick {
3159ca57245Smckusick namec++;
3169ca57245Smckusick }
3179ca57245Smckusick
3189ca57245Smckusick LOCAL STRING *argnam;
3199ca57245Smckusick
pushnam(n)3209ca57245Smckusick VOID pushnam(n)
3219ca57245Smckusick NAMPTR n;
3229ca57245Smckusick {
3239ca57245Smckusick IF n->namval
3249ca57245Smckusick THEN *argnam++ = staknam(n);
3259ca57245Smckusick FI
3269ca57245Smckusick }
3279ca57245Smckusick
setenv()3289ca57245Smckusick STRING *setenv()
3299ca57245Smckusick {
3309ca57245Smckusick REG STRING *er;
3319ca57245Smckusick
3329ca57245Smckusick namec=0;
3339ca57245Smckusick namscan(countnam);
3349ca57245Smckusick argnam = er = getstak(namec*BYTESPERWORD+BYTESPERWORD);
3359ca57245Smckusick namscan(pushnam);
3369ca57245Smckusick *argnam++ = 0;
3379ca57245Smckusick return(er);
3389ca57245Smckusick }
339