uid.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. #include "all.h"
  2. struct
  3. {
  4. RWLock uidlock;
  5. char* uidbuf;
  6. int flen;
  7. int find;
  8. } uidgc;
  9. int
  10. byuid(void *a1, void *a2)
  11. {
  12. Uid *u1, *u2;
  13. u1 = a1;
  14. u2 = a2;
  15. return u2->uid - u1->uid;
  16. }
  17. int
  18. byname(void *a1, void *a2)
  19. {
  20. Uid *u1, *u2;
  21. u1 = a1;
  22. u2 = a2;
  23. return strcmp(uidspace+u2->offset, uidspace+u1->offset);
  24. }
  25. int
  26. fchar(void)
  27. {
  28. if(uidgc.find >= uidgc.flen) {
  29. uidgc.find = 0;
  30. uidgc.flen = con_read(FID2, uidgc.uidbuf, cons.offset, MAXDAT);
  31. if(uidgc.flen <= 0)
  32. return 0;
  33. cons.offset += uidgc.flen;
  34. }
  35. return uidgc.uidbuf[uidgc.find++];
  36. }
  37. int
  38. fname(char *name)
  39. {
  40. int i, c;
  41. memset(name, 0, NAMELEN);
  42. for(i=0;; i++) {
  43. c = fchar();
  44. switch(c) {
  45. case ':':
  46. case '\n':
  47. case ',':
  48. case ' ':
  49. case '#':
  50. case 0:
  51. return c;
  52. }
  53. if(i < NAMELEN-1)
  54. name[i] = c;
  55. }
  56. }
  57. #ifdef sometime
  58. /*
  59. * file format is
  60. * uid:name:lead:member,member,...\n
  61. */
  62. void
  63. read_user(void)
  64. {
  65. int c;
  66. if((c=fname(ustr))!=':' || (c=fname(name))!=':' || (c=fname(lead))!=':')
  67. goto skipline;
  68. n = atol(ustr);
  69. if(n == 0)
  70. goto skipline;
  71. if(readu){
  72. o -= strlen(name)+1;
  73. if(o < 0) {
  74. cprint("conf.uidspace(%ld) too small\n", conf.uidspace);
  75. return -1;
  76. }
  77. strcpy(uidspace+o, name);
  78. uid[u].uid = n;
  79. uid[u].offset = o;
  80. u++;
  81. if(u >= conf.nuid) {
  82. cprint("conf.nuid(%ld) too small\n", conf.nuid);
  83. goto initu;
  84. }
  85. }else{
  86. o = strtouid1(name);
  87. if(o == 0 && strcmp(name, "") != 0)
  88. o = n;
  89. for(c=0; c<u; c++)
  90. if(uid[c].uid == n) {
  91. uid[c].lead = o;
  92. break;
  93. }
  94. while(((c=fname(name))==',' || c=='\n') && name[0]){
  95. work here
  96. if(c=='\n')
  97. break;
  98. }
  99. }
  100. skipline:
  101. while(c != '\n')
  102. fname(ustr);
  103. }
  104. #endif
  105. /*
  106. -1:adm:adm:
  107. 0:none:adm:
  108. 1:tor:tor:
  109. 10000:sys::
  110. 10001:map:map:
  111. 10002:doc::
  112. 10003:upas:upas:
  113. 10004:font::
  114. 10005:bootes:bootes:
  115. */
  116. struct {
  117. int uid;
  118. char *name;
  119. int leader;
  120. }
  121. admusers[] = {
  122. -1, "adm", -1,
  123. 0, "none", -1,
  124. 1, "tor", 1,
  125. 2, "glenda", 2,
  126. 10000, "sys", 0,
  127. 10001, "upas", 10001,
  128. 10002, "bootes", 10002,
  129. 0, 0, 0,
  130. };
  131. void
  132. cmd_user(void)
  133. {
  134. int c, n, o, u, g, i;
  135. char name[NAMELEN];
  136. if(con_clone(FID1, FID2))
  137. goto ainitu;
  138. if(con_path(FID2, "/adm/users"))
  139. goto ainitu;
  140. if(con_open(FID2, 0)){
  141. goto ainitu;
  142. }
  143. wlock(&uidgc.uidlock);
  144. uidgc.uidbuf = malloc(MAXDAT);
  145. memset(uid, 0, conf.nuid * sizeof(*uid));
  146. memset(uidspace, 0, conf.uidspace * sizeof(*uidspace));
  147. memset(gidspace, 0, conf.gidspace * sizeof(*gidspace));
  148. uidgc.flen = 0;
  149. uidgc.find = 0;
  150. cons.offset = 0;
  151. u = 0;
  152. o = conf.uidspace;
  153. ul1:
  154. c = fname(name);
  155. if(c != ':')
  156. goto uskip;
  157. n = atol(name);
  158. if(n == 0)
  159. goto uskip;
  160. c = fname(name);
  161. if(c != ':')
  162. goto uskip;
  163. o -= strlen(name)+1;
  164. if(o < 0) {
  165. cprint("conf.uidspace(%ld) too small\n", conf.uidspace);
  166. goto initu;
  167. }
  168. strcpy(uidspace+o, name);
  169. uid[u].uid = n;
  170. uid[u].offset = o;
  171. u++;
  172. if(u >= conf.nuid) {
  173. cprint("conf.nuid(%ld) too small\n", conf.nuid);
  174. goto initu;
  175. }
  176. uskip:
  177. if(c == '\n')
  178. goto ul1;
  179. if(c) {
  180. c = fname(name);
  181. goto uskip;
  182. }
  183. /* cprint("%d uids read\n", u);/**/
  184. qsort(uid, u, sizeof(uid[0]), byuid);
  185. for(c=u-1; c>0; c--)
  186. if(uid[c].uid == uid[c-1].uid) {
  187. cprint("duplicate uids: %d\n", uid[c].uid);
  188. cprint(" %s", uidspace+uid[c].offset);
  189. cprint(" %s\n", uidspace+uid[c-1].offset);
  190. }
  191. qsort(uid, u, sizeof(uid[0]), byname);
  192. for(c=u-1; c>0; c--)
  193. if(!strcmp(uidspace+uid[c].offset,
  194. uidspace+uid[c-1].offset)) {
  195. cprint("kfs: duplicate names: %s\n", uidspace+uid[c].offset);
  196. cprint(" %d", uid[c].uid);
  197. cprint(" %d\n", uid[c-1].uid);
  198. }
  199. if(cons.flags & Fuid)
  200. for(c=0; c<u; c++)
  201. cprint("%6d %s\n", uid[c].uid, uidspace+uid[c].offset);
  202. uidgc.flen = 0;
  203. uidgc.find = 0;
  204. cons.offset = 0;
  205. g = 0;
  206. gl1:
  207. c = fname(name);
  208. if(c != ':')
  209. goto gskip;
  210. n = atol(name); /* number */
  211. if(n == 0)
  212. goto gskip;
  213. c = fname(name); /* name */
  214. if(c != ':')
  215. goto gskip;
  216. c = fname(name); /* leader */
  217. if(c != ':')
  218. goto gskip;
  219. o = strtouid1(name);
  220. if(o == 0 && strcmp(name, "") != 0)
  221. o = n;
  222. for(c=0; c<u; c++)
  223. if(uid[c].uid == n) {
  224. uid[c].lead = o;
  225. break;
  226. }
  227. c = fname(name); /* list of members */
  228. if(c != ',' && c != '\n')
  229. goto gskip;
  230. if(!name[0])
  231. goto gskip;
  232. gidspace[g++] = n;
  233. gl2:
  234. n = strtouid1(name);
  235. if(n)
  236. gidspace[g++] = n;
  237. if(g >= conf.gidspace-2) {
  238. cprint("conf.gidspace(%ld) too small\n", conf.gidspace);
  239. goto initu;
  240. }
  241. if(c == '\n')
  242. goto gl3;
  243. c = fname(name);
  244. if(c == ',' || c == '\n')
  245. goto gl2;
  246. cprint("gid truncated\n");
  247. gl3:
  248. gidspace[g++] = 0;
  249. gskip:
  250. if(c == '\n')
  251. goto gl1;
  252. if(c) {
  253. c = fname(name);
  254. goto gskip;
  255. }
  256. if(cons.flags & Fuid) {
  257. o = 0;
  258. for(c=0; c<g; c++) {
  259. n = gidspace[c];
  260. if(n == 0) {
  261. o = 0;
  262. continue;
  263. }
  264. uidtostr1(name, n);
  265. if(o) {
  266. if(o > 6) {
  267. cprint("\n %s", name);
  268. o = 1;
  269. } else
  270. cprint(" %s", name);
  271. } else
  272. cprint("\n%6s", name);
  273. o++;
  274. }
  275. cprint("\n");
  276. }
  277. goto out;
  278. ainitu:
  279. wlock(&uidgc.uidlock);
  280. uidgc.uidbuf = malloc(MAXDAT);
  281. initu:
  282. cprint("initializing minimal user table\n");
  283. memset(uid, 0, conf.nuid * sizeof(*uid));
  284. memset(uidspace, 0, conf.uidspace * sizeof(*uidspace));
  285. memset(gidspace, 0, conf.gidspace * sizeof(*gidspace));
  286. o = conf.uidspace;
  287. u = 0;
  288. for(i=0; admusers[i].name; i++){
  289. o -= strlen(admusers[i].name)+1;
  290. strcpy(uidspace+o, admusers[i].name);
  291. uid[u].uid = admusers[i].uid;
  292. uid[u].lead = admusers[i].leader;
  293. uid[u].offset = o;
  294. u++;
  295. }
  296. out:
  297. free(uidgc.uidbuf);
  298. writegroup = strtouid1("write");
  299. wunlock(&uidgc.uidlock);
  300. }
  301. void
  302. uidtostr(char *name, int id)
  303. {
  304. rlock(&uidgc.uidlock);
  305. uidtostr1(name, id);
  306. runlock(&uidgc.uidlock);
  307. }
  308. void
  309. uidtostr1(char *name, int id)
  310. {
  311. Uid *u;
  312. int i;
  313. if(id == 0){
  314. strncpy(name, "none", NAMELEN);
  315. return;
  316. }
  317. for(i=0, u=uid; i<conf.nuid; i++,u++) {
  318. if(u->uid == id) {
  319. strncpy(name, uidspace+u->offset, NAMELEN);
  320. return;
  321. }
  322. }
  323. strncpy(name, "none", NAMELEN);
  324. }
  325. int
  326. strtouid(char *s)
  327. {
  328. int i;
  329. rlock(&uidgc.uidlock);
  330. i = strtouid1(s);
  331. runlock(&uidgc.uidlock);
  332. return i;
  333. }
  334. int
  335. strtouid1(char *s)
  336. {
  337. Uid *u;
  338. int i;
  339. for(i=0, u=uid; i<conf.nuid; i++,u++)
  340. if(!strcmp(s, uidspace+u->offset))
  341. return u->uid;
  342. return 0;
  343. }
  344. int
  345. ingroup(int u, int g)
  346. {
  347. short *p;
  348. if(u == g)
  349. return 1;
  350. rlock(&uidgc.uidlock);
  351. for(p=gidspace; *p;) {
  352. if(*p != g) {
  353. for(p++; *p++;)
  354. ;
  355. continue;
  356. }
  357. for(p++; *p; p++)
  358. if(*p == u) {
  359. runlock(&uidgc.uidlock);
  360. return 1;
  361. }
  362. }
  363. runlock(&uidgc.uidlock);
  364. return 0;
  365. }
  366. int
  367. leadgroup(int ui, int gi)
  368. {
  369. Uid *u;
  370. int i;
  371. rlock(&uidgc.uidlock);
  372. for(i=0, u=uid; i<conf.nuid; i++,u++) {
  373. if(u->uid == gi) {
  374. i = u->lead;
  375. runlock(&uidgc.uidlock);
  376. if(i == ui)
  377. return 1;
  378. if(i == 0)
  379. return ingroup(ui, gi);
  380. return 0;
  381. }
  382. }
  383. runlock(&uidgc.uidlock);
  384. return 0;
  385. }