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