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
--- name.c.orig	Fri Jun  4 02:51:02 2004
+++ name.c	Sat Jun 19 18:42:23 2004
@@ -9,33 +9,36 @@
 
 #include	"defs.h"
 
-PROC BOOL	chkid();
+LOCAL BOOL	chkid(CSTRING);
+LOCAL VOID	namwalk(NAMPTR);
+LOCAL STRING	staknam(NAMPTR);
+LOCAL VOID	countnam(NAMPTR);
+LOCAL VOID	pushnam(NAMPTR);
+
+NAMNOD	ps2nod	= {	NIL,		NIL,		ps2name,  NIL,NIL,0},
+	fngnod	= {	NIL,		NIL,		fngname,  NIL,NIL,0},
+	pathnod = {	NIL,		NIL,		pathname, NIL,NIL,0},
+	ifsnod	= {	NIL,		NIL,		ifsname,  NIL,NIL,0},
+	ps1nod	= {	&pathnod,	&ps2nod,	ps1name,  NIL,NIL,0},
+	homenod = {	&fngnod,	&ifsnod,	homename, NIL,NIL,0},
+	mailnod = {	&homenod,	&ps1nod,	mailname, NIL,NIL,0};
 
-
-NAMNOD	ps2nod	= {	NIL,		NIL,		ps2name},
-	fngnod	= {	NIL,		NIL,		fngname},
-	pathnod = {	NIL,		NIL,		pathname},
-	ifsnod	= {	NIL,		NIL,		ifsname},
-	ps1nod	= {	&pathnod,	&ps2nod,	ps1name},
-	homenod = {	&fngnod,	&ifsnod,	homename},
-	mailnod = {	&homenod,	&ps1nod,	mailname};
-
-NAMPTR		namep = &mailnod;
+LOCAL NAMPTR	namep = &mailnod;
 
 
 /* ========	variable and string handling	======== */
 
-syslook(w,syswds)
+INT	syslook(w,syswds)
 	STRING		w;
 	SYSTAB		syswds;
 {
-	REG CHAR	first;
-	REG STRING	s;
+	REG INT		first;
+	REG CSTRING	s;
 	REG SYSPTR	syscan;
 
 	syscan=syswds; first = *w;
 
-	WHILE s=syscan->sysnam
+	WHILE (s=syscan->sysnam)!=NIL		/* GCC */
 	DO  IF first == *s
 		ANDF eq(w,s)
 	    THEN return(syscan->sysval);
@@ -45,7 +48,7 @@
 	return(0);
 }
 
-setlist(arg,xp)
+VOID	setlist(arg,xp)
 	REG ARGPTR	arg;
 	INT		xp;
 {
@@ -60,52 +63,107 @@
 	OD
 }
 
+#if defined(SYSIII)
+INT	setname(argi, xp)
+#else /* V7 */
 VOID	setname(argi, xp)
+#endif
 	STRING		argi;
 	INT		xp;
 {
+#if defined(SYSIII)
+	INT		rsflag=1;	/* local restricted flag */
+#endif
 	REG STRING	argscan=argi;
 	REG NAMPTR	n;
 
-	IF letter(*argscan)
-	THEN	WHILE alphanum(*argscan) DO argscan++ OD
+	IF letter((INT) *argscan)
+	THEN	WHILE alphanum((INT) *argscan) DO argscan++ OD
 		IF *argscan=='='
+		/* make name a cohesive string */
 		THEN	*argscan = 0;
+#if defined(SYSIII)
+		    /*	restricted stuff excluded from research	*/
+		   IF eq(argi, "SHELL") ANDF !(flags&rshflg)
+		   THEN	argscan++;
+			IF any('r', simple(argscan))
+			THEN	rsflag=0;	/* restricted shell */
+			FI
+			argscan--;
+		   FI
+		   IF eq(argi,pathname) ANDF (flags&rshflg) /* cannot set PATH */
+		   THEN	failed(argi,restricted);
+			/*NOTREACHED*/
+		   ELIF eq(argi, "SHELL") ANDF (flags&rshflg)
+		   THEN	failed(argi, restricted);
+			/*NOTREACHED*/
+		   ELSE
+#endif
 			n=lookup(argi);
 			*argscan++ = '=';
 			attrib(n, xp);
 			IF xp&N_ENVNAM
+#if defined(RENO)
+			THEN
+				/*
+				 * Importing IFS can be very dangerous
+				 */
+				IF !bcmp(argi, "IFS=", sizeof("IFS=") - 1)
+				THEN
+					UID uid;
+					IF (uid = getuid())!=geteuid() ORF !uid
+					THEN
+#if defined(SYSIII)
+						return(0);
+#else /* V7 */
+						return;
+#endif
+					FI
+				FI
+				n->namenv = n->namval = argscan;
+#else /* V7 */
 			THEN	n->namenv = n->namval = argscan;
+#endif
 			ELSE	assign(n, argscan);
 			FI
+#if defined(SYSIII)
+			return(rsflag);
+		    FI
+#else /* V7 */
 			return;
+#endif
 		FI
 	FI
 	failed(argi,notid);
+	/*NOTREACHED*/
+#if defined(SYSIII)
+	return(0);
+#endif
 }
 
-replace(a, v)
+VOID	replace(a, v)
 	REG STRING	*a;
-	STRING		v;
+	CSTRING		v;
 {
-	free(*a); *a=make(v);
+	free((BLKPTR) *a); *a=make(v);
 }
 
-dfault(n,v)
+VOID	dfault(n,v)
 	NAMPTR		n;
-	STRING		v;
+	CSTRING		v;
 {
 	IF n->namval==0
 	THEN	assign(n,v)
 	FI
 }
 
-assign(n,v)
+VOID	assign(n,v)
 	NAMPTR		n;
-	STRING		v;
+	CSTRING		v;
 {
 	IF n->namflg&N_RDONLY
 	THEN	failed(n->namid,wtfailed);
+		/*NOTREACHED*/
 	ELSE	replace(&n->namval,v);
 	FI
 }
@@ -114,18 +172,24 @@
 	STRING		*names;
 {
 	FILEBLK		fb;
-	REG FILE	f = &fb;
-	REG CHAR	c;
+	REG FILEPTR	f = &fb;
+	REG INT		c;
 	REG INT		rc=0;
 	NAMPTR		n=lookup(*names++); /* done now to avoid storage mess */
-	STKPTR		rel=relstak();
+	STKPTR		rel=(STKPTR) relstak();
 
 	push(f); initf(dup(0));
-	IF lseek(0,0L,1)==-1
+	IF lseek(0,(OFFSET) 0,SEEK_CUR)==-1
 	THEN	f->fsiz=1;
 	FI
 
+#if defined(SYSIII)
+	/*	strip leading IFS characters */
+	WHILE (any((c=nextc(0)), ifsnod.namval)) ANDF !(eolchar(c)) DONE
+	LOOP
+#else /* V7 */
 	LOOP	c=nextc(0);
+#endif
 		IF (*names ANDF any(c, ifsnod.namval)) ORF eolchar(c)
 		THEN	zerostak();
 			assign(n,absstak(rel)); setstak(rel);
@@ -135,8 +199,16 @@
 			FI
 			IF eolchar(c)
 			THEN	break;
+#if defined(SYSIII)
+			ELSE	/*	strip imbedded IFS characters	*/
+				WHILE (any((c=nextc(0)), ifsnod.namval)) ANDF
+				      !(eolchar(c)) DONE
+#endif
 			FI
 		ELSE	pushstak(c);
+#if defined(SYSIII)
+			c=nextc(0);
+#endif
 		FI
 	POOL
 	WHILE n
@@ -145,12 +217,12 @@
 	OD
 
 	IF eof THEN rc=1 FI
-	lseek(0, (long)(f->fnxt-f->fend), 1);
+	lseek(0, (OFFSET) (f->fnxt-f->fend), SEEK_CUR);
 	pop();
 	return(rc);
 }
 
-assnum(p, i)
+VOID	assnum(p, i)
 	STRING		*p;
 	INT		i;
 {
@@ -158,27 +230,28 @@
 }
 
 STRING	make(v)
-	STRING		v;
+	CSTRING		v;
 {
 	REG STRING	p;
 
 	IF v
-	THEN	movstr(v,p=alloc(length(v)));
+	THEN	movstr(v,p=(STRING) alloc((POS) length(v)));
 		return(p);
 	ELSE	return(0);
 	FI
 }
 
 
-NAMPTR		lookup(nam)
-	REG STRING	nam;
+NAMPTR	lookup(nam)
+	REG CSTRING	nam;
 {
 	REG NAMPTR	nscan=namep;
-	REG NAMPTR	*prev;
+	REG NAMPTR	*prev=NIL;		/* GCC */
 	INT		LR;
 
 	IF !chkid(nam)
 	THEN	failed(nam,notid);
+		/*NOTREACHED*/
 	FI
 	WHILE nscan
 	DO	IF (LR=cf(nam,nscan->namid))==0
@@ -191,7 +264,7 @@
 	OD
 
 	/* add name node */
-	nscan=alloc(sizeof *nscan);
+	nscan=(NAMPTR) alloc(sizeof *nscan);
 	nscan->namlft=nscan->namrgt=NIL;
 	nscan->namid=make(nam);
 	nscan->namval=0; nscan->namflg=N_DEFAULT; nscan->namenv=0;
@@ -199,14 +272,14 @@
 }
 
 LOCAL BOOL	chkid(nam)
-	STRING		nam;
+	CSTRING		nam;
 {
-	REG CHAR *	cp=nam;
+	REG CSTRING	cp=nam;
 
-	IF !letter(*cp)
+	IF !letter((INT) *cp)
 	THEN	return(FALSE);
 	ELSE	WHILE *++cp
-		DO IF !alphanum(*cp)
+		DO IF !alphanum((INT) *cp)
 		   THEN	return(FALSE);
 		   FI
 		OD
@@ -214,9 +287,10 @@
 	return(TRUE);
 }
 
-LOCAL VOID (*namfn)();
-namscan(fn)
-	VOID		(*fn)();
+LOCAL VOID (*namfn)(NAMPTR);
+
+VOID	namscan(fn)
+	VOID		(*fn)(NAMPTR);
 {
 	namfn=fn;
 	namwalk(namep);
@@ -238,7 +312,7 @@
 	REG STRING	s;
 
 	sigchk();
-	IF s=n->namval
+	IF (s=n->namval)!=NIL			/* GCC */
 	THEN	prs(n->namid);
 		prc('='); prs(s);
 		newline();
@@ -253,16 +327,16 @@
 	p=movstr(n->namid,staktop);
 	p=movstr("=",p);
 	p=movstr(n->namval,p);
-	return(getstak(p+1-ADR(stakbot)));
+	return(getstak((POS) (p+1-ADR(stakbot))));
 }
 
 VOID	exname(n)
 	REG NAMPTR	n;
 {
 	IF n->namflg&N_EXPORT
-	THEN	free(n->namenv);
+	THEN	free((BLKPTR) n->namenv);
 		n->namenv = make(n->namval);
-	ELSE	free(n->namval);
+	ELSE	free((BLKPTR) n->namval);
 		n->namval = make(n->namenv);
 	FI
 }
@@ -281,6 +355,16 @@
 	FI
 }
 
+#if defined(SYSIII)
+INT	getenv()
+{
+	INT	rsflag=1;	/* local restricted flag */
+	REG STRING	*e=environ;
+
+	WHILE *e DO rsflag=setname(*e++, N_ENVNAM) & rsflag OD
+	return(rsflag);
+}
+#else /* V7 */
 VOID	getenv()
 {
 	REG STRING	*e=environ;
@@ -288,18 +372,20 @@
 	WHILE *e
 	DO setname(*e++, N_ENVNAM) OD
 }
+#endif
 
-LOCAL INT	namec;
+LOCAL POS	namec;
 
-VOID	countnam(n)
+LOCAL VOID	countnam(n)
 	NAMPTR		n;
 {
+	n=n;					/* GCC */
 	namec++;
 }
 
 LOCAL STRING 	*argnam;
 
-VOID	pushnam(n)
+LOCAL VOID	pushnam(n)
 	NAMPTR		n;
 {
 	IF n->namval
@@ -313,7 +399,7 @@
 
 	namec=0;
 	namscan(countnam);
-	argnam = er = getstak(namec*BYTESPERWORD+BYTESPERWORD);
+	argnam = er = (STRING *) getstak(namec*BYTESPERWORD+BYTESPERWORD);
 	namscan(pushnam);
 	*argnam++ = 0;
 	return(er);