xref: /plan9/sys/src/cmd/disk/kfs/uid.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include "all.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier struct
43e12c5d1SDavid du Colombier {
53e12c5d1SDavid du Colombier 	RWlock	uidlock;
63e12c5d1SDavid du Colombier 	Iobuf*	uidbuf;
73e12c5d1SDavid du Colombier 	int	flen;
83e12c5d1SDavid du Colombier 	int	find;
93e12c5d1SDavid du Colombier } uidgc;
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier int
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
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
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;
373e12c5d1SDavid du Colombier 		uidgc.flen = con_read(FID2, uidgc.uidbuf->iobuf,
383e12c5d1SDavid du Colombier 			cons.offset, BUFSIZE);
393e12c5d1SDavid du Colombier 		if(uidgc.flen <= 0)
403e12c5d1SDavid du Colombier 			return 0;
413e12c5d1SDavid du Colombier 		cons.offset += uidgc.flen;
423e12c5d1SDavid du Colombier 	}
433e12c5d1SDavid du Colombier 	return uidgc.uidbuf->iobuf[uidgc.find++];
443e12c5d1SDavid du Colombier }
453e12c5d1SDavid du Colombier 
463e12c5d1SDavid du Colombier int
473e12c5d1SDavid du Colombier fname(char *name)
483e12c5d1SDavid du Colombier {
493e12c5d1SDavid du Colombier 	int i, c;
503e12c5d1SDavid du Colombier 
513e12c5d1SDavid du Colombier 	memset(name, 0, NAMELEN);
523e12c5d1SDavid du Colombier 	for(i=0;; i++) {
533e12c5d1SDavid du Colombier 		c = fchar();
543e12c5d1SDavid du Colombier 		switch(c) {
553e12c5d1SDavid du Colombier 		case ':':
563e12c5d1SDavid du Colombier 		case '\n':
573e12c5d1SDavid du Colombier 		case ',':
583e12c5d1SDavid du Colombier 		case ' ':
593e12c5d1SDavid du Colombier 		case '#':
603e12c5d1SDavid du Colombier 		case 0:
613e12c5d1SDavid du Colombier 			return c;
623e12c5d1SDavid du Colombier 		}
633e12c5d1SDavid du Colombier 		if(i < NAMELEN-1)
643e12c5d1SDavid du Colombier 			name[i] = c;
653e12c5d1SDavid du Colombier 	}
663e12c5d1SDavid du Colombier 	return -1;
673e12c5d1SDavid du Colombier }
683e12c5d1SDavid du Colombier 
693e12c5d1SDavid du Colombier #ifdef sometime
703e12c5d1SDavid du Colombier /*
713e12c5d1SDavid du Colombier  * file format is
723e12c5d1SDavid du Colombier  * uid:name:lead:member,member,...\n
733e12c5d1SDavid du Colombier  */
743e12c5d1SDavid du Colombier void
753e12c5d1SDavid du Colombier read_user(void)
763e12c5d1SDavid du Colombier {
773e12c5d1SDavid du Colombier 	int c;
783e12c5d1SDavid du Colombier 
793e12c5d1SDavid du Colombier 	if((c=fname(ustr))!=':' || (c=fname(name))!=':' || (c=fname(lead))!=':')
803e12c5d1SDavid du Colombier 		goto skipline;
813e12c5d1SDavid du Colombier 	n = atol(ustr);
823e12c5d1SDavid du Colombier 	if(n == 0)
833e12c5d1SDavid du Colombier 		goto skipline;
843e12c5d1SDavid du Colombier 	if(readu){
853e12c5d1SDavid du Colombier 		o -= strlen(name)+1;
863e12c5d1SDavid du Colombier 		if(o < 0) {
873e12c5d1SDavid du Colombier 			cprint("conf.uidspace(%ld) too small\n", conf.uidspace);
883e12c5d1SDavid du Colombier 			return -1;
893e12c5d1SDavid du Colombier 		}
903e12c5d1SDavid du Colombier 		strcpy(uidspace+o, name);
913e12c5d1SDavid du Colombier 		uid[u].uid = n;
923e12c5d1SDavid du Colombier 		uid[u].offset = o;
933e12c5d1SDavid du Colombier 		u++;
943e12c5d1SDavid du Colombier 		if(u >= conf.nuid) {
953e12c5d1SDavid du Colombier 			cprint("conf.nuid(%ld) too small\n", conf.nuid);
963e12c5d1SDavid du Colombier 			goto initu;
973e12c5d1SDavid du Colombier 		}
983e12c5d1SDavid du Colombier 	}else{
993e12c5d1SDavid du Colombier 		o = strtouid1(name);
1003e12c5d1SDavid du Colombier 		if(o == 0 && strcmp(name, "") != 0)
1013e12c5d1SDavid du Colombier 			o = n;
1023e12c5d1SDavid du Colombier 		for(c=0; c<u; c++)
1033e12c5d1SDavid du Colombier 			if(uid[c].uid == n) {
1043e12c5d1SDavid du Colombier 				uid[c].lead = o;
1053e12c5d1SDavid du Colombier 				break;
1063e12c5d1SDavid du Colombier 			}
1073e12c5d1SDavid du Colombier 		while(((c=fname(name))==',' || c=='\n') && name[0]){
1083e12c5d1SDavid du Colombier work here
1093e12c5d1SDavid du Colombier 			if(c=='\n')
1103e12c5d1SDavid du Colombier 				break;
1113e12c5d1SDavid du Colombier 		}
1123e12c5d1SDavid du Colombier 	}
1133e12c5d1SDavid du Colombier 
1143e12c5d1SDavid du Colombier skipline:
1153e12c5d1SDavid du Colombier 	while(c != '\n')
1163e12c5d1SDavid du Colombier 		fname(ustr);
1173e12c5d1SDavid du Colombier }
1183e12c5d1SDavid du Colombier #endif
1193e12c5d1SDavid du Colombier 
120*219b2ee8SDavid du Colombier /*
121*219b2ee8SDavid du Colombier 	-1:adm:adm:
122*219b2ee8SDavid du Colombier 	0:none:adm:
123*219b2ee8SDavid du Colombier 	1:tor:tor:
124*219b2ee8SDavid du Colombier 	10000:sys::
125*219b2ee8SDavid du Colombier 	10001:map:map:
126*219b2ee8SDavid du Colombier 	10002:doc::
127*219b2ee8SDavid du Colombier 	10003:upas:upas:
128*219b2ee8SDavid du Colombier 	10004:font::
129*219b2ee8SDavid du Colombier 	10005:bootes:bootes:
130*219b2ee8SDavid du Colombier */
131*219b2ee8SDavid du Colombier 
132*219b2ee8SDavid du Colombier struct {
133*219b2ee8SDavid du Colombier 	int	uid;
134*219b2ee8SDavid du Colombier 	char	*name;
135*219b2ee8SDavid du Colombier 	int	leader;
136*219b2ee8SDavid du Colombier }
137*219b2ee8SDavid du Colombier admusers[] = {
138*219b2ee8SDavid du Colombier 	-1,	"adm",	-1,
139*219b2ee8SDavid du Colombier 	 0,	"none",	-1,
140*219b2ee8SDavid du Colombier 	 1,	"tor",	1,
141*219b2ee8SDavid du Colombier 	10000,	"sys",	0,
142*219b2ee8SDavid du Colombier 	10001,	"map",	10001,
143*219b2ee8SDavid du Colombier 	10002,	"doc",	0,
144*219b2ee8SDavid du Colombier 	10003,	"upas",	10003,
145*219b2ee8SDavid du Colombier 	10004,	"font",	0,
146*219b2ee8SDavid du Colombier 	10005,	"bootes",	10005,
147*219b2ee8SDavid du Colombier 	0,	0,	0,
148*219b2ee8SDavid du Colombier };
149*219b2ee8SDavid du Colombier 
150*219b2ee8SDavid du Colombier 
1513e12c5d1SDavid du Colombier void
1523e12c5d1SDavid du Colombier cmd_user(void)
1533e12c5d1SDavid du Colombier {
154*219b2ee8SDavid du Colombier 	int c, n, o, u, g, i;
1553e12c5d1SDavid du Colombier 	char name[NAMELEN];
1563e12c5d1SDavid du Colombier 
1573e12c5d1SDavid du Colombier 	wlock(&uidgc.uidlock);
1583e12c5d1SDavid du Colombier 	uidgc.uidbuf = getbuf(devnone, Cuidbuf, 0);
1593e12c5d1SDavid du Colombier 
1603e12c5d1SDavid du Colombier 	memset(uid, 0, conf.nuid * sizeof(*uid));
1613e12c5d1SDavid du Colombier 	memset(uidspace, 0, conf.uidspace * sizeof(*uidspace));
1623e12c5d1SDavid du Colombier 	memset(gidspace, 0, conf.gidspace * sizeof(*gidspace));
1633e12c5d1SDavid du Colombier 
1643e12c5d1SDavid du Colombier 	if(con_clone(FID1, FID2))
1653e12c5d1SDavid du Colombier 		goto initu;
1663e12c5d1SDavid du Colombier 	if(con_path(FID2, "/adm/users"))
1673e12c5d1SDavid du Colombier 		goto initu;
1683e12c5d1SDavid du Colombier 	if(con_open(FID2, 0))
1693e12c5d1SDavid du Colombier 		goto initu;
1703e12c5d1SDavid du Colombier 
1713e12c5d1SDavid du Colombier 	uidgc.flen = 0;
1723e12c5d1SDavid du Colombier 	uidgc.find = 0;
1733e12c5d1SDavid du Colombier 	cons.offset = 0;
1743e12c5d1SDavid du Colombier 	u = 0;
1753e12c5d1SDavid du Colombier 	o = conf.uidspace;
1763e12c5d1SDavid du Colombier 
1773e12c5d1SDavid du Colombier ul1:
1783e12c5d1SDavid du Colombier 	c = fname(name);
1793e12c5d1SDavid du Colombier 	if(c != ':')
1803e12c5d1SDavid du Colombier 		goto uskip;
1813e12c5d1SDavid du Colombier 	n = atol(name);
1823e12c5d1SDavid du Colombier 	if(n == 0)
1833e12c5d1SDavid du Colombier 		goto uskip;
1843e12c5d1SDavid du Colombier 	c = fname(name);
1853e12c5d1SDavid du Colombier 	if(c != ':')
1863e12c5d1SDavid du Colombier 		goto uskip;
1873e12c5d1SDavid du Colombier 	o -= strlen(name)+1;
1883e12c5d1SDavid du Colombier 	if(o < 0) {
1893e12c5d1SDavid du Colombier 		cprint("conf.uidspace(%ld) too small\n", conf.uidspace);
1903e12c5d1SDavid du Colombier 		goto initu;
1913e12c5d1SDavid du Colombier 	}
1923e12c5d1SDavid du Colombier 	strcpy(uidspace+o, name);
1933e12c5d1SDavid du Colombier 	uid[u].uid = n;
1943e12c5d1SDavid du Colombier 	uid[u].offset = o;
1953e12c5d1SDavid du Colombier 	u++;
1963e12c5d1SDavid du Colombier 	if(u >= conf.nuid) {
1973e12c5d1SDavid du Colombier 		cprint("conf.nuid(%ld) too small\n", conf.nuid);
1983e12c5d1SDavid du Colombier 		goto initu;
1993e12c5d1SDavid du Colombier 	}
2003e12c5d1SDavid du Colombier 
2013e12c5d1SDavid du Colombier uskip:
2023e12c5d1SDavid du Colombier 	if(c == '\n')
2033e12c5d1SDavid du Colombier 		goto ul1;
2043e12c5d1SDavid du Colombier 	if(c) {
2053e12c5d1SDavid du Colombier 		c = fname(name);
2063e12c5d1SDavid du Colombier 		goto uskip;
2073e12c5d1SDavid du Colombier 	}
2083e12c5d1SDavid du Colombier /*	cprint("%d uids read\n", u);/**/
2093e12c5d1SDavid du Colombier 	qsort(uid, u, sizeof(uid[0]), byuid);
2103e12c5d1SDavid du Colombier 	for(c=u-1; c>0; c--)
2113e12c5d1SDavid du Colombier 		if(uid[c].uid == uid[c-1].uid) {
2123e12c5d1SDavid du Colombier 			cprint("duplicate uids: %d\n", uid[c].uid);
2133e12c5d1SDavid du Colombier 			cprint("	%s", uidspace+uid[c].offset);
2143e12c5d1SDavid du Colombier 			cprint(" %s\n", uidspace+uid[c-1].offset);
2153e12c5d1SDavid du Colombier 		}
2163e12c5d1SDavid du Colombier 	qsort(uid, u, sizeof(uid[0]), byname);
2173e12c5d1SDavid du Colombier 	for(c=u-1; c>0; c--)
2183e12c5d1SDavid du Colombier 		if(!strcmp(uidspace+uid[c].offset,
2193e12c5d1SDavid du Colombier 		   uidspace+uid[c-1].offset)) {
2203e12c5d1SDavid du Colombier 			cprint("kfs: duplicate names: %s\n", uidspace+uid[c].offset);
2213e12c5d1SDavid du Colombier 			cprint("	%d", uid[c].uid);
2223e12c5d1SDavid du Colombier 			cprint(" %d\n", uid[c-1].uid);
2233e12c5d1SDavid du Colombier 		}
2243e12c5d1SDavid du Colombier 	if(cons.flags & Fuid)
2253e12c5d1SDavid du Colombier 		for(c=0; c<u; c++)
2263e12c5d1SDavid du Colombier 			cprint("%6d %s\n", uid[c].uid, uidspace+uid[c].offset);
2273e12c5d1SDavid du Colombier 
2283e12c5d1SDavid du Colombier 	uidgc.flen = 0;
2293e12c5d1SDavid du Colombier 	uidgc.find = 0;
2303e12c5d1SDavid du Colombier 	cons.offset = 0;
2313e12c5d1SDavid du Colombier 	g = 0;
2323e12c5d1SDavid du Colombier 
2333e12c5d1SDavid du Colombier gl1:
2343e12c5d1SDavid du Colombier 	c = fname(name);
2353e12c5d1SDavid du Colombier 	if(c != ':')
2363e12c5d1SDavid du Colombier 		goto gskip;
2373e12c5d1SDavid du Colombier 	n = atol(name);		/* number */
2383e12c5d1SDavid du Colombier 	if(n == 0)
2393e12c5d1SDavid du Colombier 		goto gskip;
2403e12c5d1SDavid du Colombier 	c = fname(name);	/* name */
2413e12c5d1SDavid du Colombier 	if(c != ':')
2423e12c5d1SDavid du Colombier 		goto gskip;
2433e12c5d1SDavid du Colombier 	c = fname(name);	/* leader */
2443e12c5d1SDavid du Colombier 	if(c != ':')
2453e12c5d1SDavid du Colombier 		goto gskip;
2463e12c5d1SDavid du Colombier 	o = strtouid1(name);
2473e12c5d1SDavid du Colombier 	if(o == 0 && strcmp(name, "") != 0)
2483e12c5d1SDavid du Colombier 		o = n;
2493e12c5d1SDavid du Colombier 	for(c=0; c<u; c++)
2503e12c5d1SDavid du Colombier 		if(uid[c].uid == n) {
2513e12c5d1SDavid du Colombier 			uid[c].lead = o;
2523e12c5d1SDavid du Colombier 			break;
2533e12c5d1SDavid du Colombier 		}
2543e12c5d1SDavid du Colombier 	c = fname(name);	/* list of members */
2553e12c5d1SDavid du Colombier 	if(c != ',' && c != '\n')
2563e12c5d1SDavid du Colombier 		goto gskip;
2573e12c5d1SDavid du Colombier 	if(!name[0])
2583e12c5d1SDavid du Colombier 		goto gskip;
2593e12c5d1SDavid du Colombier 	gidspace[g++] = n;
2603e12c5d1SDavid du Colombier gl2:
2613e12c5d1SDavid du Colombier 	n = strtouid1(name);
2623e12c5d1SDavid du Colombier 	if(n)
2633e12c5d1SDavid du Colombier 		gidspace[g++] = n;
2643e12c5d1SDavid du Colombier 	if(g >= conf.gidspace-2) {
2653e12c5d1SDavid du Colombier 		cprint("conf.gidspace(%ld) too small\n", conf.gidspace);
2663e12c5d1SDavid du Colombier 		goto initu;
2673e12c5d1SDavid du Colombier 	}
2683e12c5d1SDavid du Colombier 	if(c == '\n')
2693e12c5d1SDavid du Colombier 		goto gl3;
2703e12c5d1SDavid du Colombier 	c = fname(name);
2713e12c5d1SDavid du Colombier 	if(c == ',' || c == '\n')
2723e12c5d1SDavid du Colombier 		goto gl2;
2733e12c5d1SDavid du Colombier 	cprint("gid truncated\n");
2743e12c5d1SDavid du Colombier 
2753e12c5d1SDavid du Colombier gl3:
2763e12c5d1SDavid du Colombier 	gidspace[g++] = 0;
2773e12c5d1SDavid du Colombier 
2783e12c5d1SDavid du Colombier gskip:
2793e12c5d1SDavid du Colombier 	if(c == '\n')
2803e12c5d1SDavid du Colombier 		goto gl1;
2813e12c5d1SDavid du Colombier 	if(c) {
2823e12c5d1SDavid du Colombier 		c = fname(name);
2833e12c5d1SDavid du Colombier 		goto gskip;
2843e12c5d1SDavid du Colombier 	}
2853e12c5d1SDavid du Colombier 	if(cons.flags & Fuid) {
2863e12c5d1SDavid du Colombier 		o = 0;
2873e12c5d1SDavid du Colombier 		for(c=0; c<g; c++) {
2883e12c5d1SDavid du Colombier 			n = gidspace[c];
2893e12c5d1SDavid du Colombier 			if(n == 0) {
2903e12c5d1SDavid du Colombier 				o = 0;
2913e12c5d1SDavid du Colombier 				continue;
2923e12c5d1SDavid du Colombier 			}
2933e12c5d1SDavid du Colombier 			uidtostr1(name, n);
2943e12c5d1SDavid du Colombier 			if(o) {
2953e12c5d1SDavid du Colombier 				if(o > 6) {
2963e12c5d1SDavid du Colombier 					cprint("\n       %s", name);
2973e12c5d1SDavid du Colombier 					o = 1;
2983e12c5d1SDavid du Colombier 				} else
2993e12c5d1SDavid du Colombier 					cprint(" %s", name);
3003e12c5d1SDavid du Colombier 			} else
3013e12c5d1SDavid du Colombier 				cprint("\n%6s", name);
3023e12c5d1SDavid du Colombier 			o++;
3033e12c5d1SDavid du Colombier 		}
3043e12c5d1SDavid du Colombier 		cprint("\n");
3053e12c5d1SDavid du Colombier 	}
3063e12c5d1SDavid du Colombier 	goto out;
3073e12c5d1SDavid du Colombier 
3083e12c5d1SDavid du Colombier initu:
3093e12c5d1SDavid du Colombier 	cprint("initializing minimal user table\n");
310*219b2ee8SDavid du Colombier 	memset(uid, 0, conf.nuid * sizeof(*uid));
311*219b2ee8SDavid du Colombier 	memset(uidspace, 0, conf.uidspace * sizeof(*uidspace));
312*219b2ee8SDavid du Colombier 	memset(gidspace, 0, conf.gidspace * sizeof(*gidspace));
3133e12c5d1SDavid du Colombier 	o = conf.uidspace;
3143e12c5d1SDavid du Colombier 	u = 0;
3153e12c5d1SDavid du Colombier 
316*219b2ee8SDavid du Colombier 	for(i=0; admusers[i].name; i++){
317*219b2ee8SDavid du Colombier 		o -= strlen(admusers[i].name)+1;
318*219b2ee8SDavid du Colombier 		strcpy(uidspace+o, admusers[i].name);
319*219b2ee8SDavid du Colombier 		uid[u].uid = admusers[i].uid;
320*219b2ee8SDavid du Colombier 		uid[u].lead = admusers[i].leader;
3213e12c5d1SDavid du Colombier 		uid[u].offset = o;
3223e12c5d1SDavid du Colombier 		u++;
323*219b2ee8SDavid du Colombier 	}
3243e12c5d1SDavid du Colombier 
3253e12c5d1SDavid du Colombier out:
3263e12c5d1SDavid du Colombier 	putbuf(uidgc.uidbuf);
3273e12c5d1SDavid du Colombier 	wunlock(&uidgc.uidlock);
3283e12c5d1SDavid du Colombier 
3293e12c5d1SDavid du Colombier }
3303e12c5d1SDavid du Colombier 
3313e12c5d1SDavid du Colombier void
3323e12c5d1SDavid du Colombier uidtostr(char *name, int id)
3333e12c5d1SDavid du Colombier {
3343e12c5d1SDavid du Colombier 	rlock(&uidgc.uidlock);
3353e12c5d1SDavid du Colombier 	uidtostr1(name, id);
3363e12c5d1SDavid du Colombier 	runlock(&uidgc.uidlock);
3373e12c5d1SDavid du Colombier }
3383e12c5d1SDavid du Colombier 
3393e12c5d1SDavid du Colombier void
3403e12c5d1SDavid du Colombier uidtostr1(char *name, int id)
3413e12c5d1SDavid du Colombier {
3423e12c5d1SDavid du Colombier 	Uid *u;
3433e12c5d1SDavid du Colombier 	int i;
3443e12c5d1SDavid du Colombier 
345*219b2ee8SDavid du Colombier 	if(id == 0){
346*219b2ee8SDavid du Colombier 		strncpy(name, "none", NAMELEN);
347*219b2ee8SDavid du Colombier 		return;
348*219b2ee8SDavid du Colombier 	}
3493e12c5d1SDavid du Colombier 	for(i=0, u=uid; i<conf.nuid; i++,u++) {
3503e12c5d1SDavid du Colombier 		if(u->uid == id) {
3513e12c5d1SDavid du Colombier 			strncpy(name, uidspace+u->offset, NAMELEN);
3523e12c5d1SDavid du Colombier 			return;
3533e12c5d1SDavid du Colombier 		}
3543e12c5d1SDavid du Colombier 	}
3553e12c5d1SDavid du Colombier 	strncpy(name, "none", NAMELEN);
3563e12c5d1SDavid du Colombier }
3573e12c5d1SDavid du Colombier 
3583e12c5d1SDavid du Colombier int
3593e12c5d1SDavid du Colombier strtouid(char *s)
3603e12c5d1SDavid du Colombier {
3613e12c5d1SDavid du Colombier 	int i;
3623e12c5d1SDavid du Colombier 
3633e12c5d1SDavid du Colombier 	rlock(&uidgc.uidlock);
3643e12c5d1SDavid du Colombier 	i = strtouid1(s);
3653e12c5d1SDavid du Colombier 	runlock(&uidgc.uidlock);
3663e12c5d1SDavid du Colombier 	return i;
3673e12c5d1SDavid du Colombier }
3683e12c5d1SDavid du Colombier 
3693e12c5d1SDavid du Colombier int
3703e12c5d1SDavid du Colombier strtouid1(char *s)
3713e12c5d1SDavid du Colombier {
3723e12c5d1SDavid du Colombier 	Uid *u;
3733e12c5d1SDavid du Colombier 	int i;
3743e12c5d1SDavid du Colombier 
375*219b2ee8SDavid du Colombier 	for(i=0, u=uid; i<conf.nuid; i++,u++)
3763e12c5d1SDavid du Colombier 		if(!strcmp(s, uidspace+u->offset))
3773e12c5d1SDavid du Colombier 			return u->uid;
3783e12c5d1SDavid du Colombier 	return 0;
3793e12c5d1SDavid du Colombier }
3803e12c5d1SDavid du Colombier 
3813e12c5d1SDavid du Colombier int
3823e12c5d1SDavid du Colombier ingroup(int u, int g)
3833e12c5d1SDavid du Colombier {
3843e12c5d1SDavid du Colombier 	short *p;
3853e12c5d1SDavid du Colombier 
3863e12c5d1SDavid du Colombier 	if(u == g)
3873e12c5d1SDavid du Colombier 		return 1;
3883e12c5d1SDavid du Colombier 	rlock(&uidgc.uidlock);
3893e12c5d1SDavid du Colombier 	for(p=gidspace; *p;) {
3903e12c5d1SDavid du Colombier 		if(*p != g) {
3913e12c5d1SDavid du Colombier 			for(p++; *p++;)
3923e12c5d1SDavid du Colombier 				;
3933e12c5d1SDavid du Colombier 			continue;
3943e12c5d1SDavid du Colombier 		}
3953e12c5d1SDavid du Colombier 		for(p++; *p; p++)
3963e12c5d1SDavid du Colombier 			if(*p == u) {
3973e12c5d1SDavid du Colombier 				runlock(&uidgc.uidlock);
3983e12c5d1SDavid du Colombier 				return 1;
3993e12c5d1SDavid du Colombier 			}
4003e12c5d1SDavid du Colombier 	}
4013e12c5d1SDavid du Colombier 	runlock(&uidgc.uidlock);
4023e12c5d1SDavid du Colombier 	return 0;
4033e12c5d1SDavid du Colombier }
4043e12c5d1SDavid du Colombier 
4053e12c5d1SDavid du Colombier int
4063e12c5d1SDavid du Colombier leadgroup(int ui, int gi)
4073e12c5d1SDavid du Colombier {
4083e12c5d1SDavid du Colombier 	Uid *u;
4093e12c5d1SDavid du Colombier 	int i;
4103e12c5d1SDavid du Colombier 
4113e12c5d1SDavid du Colombier 	rlock(&uidgc.uidlock);
4123e12c5d1SDavid du Colombier 	for(i=0, u=uid; i<conf.nuid; i++,u++) {
4133e12c5d1SDavid du Colombier 		if(u->uid == gi) {
4143e12c5d1SDavid du Colombier 			i = u->lead;
4153e12c5d1SDavid du Colombier 			runlock(&uidgc.uidlock);
4163e12c5d1SDavid du Colombier 			if(i == ui)
4173e12c5d1SDavid du Colombier 				return 1;
4183e12c5d1SDavid du Colombier 			if(i == 0)
4193e12c5d1SDavid du Colombier 				return ingroup(ui, gi);
4203e12c5d1SDavid du Colombier 			return 0;
4213e12c5d1SDavid du Colombier 		}
4223e12c5d1SDavid du Colombier 	}
4233e12c5d1SDavid du Colombier 	runlock(&uidgc.uidlock);
4243e12c5d1SDavid du Colombier 	return 0;
4253e12c5d1SDavid du Colombier }
426