114478Ssam #ifndef lint
2*60176Sbostic static char sccsid[] = "@(#)name.c 4.5 05/21/93";
314478Ssam #endif
46699Smckusick
5*60176Sbostic #include <unistd.h>
6*60176Sbostic
76699Smckusick #
86699Smckusick /*
96699Smckusick * UNIX shell
106699Smckusick *
116699Smckusick * S. R. Bourne
126699Smckusick * Bell Telephone Laboratories
136699Smckusick *
146699Smckusick */
156699Smckusick
166699Smckusick #include "defs.h"
176699Smckusick
186699Smckusick PROC BOOL chkid();
196699Smckusick
206699Smckusick
216699Smckusick NAMNOD ps2nod = { NIL, NIL, ps2name},
226699Smckusick fngnod = { NIL, NIL, fngname},
236699Smckusick pathnod = { NIL, NIL, pathname},
246699Smckusick ifsnod = { NIL, NIL, ifsname},
256699Smckusick ps1nod = { &pathnod, &ps2nod, ps1name},
266699Smckusick homenod = { &fngnod, &ifsnod, homename},
276699Smckusick mailnod = { &homenod, &ps1nod, mailname};
286699Smckusick
296699Smckusick NAMPTR namep = &mailnod;
306699Smckusick
316699Smckusick
326699Smckusick /* ======== variable and string handling ======== */
336699Smckusick
syslook(w,syswds)346699Smckusick syslook(w,syswds)
356699Smckusick STRING w;
366699Smckusick SYSTAB syswds;
376699Smckusick {
386699Smckusick REG CHAR first;
396699Smckusick REG STRING s;
406699Smckusick REG SYSPTR syscan;
416699Smckusick
426699Smckusick syscan=syswds; first = *w;
436699Smckusick
446699Smckusick WHILE s=syscan->sysnam
456699Smckusick DO IF first == *s
466699Smckusick ANDF eq(w,s)
476699Smckusick THEN return(syscan->sysval);
486699Smckusick FI
496699Smckusick syscan++;
506699Smckusick OD
516699Smckusick return(0);
526699Smckusick }
536699Smckusick
setlist(arg,xp)546699Smckusick setlist(arg,xp)
556699Smckusick REG ARGPTR arg;
566699Smckusick INT xp;
576699Smckusick {
586699Smckusick WHILE arg
596699Smckusick DO REG STRING s=mactrim(arg->argval);
606699Smckusick setname(s, xp);
616699Smckusick arg=arg->argnxt;
626699Smckusick IF flags&execpr
636699Smckusick THEN prs(s);
646699Smckusick IF arg THEN blank(); ELSE newline(); FI
656699Smckusick FI
666699Smckusick OD
676699Smckusick }
686699Smckusick
setname(argi,xp)696699Smckusick VOID setname(argi, xp)
706699Smckusick STRING argi;
716699Smckusick INT xp;
726699Smckusick {
736699Smckusick REG STRING argscan=argi;
746699Smckusick REG NAMPTR n;
756699Smckusick
766699Smckusick IF letter(*argscan)
776699Smckusick THEN WHILE alphanum(*argscan) DO argscan++ OD
786699Smckusick IF *argscan=='='
796699Smckusick THEN *argscan = 0;
806699Smckusick n=lookup(argi);
816699Smckusick *argscan++ = '=';
826699Smckusick attrib(n, xp);
836699Smckusick IF xp&N_ENVNAM
8425357Sbloom THEN
8525357Sbloom /*
8625357Sbloom * Importing IFS can be very dangerous
8725357Sbloom */
8825357Sbloom IF !bcmp(argi, "IFS=", sizeof("IFS=") - 1)
8925357Sbloom THEN
9025357Sbloom int uid;
9125357Sbloom IF (uid = getuid())!=geteuid() ORF !uid
9225357Sbloom THEN
9325357Sbloom return;
9425357Sbloom FI
9525357Sbloom FI
9625357Sbloom n->namenv = n->namval = argscan;
976699Smckusick ELSE assign(n, argscan);
986699Smckusick FI
996699Smckusick return;
1006699Smckusick FI
1016699Smckusick FI
1026699Smckusick failed(argi,notid);
1036699Smckusick }
1046699Smckusick
replace(a,v)1056699Smckusick replace(a, v)
1066699Smckusick REG STRING *a;
1076699Smckusick STRING v;
1086699Smckusick {
1096699Smckusick free(*a); *a=make(v);
1106699Smckusick }
1116699Smckusick
dfault(n,v)1126699Smckusick dfault(n,v)
1136699Smckusick NAMPTR n;
1146699Smckusick STRING v;
1156699Smckusick {
1166699Smckusick IF n->namval==0
1176699Smckusick THEN assign(n,v)
1186699Smckusick FI
1196699Smckusick }
1206699Smckusick
assign(n,v)1216699Smckusick assign(n,v)
1226699Smckusick NAMPTR n;
1236699Smckusick STRING v;
1246699Smckusick {
1256699Smckusick IF n->namflg&N_RDONLY
1266699Smckusick THEN failed(n->namid,wtfailed);
1276699Smckusick ELSE replace(&n->namval,v);
1286699Smckusick FI
1296699Smckusick }
1306699Smckusick
readvar(names)1316699Smckusick INT readvar(names)
1326699Smckusick STRING *names;
1336699Smckusick {
1346699Smckusick FILEBLK fb;
1356699Smckusick REG FILE f = &fb;
1366699Smckusick REG CHAR c;
1376699Smckusick REG INT rc=0;
1386699Smckusick NAMPTR n=lookup(*names++); /* done now to avoid storage mess */
1396699Smckusick STKPTR rel=relstak();
1406699Smckusick
1416699Smckusick push(f); initf(dup(0));
1426699Smckusick IF lseek(0,0L,1)==-1
1436699Smckusick THEN f->fsiz=1;
1446699Smckusick FI
1456699Smckusick
1466699Smckusick LOOP c=nextc(0);
1476699Smckusick IF (*names ANDF any(c, ifsnod.namval)) ORF eolchar(c)
1486699Smckusick THEN zerostak();
1496699Smckusick assign(n,absstak(rel)); setstak(rel);
1506699Smckusick IF *names
1516699Smckusick THEN n=lookup(*names++);
1526699Smckusick ELSE n=0;
1536699Smckusick FI
1546699Smckusick IF eolchar(c)
1556699Smckusick THEN break;
1566699Smckusick FI
1576699Smckusick ELSE pushstak(c);
1586699Smckusick FI
1596699Smckusick POOL
1606699Smckusick WHILE n
1616699Smckusick DO assign(n, nullstr);
1626699Smckusick IF *names THEN n=lookup(*names++); ELSE n=0; FI
1636699Smckusick OD
1646699Smckusick
1656699Smckusick IF eof THEN rc=1 FI
1666699Smckusick lseek(0, (long)(f->fnxt-f->fend), 1);
1676699Smckusick pop();
1686699Smckusick return(rc);
1696699Smckusick }
1706699Smckusick
assnum(p,i)1716699Smckusick assnum(p, i)
1726699Smckusick STRING *p;
1736699Smckusick INT i;
1746699Smckusick {
1756699Smckusick itos(i); replace(p,numbuf);
1766699Smckusick }
1776699Smckusick
make(v)1786699Smckusick STRING make(v)
1796699Smckusick STRING v;
1806699Smckusick {
1816699Smckusick REG STRING p;
1826699Smckusick
1836699Smckusick IF v
1846699Smckusick THEN movstr(v,p=alloc(length(v)));
1856699Smckusick return(p);
1866699Smckusick ELSE return(0);
1876699Smckusick FI
1886699Smckusick }
1896699Smckusick
1906699Smckusick
lookup(nam)1916699Smckusick NAMPTR lookup(nam)
1926699Smckusick REG STRING nam;
1936699Smckusick {
1946699Smckusick REG NAMPTR nscan=namep;
1956699Smckusick REG NAMPTR *prev;
1966699Smckusick INT LR;
1976699Smckusick
1986699Smckusick IF !chkid(nam)
1996699Smckusick THEN failed(nam,notid);
2006699Smckusick FI
2016699Smckusick WHILE nscan
2026699Smckusick DO IF (LR=cf(nam,nscan->namid))==0
2036699Smckusick THEN return(nscan);
2046699Smckusick ELIF LR<0
2056699Smckusick THEN prev = &(nscan->namlft);
2066699Smckusick ELSE prev = &(nscan->namrgt);
2076699Smckusick FI
2086699Smckusick nscan = *prev;
2096699Smckusick OD
2106699Smckusick
2116699Smckusick /* add name node */
2126699Smckusick nscan=alloc(sizeof *nscan);
2136699Smckusick nscan->namlft=nscan->namrgt=NIL;
2146699Smckusick nscan->namid=make(nam);
2156699Smckusick nscan->namval=0; nscan->namflg=N_DEFAULT; nscan->namenv=0;
2166699Smckusick return(*prev = nscan);
2176699Smckusick }
2186699Smckusick
chkid(nam)2196699Smckusick LOCAL BOOL chkid(nam)
2206699Smckusick STRING nam;
2216699Smckusick {
2226699Smckusick REG CHAR * cp=nam;
2236699Smckusick
2246699Smckusick IF !letter(*cp)
2256699Smckusick THEN return(FALSE);
2266699Smckusick ELSE WHILE *++cp
2276699Smckusick DO IF !alphanum(*cp)
2286699Smckusick THEN return(FALSE);
2296699Smckusick FI
2306699Smckusick OD
2316699Smckusick FI
2326699Smckusick return(TRUE);
2336699Smckusick }
2346699Smckusick
2356699Smckusick LOCAL VOID (*namfn)();
2366699Smckusick namscan(fn)
2376699Smckusick VOID (*fn)();
2386699Smckusick {
2396699Smckusick namfn=fn;
2406699Smckusick namwalk(namep);
2416699Smckusick }
2426699Smckusick
namwalk(np)2436699Smckusick LOCAL VOID namwalk(np)
2446699Smckusick REG NAMPTR np;
2456699Smckusick {
2466699Smckusick IF np
2476699Smckusick THEN namwalk(np->namlft);
2486699Smckusick (*namfn)(np);
2496699Smckusick namwalk(np->namrgt);
2506699Smckusick FI
2516699Smckusick }
2526699Smckusick
printnam(n)2536699Smckusick VOID printnam(n)
2546699Smckusick NAMPTR n;
2556699Smckusick {
2566699Smckusick REG STRING s;
2576699Smckusick
2586699Smckusick sigchk();
2596699Smckusick IF s=n->namval
2606699Smckusick THEN prs(n->namid);
2616699Smckusick prc('='); prs(s);
2626699Smckusick newline();
2636699Smckusick FI
2646699Smckusick }
2656699Smckusick
staknam(n)2666699Smckusick LOCAL STRING staknam(n)
2676699Smckusick REG NAMPTR n;
2686699Smckusick {
2696699Smckusick REG STRING p;
2706699Smckusick
2716699Smckusick p=movstr(n->namid,staktop);
2726699Smckusick p=movstr("=",p);
2736699Smckusick p=movstr(n->namval,p);
2746699Smckusick return(getstak(p+1-ADR(stakbot)));
2756699Smckusick }
2766699Smckusick
exname(n)2776699Smckusick VOID exname(n)
2786699Smckusick REG NAMPTR n;
2796699Smckusick {
2806699Smckusick IF n->namflg&N_EXPORT
2816699Smckusick THEN free(n->namenv);
2826699Smckusick n->namenv = make(n->namval);
2836699Smckusick ELSE free(n->namval);
2846699Smckusick n->namval = make(n->namenv);
2856699Smckusick FI
2866699Smckusick }
2876699Smckusick
printflg(n)2886699Smckusick VOID printflg(n)
2896699Smckusick REG NAMPTR n;
2906699Smckusick {
2916699Smckusick IF n->namflg&N_EXPORT
2926699Smckusick THEN prs(export); blank();
2936699Smckusick FI
2946699Smckusick IF n->namflg&N_RDONLY
2956699Smckusick THEN prs(readonly); blank();
2966699Smckusick FI
2976699Smckusick IF n->namflg&(N_EXPORT|N_RDONLY)
2986699Smckusick THEN prs(n->namid); newline();
2996699Smckusick FI
3006699Smckusick }
3016699Smckusick
setupenv()30218427Smckusick VOID setupenv()
3036699Smckusick {
3046699Smckusick REG STRING *e=environ;
3056699Smckusick
3066699Smckusick WHILE *e
3076699Smckusick DO setname(*e++, N_ENVNAM) OD
3086699Smckusick }
3096699Smckusick
3106699Smckusick LOCAL INT namec;
3116699Smckusick
countnam(n)3126699Smckusick VOID countnam(n)
3136699Smckusick NAMPTR n;
3146699Smckusick {
3156699Smckusick namec++;
3166699Smckusick }
3176699Smckusick
3186699Smckusick LOCAL STRING *argnam;
3196699Smckusick
pushnam(n)3206699Smckusick VOID pushnam(n)
3216699Smckusick NAMPTR n;
3226699Smckusick {
3236699Smckusick IF n->namval
3246699Smckusick THEN *argnam++ = staknam(n);
3256699Smckusick FI
3266699Smckusick }
3276699Smckusick
setenv()3286699Smckusick STRING *setenv()
3296699Smckusick {
3306699Smckusick REG STRING *er;
3316699Smckusick
3326699Smckusick namec=0;
3336699Smckusick namscan(countnam);
3346699Smckusick argnam = er = getstak(namec*BYTESPERWORD+BYTESPERWORD);
3356699Smckusick namscan(pushnam);
3366699Smckusick *argnam++ = 0;
3376699Smckusick return(er);
3386699Smckusick }
339