xref: /original-bsd/old/sh/name.c (revision e80642c4)
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