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