xref: /plan9/sys/src/ape/lib/ap/plan9/_fdinfo.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier #define  _BSDTIME_EXTENSION
2*219b2ee8SDavid du Colombier #include "lib.h"
3*219b2ee8SDavid du Colombier #include <sys/stat.h>
4*219b2ee8SDavid du Colombier #include <stdlib.h>
5*219b2ee8SDavid du Colombier 
6*219b2ee8SDavid du Colombier Fdinfo _fdinfo[OPEN_MAX];
7*219b2ee8SDavid du Colombier 
8*219b2ee8SDavid du Colombier /*
9*219b2ee8SDavid du Colombier    called from _envsetup, either with the value of the environment
10*219b2ee8SDavid du Colombier    variable _fdinfo (from s to se-1), or with s==0 if there was no _fdinfo
11*219b2ee8SDavid du Colombier */
12*219b2ee8SDavid du Colombier void
13*219b2ee8SDavid du Colombier _fdinit(char *s, char *se)
14*219b2ee8SDavid du Colombier {
15*219b2ee8SDavid du Colombier 	int i;
16*219b2ee8SDavid du Colombier 	Fdinfo *fi;
17*219b2ee8SDavid du Colombier 	unsigned long fd, fl, ofl;
18*219b2ee8SDavid du Colombier 	char *e;
19*219b2ee8SDavid du Colombier 	struct stat sbuf;
20*219b2ee8SDavid du Colombier 
21*219b2ee8SDavid du Colombier 	if(s){
22*219b2ee8SDavid du Colombier 		while(s < se){
23*219b2ee8SDavid du Colombier 			fd = strtoul(s, &e, 10);
24*219b2ee8SDavid du Colombier 			if(s == e)
25*219b2ee8SDavid du Colombier 				break;
26*219b2ee8SDavid du Colombier 			s = e;
27*219b2ee8SDavid du Colombier 			fl = strtoul(s, &e, 10);
28*219b2ee8SDavid du Colombier 			if(s == e)
29*219b2ee8SDavid du Colombier 				break;
30*219b2ee8SDavid du Colombier 			s = e;
31*219b2ee8SDavid du Colombier 			ofl = strtoul(s, &e, 10);
32*219b2ee8SDavid du Colombier 			if(s == e)
33*219b2ee8SDavid du Colombier 				break;
34*219b2ee8SDavid du Colombier 			s = e;
35*219b2ee8SDavid du Colombier 			if(fd < OPEN_MAX){
36*219b2ee8SDavid du Colombier 				fi = &_fdinfo[fd];
37*219b2ee8SDavid du Colombier 				fi->flags = fl;
38*219b2ee8SDavid du Colombier 				fi->oflags = ofl;
39*219b2ee8SDavid du Colombier /* hack, until all posix apps recompiled: */
40*219b2ee8SDavid du Colombier 				if(_isatty(fd))
41*219b2ee8SDavid du Colombier 					fi->flags |= FD_ISTTY;
42*219b2ee8SDavid du Colombier 			}
43*219b2ee8SDavid du Colombier 		}
44*219b2ee8SDavid du Colombier 	} else {
45*219b2ee8SDavid du Colombier 		for(i = 0; i <= 2; i++) {
46*219b2ee8SDavid du Colombier 			fi = &_fdinfo[i];
47*219b2ee8SDavid du Colombier 			fi->flags = FD_ISOPEN;
48*219b2ee8SDavid du Colombier 			fi->oflags = (i == 0)? O_RDONLY : O_WRONLY;
49*219b2ee8SDavid du Colombier 			if(_isatty(i))
50*219b2ee8SDavid du Colombier 				fi->flags |= FD_ISTTY;
51*219b2ee8SDavid du Colombier 		}
52*219b2ee8SDavid du Colombier 	}
53*219b2ee8SDavid du Colombier 	for(i = 0; i < OPEN_MAX; i++) {
54*219b2ee8SDavid du Colombier 		fi = &_fdinfo[i];
55*219b2ee8SDavid du Colombier 		if(fi->flags&FD_ISOPEN){
56*219b2ee8SDavid du Colombier 			if(fstat(i, &sbuf) >= 0) {
57*219b2ee8SDavid du Colombier 				fi->uid = sbuf.st_uid;
58*219b2ee8SDavid du Colombier 				fi->gid = sbuf.st_gid;
59*219b2ee8SDavid du Colombier 			}
60*219b2ee8SDavid du Colombier 		}
61*219b2ee8SDavid du Colombier 	}
62*219b2ee8SDavid du Colombier }
63*219b2ee8SDavid du Colombier 
64