xref: /plan9/sys/src/cmd/disk/kfs/uid.c (revision b85a83648eec38fe82b6f00adfd7828ceec5ee8d)
13e12c5d1SDavid du Colombier #include "all.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier struct
43e12c5d1SDavid du Colombier {
57dd7cddfSDavid du Colombier 	RWLock	uidlock;
69a747e4fSDavid du Colombier 	char*	uidbuf;
73e12c5d1SDavid du Colombier 	int	flen;
83e12c5d1SDavid du Colombier 	int	find;
93e12c5d1SDavid du Colombier } uidgc;
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier int
byuid(void * a1,void * a2)123e12c5d1SDavid du Colombier byuid(void *a1, void *a2)
133e12c5d1SDavid du Colombier {
143e12c5d1SDavid du Colombier 	Uid *u1, *u2;
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier 	u1 = a1;
173e12c5d1SDavid du Colombier 	u2 = a2;
183e12c5d1SDavid du Colombier 	return u2->uid - u1->uid;
193e12c5d1SDavid du Colombier }
203e12c5d1SDavid du Colombier 
213e12c5d1SDavid du Colombier int
byname(void * a1,void * a2)223e12c5d1SDavid du Colombier byname(void *a1, void *a2)
233e12c5d1SDavid du Colombier {
243e12c5d1SDavid du Colombier 	Uid *u1, *u2;
253e12c5d1SDavid du Colombier 
263e12c5d1SDavid du Colombier 	u1 = a1;
273e12c5d1SDavid du Colombier 	u2 = a2;
283e12c5d1SDavid du Colombier 	return strcmp(uidspace+u2->offset, uidspace+u1->offset);
293e12c5d1SDavid du Colombier }
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier int
fchar(void)323e12c5d1SDavid du Colombier fchar(void)
333e12c5d1SDavid du Colombier {
343e12c5d1SDavid du Colombier 
353e12c5d1SDavid du Colombier 	if(uidgc.find >= uidgc.flen) {
363e12c5d1SDavid du Colombier 		uidgc.find = 0;
379a747e4fSDavid du Colombier 		uidgc.flen = con_read(FID2, uidgc.uidbuf, cons.offset, MAXDAT);
383e12c5d1SDavid du Colombier 		if(uidgc.flen <= 0)
393e12c5d1SDavid du Colombier 			return 0;
403e12c5d1SDavid du Colombier 		cons.offset += uidgc.flen;
413e12c5d1SDavid du Colombier 	}
429a747e4fSDavid du Colombier 	return uidgc.uidbuf[uidgc.find++];
433e12c5d1SDavid du Colombier }
443e12c5d1SDavid du Colombier 
453e12c5d1SDavid du Colombier int
fname(char * name)463e12c5d1SDavid du Colombier fname(char *name)
473e12c5d1SDavid du Colombier {
483e12c5d1SDavid du Colombier 	int i, c;
493e12c5d1SDavid du Colombier 
503e12c5d1SDavid du Colombier 	memset(name, 0, NAMELEN);
513e12c5d1SDavid du Colombier 	for(i=0;; i++) {
523e12c5d1SDavid du Colombier 		c = fchar();
533e12c5d1SDavid du Colombier 		switch(c) {
543e12c5d1SDavid du Colombier 		case ':':
553e12c5d1SDavid du Colombier 		case '\n':
563e12c5d1SDavid du Colombier 		case ',':
573e12c5d1SDavid du Colombier 		case ' ':
583e12c5d1SDavid du Colombier 		case '#':
593e12c5d1SDavid du Colombier 		case 0:
603e12c5d1SDavid du Colombier 			return c;
613e12c5d1SDavid du Colombier 		}
623e12c5d1SDavid du Colombier 		if(i < NAMELEN-1)
633e12c5d1SDavid du Colombier 			name[i] = c;
643e12c5d1SDavid du Colombier 	}
653e12c5d1SDavid du Colombier }
663e12c5d1SDavid du Colombier 
673e12c5d1SDavid du Colombier #ifdef sometime
683e12c5d1SDavid du Colombier /*
693e12c5d1SDavid du Colombier  * file format is
703e12c5d1SDavid du Colombier  * uid:name:lead:member,member,...\n
713e12c5d1SDavid du Colombier  */
723e12c5d1SDavid du Colombier void
read_user(void)733e12c5d1SDavid du Colombier read_user(void)
743e12c5d1SDavid du Colombier {
753e12c5d1SDavid du Colombier 	int c;
763e12c5d1SDavid du Colombier 
773e12c5d1SDavid du Colombier 	if((c=fname(ustr))!=':' || (c=fname(name))!=':' || (c=fname(lead))!=':')
783e12c5d1SDavid du Colombier 		goto skipline;
793e12c5d1SDavid du Colombier 	n = atol(ustr);
803e12c5d1SDavid du Colombier 	if(n == 0)
813e12c5d1SDavid du Colombier 		goto skipline;
823e12c5d1SDavid du Colombier 	if(readu){
833e12c5d1SDavid du Colombier 		o -= strlen(name)+1;
843e12c5d1SDavid du Colombier 		if(o < 0) {
853e12c5d1SDavid du Colombier 			cprint("conf.uidspace(%ld) too small\n", conf.uidspace);
863e12c5d1SDavid du Colombier 			return -1;
873e12c5d1SDavid du Colombier 		}
883e12c5d1SDavid du Colombier 		strcpy(uidspace+o, name);
893e12c5d1SDavid du Colombier 		uid[u].uid = n;
903e12c5d1SDavid du Colombier 		uid[u].offset = o;
913e12c5d1SDavid du Colombier 		u++;
923e12c5d1SDavid du Colombier 		if(u >= conf.nuid) {
933e12c5d1SDavid du Colombier 			cprint("conf.nuid(%ld) too small\n", conf.nuid);
943e12c5d1SDavid du Colombier 			goto initu;
953e12c5d1SDavid du Colombier 		}
963e12c5d1SDavid du Colombier 	}else{
973e12c5d1SDavid du Colombier 		o = strtouid1(name);
983e12c5d1SDavid du Colombier 		if(o == 0 && strcmp(name, "") != 0)
993e12c5d1SDavid du Colombier 			o = n;
1003e12c5d1SDavid du Colombier 		for(c=0; c<u; c++)
1013e12c5d1SDavid du Colombier 			if(uid[c].uid == n) {
1023e12c5d1SDavid du Colombier 				uid[c].lead = o;
1033e12c5d1SDavid du Colombier 				break;
1043e12c5d1SDavid du Colombier 			}
1053e12c5d1SDavid du Colombier 		while(((c=fname(name))==',' || c=='\n') && name[0]){
1063e12c5d1SDavid du Colombier work here
1073e12c5d1SDavid du Colombier 			if(c=='\n')
1083e12c5d1SDavid du Colombier 				break;
1093e12c5d1SDavid du Colombier 		}
1103e12c5d1SDavid du Colombier 	}
1113e12c5d1SDavid du Colombier 
1123e12c5d1SDavid du Colombier skipline:
1133e12c5d1SDavid du Colombier 	while(c != '\n')
1143e12c5d1SDavid du Colombier 		fname(ustr);
1153e12c5d1SDavid du Colombier }
1163e12c5d1SDavid du Colombier #endif
1173e12c5d1SDavid du Colombier 
118219b2ee8SDavid du Colombier /*
119219b2ee8SDavid du Colombier 	-1:adm:adm:
120219b2ee8SDavid du Colombier 	0:none:adm:
121219b2ee8SDavid du Colombier 	1:tor:tor:
122219b2ee8SDavid du Colombier 	10000:sys::
123219b2ee8SDavid du Colombier 	10001:map:map:
124219b2ee8SDavid du Colombier 	10002:doc::
125219b2ee8SDavid du Colombier 	10003:upas:upas:
126219b2ee8SDavid du Colombier 	10004:font::
127219b2ee8SDavid du Colombier 	10005:bootes:bootes:
128219b2ee8SDavid du Colombier */
129219b2ee8SDavid du Colombier 
130219b2ee8SDavid du Colombier struct {
131219b2ee8SDavid du Colombier 	int	uid;
132219b2ee8SDavid du Colombier 	char	*name;
133219b2ee8SDavid du Colombier 	int	leader;
134219b2ee8SDavid du Colombier }
135219b2ee8SDavid du Colombier admusers[] = {
136219b2ee8SDavid du Colombier 	-1,	"adm",	-1,
137219b2ee8SDavid du Colombier 	 0,	"none",	-1,
138219b2ee8SDavid du Colombier 	 1,	"tor",	1,
1397dd7cddfSDavid du Colombier 	 2,	"glenda",	2,
140219b2ee8SDavid du Colombier 	10000,	"sys",	0,
1417dd7cddfSDavid du Colombier 	10001,	"upas",	10001,
1427dd7cddfSDavid du Colombier 	10002,	"bootes",	10002,
143219b2ee8SDavid du Colombier 	0,	0,	0,
144219b2ee8SDavid du Colombier };
145219b2ee8SDavid du Colombier 
146219b2ee8SDavid du Colombier 
1473e12c5d1SDavid du Colombier void
cmd_user(void)1483e12c5d1SDavid du Colombier cmd_user(void)
1493e12c5d1SDavid du Colombier {
150219b2ee8SDavid du Colombier 	int c, n, o, u, g, i;
1513e12c5d1SDavid du Colombier 	char name[NAMELEN];
1523e12c5d1SDavid du Colombier 
153*ed250ae1SDavid du Colombier 	if(con_clone(FID1, FID2))
154*ed250ae1SDavid du Colombier 		goto ainitu;
155*ed250ae1SDavid du Colombier 	if(con_path(FID2, "/adm/users"))
156*ed250ae1SDavid du Colombier 		goto ainitu;
157*ed250ae1SDavid du Colombier 	if(con_open(FID2, 0)){
158*ed250ae1SDavid du Colombier 		goto ainitu;
159*ed250ae1SDavid du Colombier 	}
160*ed250ae1SDavid du Colombier 
1613e12c5d1SDavid du Colombier 	wlock(&uidgc.uidlock);
1629a747e4fSDavid du Colombier 	uidgc.uidbuf = malloc(MAXDAT);
1633e12c5d1SDavid du Colombier 
1643e12c5d1SDavid du Colombier 	memset(uid, 0, conf.nuid * sizeof(*uid));
1653e12c5d1SDavid du Colombier 	memset(uidspace, 0, conf.uidspace * sizeof(*uidspace));
1663e12c5d1SDavid du Colombier 	memset(gidspace, 0, conf.gidspace * sizeof(*gidspace));
1673e12c5d1SDavid du Colombier 
1683e12c5d1SDavid du Colombier 	uidgc.flen = 0;
1693e12c5d1SDavid du Colombier 	uidgc.find = 0;
1703e12c5d1SDavid du Colombier 	cons.offset = 0;
1713e12c5d1SDavid du Colombier 	u = 0;
1723e12c5d1SDavid du Colombier 	o = conf.uidspace;
1733e12c5d1SDavid du Colombier 
1743e12c5d1SDavid du Colombier ul1:
1753e12c5d1SDavid du Colombier 	c = fname(name);
1763e12c5d1SDavid du Colombier 	if(c != ':')
1773e12c5d1SDavid du Colombier 		goto uskip;
1783e12c5d1SDavid du Colombier 	n = atol(name);
1793e12c5d1SDavid du Colombier 	if(n == 0)
1803e12c5d1SDavid du Colombier 		goto uskip;
1813e12c5d1SDavid du Colombier 	c = fname(name);
1823e12c5d1SDavid du Colombier 	if(c != ':')
1833e12c5d1SDavid du Colombier 		goto uskip;
1843e12c5d1SDavid du Colombier 	o -= strlen(name)+1;
1853e12c5d1SDavid du Colombier 	if(o < 0) {
1863e12c5d1SDavid du Colombier 		cprint("conf.uidspace(%ld) too small\n", conf.uidspace);
1873e12c5d1SDavid du Colombier 		goto initu;
1883e12c5d1SDavid du Colombier 	}
1893e12c5d1SDavid du Colombier 	strcpy(uidspace+o, name);
1903e12c5d1SDavid du Colombier 	uid[u].uid = n;
1913e12c5d1SDavid du Colombier 	uid[u].offset = o;
1923e12c5d1SDavid du Colombier 	u++;
1933e12c5d1SDavid du Colombier 	if(u >= conf.nuid) {
1943e12c5d1SDavid du Colombier 		cprint("conf.nuid(%ld) too small\n", conf.nuid);
1953e12c5d1SDavid du Colombier 		goto initu;
1963e12c5d1SDavid du Colombier 	}
1973e12c5d1SDavid du Colombier 
1983e12c5d1SDavid du Colombier uskip:
1993e12c5d1SDavid du Colombier 	if(c == '\n')
2003e12c5d1SDavid du Colombier 		goto ul1;
2013e12c5d1SDavid du Colombier 	if(c) {
2023e12c5d1SDavid du Colombier 		c = fname(name);
2033e12c5d1SDavid du Colombier 		goto uskip;
2043e12c5d1SDavid du Colombier 	}
2053e12c5d1SDavid du Colombier /*	cprint("%d uids read\n", u);/**/
2063e12c5d1SDavid du Colombier 	qsort(uid, u, sizeof(uid[0]), byuid);
2073e12c5d1SDavid du Colombier 	for(c=u-1; c>0; c--)
2083e12c5d1SDavid du Colombier 		if(uid[c].uid == uid[c-1].uid) {
2093e12c5d1SDavid du Colombier 			cprint("duplicate uids: %d\n", uid[c].uid);
2103e12c5d1SDavid du Colombier 			cprint("	%s", uidspace+uid[c].offset);
2113e12c5d1SDavid du Colombier 			cprint(" %s\n", uidspace+uid[c-1].offset);
2123e12c5d1SDavid du Colombier 		}
2133e12c5d1SDavid du Colombier 	qsort(uid, u, sizeof(uid[0]), byname);
2143e12c5d1SDavid du Colombier 	for(c=u-1; c>0; c--)
2153e12c5d1SDavid du Colombier 		if(!strcmp(uidspace+uid[c].offset,
2163e12c5d1SDavid du Colombier 		   uidspace+uid[c-1].offset)) {
2173e12c5d1SDavid du Colombier 			cprint("kfs: duplicate names: %s\n", uidspace+uid[c].offset);
2183e12c5d1SDavid du Colombier 			cprint("	%d", uid[c].uid);
2193e12c5d1SDavid du Colombier 			cprint(" %d\n", uid[c-1].uid);
2203e12c5d1SDavid du Colombier 		}
2213e12c5d1SDavid du Colombier 	if(cons.flags & Fuid)
2223e12c5d1SDavid du Colombier 		for(c=0; c<u; c++)
2233e12c5d1SDavid du Colombier 			cprint("%6d %s\n", uid[c].uid, uidspace+uid[c].offset);
2243e12c5d1SDavid du Colombier 
2253e12c5d1SDavid du Colombier 	uidgc.flen = 0;
2263e12c5d1SDavid du Colombier 	uidgc.find = 0;
2273e12c5d1SDavid du Colombier 	cons.offset = 0;
2283e12c5d1SDavid du Colombier 	g = 0;
2293e12c5d1SDavid du Colombier 
2303e12c5d1SDavid du Colombier gl1:
2313e12c5d1SDavid du Colombier 	c = fname(name);
2323e12c5d1SDavid du Colombier 	if(c != ':')
2333e12c5d1SDavid du Colombier 		goto gskip;
2343e12c5d1SDavid du Colombier 	n = atol(name);		/* number */
2353e12c5d1SDavid du Colombier 	if(n == 0)
2363e12c5d1SDavid du Colombier 		goto gskip;
2373e12c5d1SDavid du Colombier 	c = fname(name);	/* name */
2383e12c5d1SDavid du Colombier 	if(c != ':')
2393e12c5d1SDavid du Colombier 		goto gskip;
2403e12c5d1SDavid du Colombier 	c = fname(name);	/* leader */
2413e12c5d1SDavid du Colombier 	if(c != ':')
2423e12c5d1SDavid du Colombier 		goto gskip;
2433e12c5d1SDavid du Colombier 	o = strtouid1(name);
2443e12c5d1SDavid du Colombier 	if(o == 0 && strcmp(name, "") != 0)
2453e12c5d1SDavid du Colombier 		o = n;
2463e12c5d1SDavid du Colombier 	for(c=0; c<u; c++)
2473e12c5d1SDavid du Colombier 		if(uid[c].uid == n) {
2483e12c5d1SDavid du Colombier 			uid[c].lead = o;
2493e12c5d1SDavid du Colombier 			break;
2503e12c5d1SDavid du Colombier 		}
2513e12c5d1SDavid du Colombier 	c = fname(name);	/* list of members */
2523e12c5d1SDavid du Colombier 	if(c != ',' && c != '\n')
2533e12c5d1SDavid du Colombier 		goto gskip;
2543e12c5d1SDavid du Colombier 	if(!name[0])
2553e12c5d1SDavid du Colombier 		goto gskip;
2563e12c5d1SDavid du Colombier 	gidspace[g++] = n;
2573e12c5d1SDavid du Colombier gl2:
2583e12c5d1SDavid du Colombier 	n = strtouid1(name);
2593e12c5d1SDavid du Colombier 	if(n)
2603e12c5d1SDavid du Colombier 		gidspace[g++] = n;
2613e12c5d1SDavid du Colombier 	if(g >= conf.gidspace-2) {
2623e12c5d1SDavid du Colombier 		cprint("conf.gidspace(%ld) too small\n", conf.gidspace);
2633e12c5d1SDavid du Colombier 		goto initu;
2643e12c5d1SDavid du Colombier 	}
2653e12c5d1SDavid du Colombier 	if(c == '\n')
2663e12c5d1SDavid du Colombier 		goto gl3;
2673e12c5d1SDavid du Colombier 	c = fname(name);
2683e12c5d1SDavid du Colombier 	if(c == ',' || c == '\n')
2693e12c5d1SDavid du Colombier 		goto gl2;
2703e12c5d1SDavid du Colombier 	cprint("gid truncated\n");
2713e12c5d1SDavid du Colombier 
2723e12c5d1SDavid du Colombier gl3:
2733e12c5d1SDavid du Colombier 	gidspace[g++] = 0;
2743e12c5d1SDavid du Colombier 
2753e12c5d1SDavid du Colombier gskip:
2763e12c5d1SDavid du Colombier 	if(c == '\n')
2773e12c5d1SDavid du Colombier 		goto gl1;
2783e12c5d1SDavid du Colombier 	if(c) {
2793e12c5d1SDavid du Colombier 		c = fname(name);
2803e12c5d1SDavid du Colombier 		goto gskip;
2813e12c5d1SDavid du Colombier 	}
2823e12c5d1SDavid du Colombier 	if(cons.flags & Fuid) {
2833e12c5d1SDavid du Colombier 		o = 0;
2843e12c5d1SDavid du Colombier 		for(c=0; c<g; c++) {
2853e12c5d1SDavid du Colombier 			n = gidspace[c];
2863e12c5d1SDavid du Colombier 			if(n == 0) {
2873e12c5d1SDavid du Colombier 				o = 0;
2883e12c5d1SDavid du Colombier 				continue;
2893e12c5d1SDavid du Colombier 			}
2903e12c5d1SDavid du Colombier 			uidtostr1(name, n);
2913e12c5d1SDavid du Colombier 			if(o) {
2923e12c5d1SDavid du Colombier 				if(o > 6) {
2933e12c5d1SDavid du Colombier 					cprint("\n       %s", name);
2943e12c5d1SDavid du Colombier 					o = 1;
2953e12c5d1SDavid du Colombier 				} else
2963e12c5d1SDavid du Colombier 					cprint(" %s", name);
2973e12c5d1SDavid du Colombier 			} else
2983e12c5d1SDavid du Colombier 				cprint("\n%6s", name);
2993e12c5d1SDavid du Colombier 			o++;
3003e12c5d1SDavid du Colombier 		}
3013e12c5d1SDavid du Colombier 		cprint("\n");
3023e12c5d1SDavid du Colombier 	}
3033e12c5d1SDavid du Colombier 	goto out;
3043e12c5d1SDavid du Colombier 
305*ed250ae1SDavid du Colombier ainitu:
306*ed250ae1SDavid du Colombier 	wlock(&uidgc.uidlock);
307*ed250ae1SDavid du Colombier 	uidgc.uidbuf = malloc(MAXDAT);
308*ed250ae1SDavid du Colombier 
3093e12c5d1SDavid du Colombier initu:
3103e12c5d1SDavid du Colombier 	cprint("initializing minimal user table\n");
311219b2ee8SDavid du Colombier 	memset(uid, 0, conf.nuid * sizeof(*uid));
312219b2ee8SDavid du Colombier 	memset(uidspace, 0, conf.uidspace * sizeof(*uidspace));
313219b2ee8SDavid du Colombier 	memset(gidspace, 0, conf.gidspace * sizeof(*gidspace));
3143e12c5d1SDavid du Colombier 	o = conf.uidspace;
3153e12c5d1SDavid du Colombier 	u = 0;
3163e12c5d1SDavid du Colombier 
317219b2ee8SDavid du Colombier 	for(i=0; admusers[i].name; i++){
318219b2ee8SDavid du Colombier 		o -= strlen(admusers[i].name)+1;
319219b2ee8SDavid du Colombier 		strcpy(uidspace+o, admusers[i].name);
320219b2ee8SDavid du Colombier 		uid[u].uid = admusers[i].uid;
321219b2ee8SDavid du Colombier 		uid[u].lead = admusers[i].leader;
3223e12c5d1SDavid du Colombier 		uid[u].offset = o;
3233e12c5d1SDavid du Colombier 		u++;
324219b2ee8SDavid du Colombier 	}
3253e12c5d1SDavid du Colombier 
3263e12c5d1SDavid du Colombier out:
3279a747e4fSDavid du Colombier 	free(uidgc.uidbuf);
3285d459b5aSDavid du Colombier 	writegroup = strtouid1("write");
3293e12c5d1SDavid du Colombier 	wunlock(&uidgc.uidlock);
3303e12c5d1SDavid du Colombier 
3313e12c5d1SDavid du Colombier }
3323e12c5d1SDavid du Colombier 
3333e12c5d1SDavid du Colombier void
uidtostr(char * name,int id)3343e12c5d1SDavid du Colombier uidtostr(char *name, int id)
3353e12c5d1SDavid du Colombier {
3363e12c5d1SDavid du Colombier 	rlock(&uidgc.uidlock);
3373e12c5d1SDavid du Colombier 	uidtostr1(name, id);
3383e12c5d1SDavid du Colombier 	runlock(&uidgc.uidlock);
3393e12c5d1SDavid du Colombier }
3403e12c5d1SDavid du Colombier 
3413e12c5d1SDavid du Colombier void
uidtostr1(char * name,int id)3423e12c5d1SDavid du Colombier uidtostr1(char *name, int id)
3433e12c5d1SDavid du Colombier {
3443e12c5d1SDavid du Colombier 	Uid *u;
3453e12c5d1SDavid du Colombier 	int i;
3463e12c5d1SDavid du Colombier 
347219b2ee8SDavid du Colombier 	if(id == 0){
348219b2ee8SDavid du Colombier 		strncpy(name, "none", NAMELEN);
349219b2ee8SDavid du Colombier 		return;
350219b2ee8SDavid du Colombier 	}
3513e12c5d1SDavid du Colombier 	for(i=0, u=uid; i<conf.nuid; i++,u++) {
3523e12c5d1SDavid du Colombier 		if(u->uid == id) {
3533e12c5d1SDavid du Colombier 			strncpy(name, uidspace+u->offset, NAMELEN);
3543e12c5d1SDavid du Colombier 			return;
3553e12c5d1SDavid du Colombier 		}
3563e12c5d1SDavid du Colombier 	}
3573e12c5d1SDavid du Colombier 	strncpy(name, "none", NAMELEN);
3583e12c5d1SDavid du Colombier }
3593e12c5d1SDavid du Colombier 
3603e12c5d1SDavid du Colombier int
strtouid(char * s)3613e12c5d1SDavid du Colombier strtouid(char *s)
3623e12c5d1SDavid du Colombier {
3633e12c5d1SDavid du Colombier 	int i;
3643e12c5d1SDavid du Colombier 
3653e12c5d1SDavid du Colombier 	rlock(&uidgc.uidlock);
3663e12c5d1SDavid du Colombier 	i = strtouid1(s);
3673e12c5d1SDavid du Colombier 	runlock(&uidgc.uidlock);
3683e12c5d1SDavid du Colombier 	return i;
3693e12c5d1SDavid du Colombier }
3703e12c5d1SDavid du Colombier 
3713e12c5d1SDavid du Colombier int
strtouid1(char * s)3723e12c5d1SDavid du Colombier strtouid1(char *s)
3733e12c5d1SDavid du Colombier {
3743e12c5d1SDavid du Colombier 	Uid *u;
3753e12c5d1SDavid du Colombier 	int i;
3763e12c5d1SDavid du Colombier 
377219b2ee8SDavid du Colombier 	for(i=0, u=uid; i<conf.nuid; i++,u++)
3783e12c5d1SDavid du Colombier 		if(!strcmp(s, uidspace+u->offset))
3793e12c5d1SDavid du Colombier 			return u->uid;
3803e12c5d1SDavid du Colombier 	return 0;
3813e12c5d1SDavid du Colombier }
3823e12c5d1SDavid du Colombier 
3833e12c5d1SDavid du Colombier int
ingroup(int u,int g)3843e12c5d1SDavid du Colombier ingroup(int u, int g)
3853e12c5d1SDavid du Colombier {
3863e12c5d1SDavid du Colombier 	short *p;
3873e12c5d1SDavid du Colombier 
3883e12c5d1SDavid du Colombier 	if(u == g)
3893e12c5d1SDavid du Colombier 		return 1;
3903e12c5d1SDavid du Colombier 	rlock(&uidgc.uidlock);
3913e12c5d1SDavid du Colombier 	for(p=gidspace; *p;) {
3923e12c5d1SDavid du Colombier 		if(*p != g) {
3933e12c5d1SDavid du Colombier 			for(p++; *p++;)
3943e12c5d1SDavid du Colombier 				;
3953e12c5d1SDavid du Colombier 			continue;
3963e12c5d1SDavid du Colombier 		}
3973e12c5d1SDavid du Colombier 		for(p++; *p; p++)
3983e12c5d1SDavid du Colombier 			if(*p == u) {
3993e12c5d1SDavid du Colombier 				runlock(&uidgc.uidlock);
4003e12c5d1SDavid du Colombier 				return 1;
4013e12c5d1SDavid du Colombier 			}
4023e12c5d1SDavid du Colombier 	}
4033e12c5d1SDavid du Colombier 	runlock(&uidgc.uidlock);
4043e12c5d1SDavid du Colombier 	return 0;
4053e12c5d1SDavid du Colombier }
4063e12c5d1SDavid du Colombier 
4073e12c5d1SDavid du Colombier int
leadgroup(int ui,int gi)4083e12c5d1SDavid du Colombier leadgroup(int ui, int gi)
4093e12c5d1SDavid du Colombier {
4103e12c5d1SDavid du Colombier 	Uid *u;
4113e12c5d1SDavid du Colombier 	int i;
4123e12c5d1SDavid du Colombier 
4133e12c5d1SDavid du Colombier 	rlock(&uidgc.uidlock);
4143e12c5d1SDavid du Colombier 	for(i=0, u=uid; i<conf.nuid; i++,u++) {
4153e12c5d1SDavid du Colombier 		if(u->uid == gi) {
4163e12c5d1SDavid du Colombier 			i = u->lead;
4173e12c5d1SDavid du Colombier 			runlock(&uidgc.uidlock);
4183e12c5d1SDavid du Colombier 			if(i == ui)
4193e12c5d1SDavid du Colombier 				return 1;
4203e12c5d1SDavid du Colombier 			if(i == 0)
4213e12c5d1SDavid du Colombier 				return ingroup(ui, gi);
4223e12c5d1SDavid du Colombier 			return 0;
4233e12c5d1SDavid du Colombier 		}
4243e12c5d1SDavid du Colombier 	}
4253e12c5d1SDavid du Colombier 	runlock(&uidgc.uidlock);
4263e12c5d1SDavid du Colombier 	return 0;
4273e12c5d1SDavid du Colombier }
428