1 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
2 --- name.c.orig	Fri Jun  4 02:51:02 2004
3 +++ name.c	Sat Jun 19 18:42:23 2004
4 @@ -9,33 +9,36 @@
5 
6  #include	"defs.h"
7 
8 -PROC BOOL	chkid();
9 +LOCAL BOOL	chkid(CSTRING);
10 +LOCAL VOID	namwalk(NAMPTR);
11 +LOCAL STRING	staknam(NAMPTR);
12 +LOCAL VOID	countnam(NAMPTR);
13 +LOCAL VOID	pushnam(NAMPTR);
14 +
15 +NAMNOD	ps2nod	= {	NIL,		NIL,		ps2name,  NIL,NIL,0},
16 +	fngnod	= {	NIL,		NIL,		fngname,  NIL,NIL,0},
17 +	pathnod = {	NIL,		NIL,		pathname, NIL,NIL,0},
18 +	ifsnod	= {	NIL,		NIL,		ifsname,  NIL,NIL,0},
19 +	ps1nod	= {	&pathnod,	&ps2nod,	ps1name,  NIL,NIL,0},
20 +	homenod = {	&fngnod,	&ifsnod,	homename, NIL,NIL,0},
21 +	mailnod = {	&homenod,	&ps1nod,	mailname, NIL,NIL,0};
22 
23 -
24 -NAMNOD	ps2nod	= {	NIL,		NIL,		ps2name},
25 -	fngnod	= {	NIL,		NIL,		fngname},
26 -	pathnod = {	NIL,		NIL,		pathname},
27 -	ifsnod	= {	NIL,		NIL,		ifsname},
28 -	ps1nod	= {	&pathnod,	&ps2nod,	ps1name},
29 -	homenod = {	&fngnod,	&ifsnod,	homename},
30 -	mailnod = {	&homenod,	&ps1nod,	mailname};
31 -
32 -NAMPTR		namep = &mailnod;
33 +LOCAL NAMPTR	namep = &mailnod;
34 
35 
36  /* ========	variable and string handling	======== */
37 
38 -syslook(w,syswds)
39 +INT	syslook(w,syswds)
40  	STRING		w;
41  	SYSTAB		syswds;
42  {
43 -	REG CHAR	first;
44 -	REG STRING	s;
45 +	REG INT		first;
46 +	REG CSTRING	s;
47  	REG SYSPTR	syscan;
48 
49  	syscan=syswds; first = *w;
50 
51 -	WHILE s=syscan->sysnam
52 +	WHILE (s=syscan->sysnam)!=NIL		/* GCC */
53  	DO  IF first == *s
54  		ANDF eq(w,s)
55  	    THEN return(syscan->sysval);
56 @@ -45,7 +48,7 @@
57  	return(0);
58  }
59 
60 -setlist(arg,xp)
61 +VOID	setlist(arg,xp)
62  	REG ARGPTR	arg;
63  	INT		xp;
64  {
65 @@ -60,52 +63,107 @@
66  	OD
67  }
68 
69 +#if defined(SYSIII)
70 +INT	setname(argi, xp)
71 +#else /* V7 */
72  VOID	setname(argi, xp)
73 +#endif
74  	STRING		argi;
75  	INT		xp;
76  {
77 +#if defined(SYSIII)
78 +	INT		rsflag=1;	/* local restricted flag */
79 +#endif
80  	REG STRING	argscan=argi;
81  	REG NAMPTR	n;
82 
83 -	IF letter(*argscan)
84 -	THEN	WHILE alphanum(*argscan) DO argscan++ OD
85 +	IF letter((INT) *argscan)
86 +	THEN	WHILE alphanum((INT) *argscan) DO argscan++ OD
87  		IF *argscan=='='
88 +		/* make name a cohesive string */
89  		THEN	*argscan = 0;
90 +#if defined(SYSIII)
91 +		    /*	restricted stuff excluded from research	*/
92 +		   IF eq(argi, "SHELL") ANDF !(flags&rshflg)
93 +		   THEN	argscan++;
94 +			IF any('r', simple(argscan))
95 +			THEN	rsflag=0;	/* restricted shell */
96 +			FI
97 +			argscan--;
98 +		   FI
99 +		   IF eq(argi,pathname) ANDF (flags&rshflg) /* cannot set PATH */
100 +		   THEN	failed(argi,restricted);
101 +			/*NOTREACHED*/
102 +		   ELIF eq(argi, "SHELL") ANDF (flags&rshflg)
103 +		   THEN	failed(argi, restricted);
104 +			/*NOTREACHED*/
105 +		   ELSE
106 +#endif
107  			n=lookup(argi);
108  			*argscan++ = '=';
109  			attrib(n, xp);
110  			IF xp&N_ENVNAM
111 +#if defined(RENO)
112 +			THEN
113 +				/*
114 +				 * Importing IFS can be very dangerous
115 +				 */
116 +				IF !bcmp(argi, "IFS=", sizeof("IFS=") - 1)
117 +				THEN
118 +					UID uid;
119 +					IF (uid = getuid())!=geteuid() ORF !uid
120 +					THEN
121 +#if defined(SYSIII)
122 +						return(0);
123 +#else /* V7 */
124 +						return;
125 +#endif
126 +					FI
127 +				FI
128 +				n->namenv = n->namval = argscan;
129 +#else /* V7 */
130  			THEN	n->namenv = n->namval = argscan;
131 +#endif
132  			ELSE	assign(n, argscan);
133  			FI
134 +#if defined(SYSIII)
135 +			return(rsflag);
136 +		    FI
137 +#else /* V7 */
138  			return;
139 +#endif
140  		FI
141  	FI
142  	failed(argi,notid);
143 +	/*NOTREACHED*/
144 +#if defined(SYSIII)
145 +	return(0);
146 +#endif
147  }
148 
149 -replace(a, v)
150 +VOID	replace(a, v)
151  	REG STRING	*a;
152 -	STRING		v;
153 +	CSTRING		v;
154  {
155 -	free(*a); *a=make(v);
156 +	free((BLKPTR) *a); *a=make(v);
157  }
158 
159 -dfault(n,v)
160 +VOID	dfault(n,v)
161  	NAMPTR		n;
162 -	STRING		v;
163 +	CSTRING		v;
164  {
165  	IF n->namval==0
166  	THEN	assign(n,v)
167  	FI
168  }
169 
170 -assign(n,v)
171 +VOID	assign(n,v)
172  	NAMPTR		n;
173 -	STRING		v;
174 +	CSTRING		v;
175  {
176  	IF n->namflg&N_RDONLY
177  	THEN	failed(n->namid,wtfailed);
178 +		/*NOTREACHED*/
179  	ELSE	replace(&n->namval,v);
180  	FI
181  }
182 @@ -114,18 +172,24 @@
183  	STRING		*names;
184  {
185  	FILEBLK		fb;
186 -	REG FILE	f = &fb;
187 -	REG CHAR	c;
188 +	REG FILEPTR	f = &fb;
189 +	REG INT		c;
190  	REG INT		rc=0;
191  	NAMPTR		n=lookup(*names++); /* done now to avoid storage mess */
192 -	STKPTR		rel=relstak();
193 +	STKPTR		rel=(STKPTR) relstak();
194 
195  	push(f); initf(dup(0));
196 -	IF lseek(0,0L,1)==-1
197 +	IF lseek(0,(OFFSET) 0,SEEK_CUR)==-1
198  	THEN	f->fsiz=1;
199  	FI
200 
201 +#if defined(SYSIII)
202 +	/*	strip leading IFS characters */
203 +	WHILE (any((c=nextc(0)), ifsnod.namval)) ANDF !(eolchar(c)) DONE
204 +	LOOP
205 +#else /* V7 */
206  	LOOP	c=nextc(0);
207 +#endif
208  		IF (*names ANDF any(c, ifsnod.namval)) ORF eolchar(c)
209  		THEN	zerostak();
210  			assign(n,absstak(rel)); setstak(rel);
211 @@ -135,8 +199,16 @@
212  			FI
213  			IF eolchar(c)
214  			THEN	break;
215 +#if defined(SYSIII)
216 +			ELSE	/*	strip imbedded IFS characters	*/
217 +				WHILE (any((c=nextc(0)), ifsnod.namval)) ANDF
218 +				      !(eolchar(c)) DONE
219 +#endif
220  			FI
221  		ELSE	pushstak(c);
222 +#if defined(SYSIII)
223 +			c=nextc(0);
224 +#endif
225  		FI
226  	POOL
227  	WHILE n
228 @@ -145,12 +217,12 @@
229  	OD
230 
231  	IF eof THEN rc=1 FI
232 -	lseek(0, (long)(f->fnxt-f->fend), 1);
233 +	lseek(0, (OFFSET) (f->fnxt-f->fend), SEEK_CUR);
234  	pop();
235  	return(rc);
236  }
237 
238 -assnum(p, i)
239 +VOID	assnum(p, i)
240  	STRING		*p;
241  	INT		i;
242  {
243 @@ -158,27 +230,28 @@
244  }
245 
246  STRING	make(v)
247 -	STRING		v;
248 +	CSTRING		v;
249  {
250  	REG STRING	p;
251 
252  	IF v
253 -	THEN	movstr(v,p=alloc(length(v)));
254 +	THEN	movstr(v,p=(STRING) alloc((POS) length(v)));
255  		return(p);
256  	ELSE	return(0);
257  	FI
258  }
259 
260 
261 -NAMPTR		lookup(nam)
262 -	REG STRING	nam;
263 +NAMPTR	lookup(nam)
264 +	REG CSTRING	nam;
265  {
266  	REG NAMPTR	nscan=namep;
267 -	REG NAMPTR	*prev;
268 +	REG NAMPTR	*prev=NIL;		/* GCC */
269  	INT		LR;
270 
271  	IF !chkid(nam)
272  	THEN	failed(nam,notid);
273 +		/*NOTREACHED*/
274  	FI
275  	WHILE nscan
276  	DO	IF (LR=cf(nam,nscan->namid))==0
277 @@ -191,7 +264,7 @@
278  	OD
279 
280  	/* add name node */
281 -	nscan=alloc(sizeof *nscan);
282 +	nscan=(NAMPTR) alloc(sizeof *nscan);
283  	nscan->namlft=nscan->namrgt=NIL;
284  	nscan->namid=make(nam);
285  	nscan->namval=0; nscan->namflg=N_DEFAULT; nscan->namenv=0;
286 @@ -199,14 +272,14 @@
287  }
288 
289  LOCAL BOOL	chkid(nam)
290 -	STRING		nam;
291 +	CSTRING		nam;
292  {
293 -	REG CHAR *	cp=nam;
294 +	REG CSTRING	cp=nam;
295 
296 -	IF !letter(*cp)
297 +	IF !letter((INT) *cp)
298  	THEN	return(FALSE);
299  	ELSE	WHILE *++cp
300 -		DO IF !alphanum(*cp)
301 +		DO IF !alphanum((INT) *cp)
302  		   THEN	return(FALSE);
303  		   FI
304  		OD
305 @@ -214,9 +287,10 @@
306  	return(TRUE);
307  }
308 
309 -LOCAL VOID (*namfn)();
310 -namscan(fn)
311 -	VOID		(*fn)();
312 +LOCAL VOID (*namfn)(NAMPTR);
313 +
314 +VOID	namscan(fn)
315 +	VOID		(*fn)(NAMPTR);
316  {
317  	namfn=fn;
318  	namwalk(namep);
319 @@ -238,7 +312,7 @@
320  	REG STRING	s;
321 
322  	sigchk();
323 -	IF s=n->namval
324 +	IF (s=n->namval)!=NIL			/* GCC */
325  	THEN	prs(n->namid);
326  		prc('='); prs(s);
327  		newline();
328 @@ -253,16 +327,16 @@
329  	p=movstr(n->namid,staktop);
330  	p=movstr("=",p);
331  	p=movstr(n->namval,p);
332 -	return(getstak(p+1-ADR(stakbot)));
333 +	return(getstak((POS) (p+1-ADR(stakbot))));
334  }
335 
336  VOID	exname(n)
337  	REG NAMPTR	n;
338  {
339  	IF n->namflg&N_EXPORT
340 -	THEN	free(n->namenv);
341 +	THEN	free((BLKPTR) n->namenv);
342  		n->namenv = make(n->namval);
343 -	ELSE	free(n->namval);
344 +	ELSE	free((BLKPTR) n->namval);
345  		n->namval = make(n->namenv);
346  	FI
347  }
348 @@ -281,6 +355,16 @@
349  	FI
350  }
351 
352 +#if defined(SYSIII)
353 +INT	getenv()
354 +{
355 +	INT	rsflag=1;	/* local restricted flag */
356 +	REG STRING	*e=environ;
357 +
358 +	WHILE *e DO rsflag=setname(*e++, N_ENVNAM) & rsflag OD
359 +	return(rsflag);
360 +}
361 +#else /* V7 */
362  VOID	getenv()
363  {
364  	REG STRING	*e=environ;
365 @@ -288,18 +372,20 @@
366  	WHILE *e
367  	DO setname(*e++, N_ENVNAM) OD
368  }
369 +#endif
370 
371 -LOCAL INT	namec;
372 +LOCAL POS	namec;
373 
374 -VOID	countnam(n)
375 +LOCAL VOID	countnam(n)
376  	NAMPTR		n;
377  {
378 +	n=n;					/* GCC */
379  	namec++;
380  }
381 
382  LOCAL STRING 	*argnam;
383 
384 -VOID	pushnam(n)
385 +LOCAL VOID	pushnam(n)
386  	NAMPTR		n;
387  {
388  	IF n->namval
389 @@ -313,7 +399,7 @@
390 
391  	namec=0;
392  	namscan(countnam);
393 -	argnam = er = getstak(namec*BYTESPERWORD+BYTESPERWORD);
394 +	argnam = er = (STRING *) getstak(namec*BYTESPERWORD+BYTESPERWORD);
395  	namscan(pushnam);
396  	*argnam++ = 0;
397  	return(er);
398