|
|
1.1 root 1: /*
2: * processor manager for UNIX systems
3: */
4:
5: #include <dk.h>
6: #include <dkmgr.h>
7: #include <pwd.h>
8: #include <stdio.h>
9: #include <signal.h>
10: #include <sys/ioctl.h>
11: #include <utmp.h>
12: #include <errno.h>
13: #include <sys/types.h>
14: #include <sys/stat.h>
15: #include <sys/param.h>
16: #include <wait.h>
17: #include <string.h>
18: #include <dkwindow.h>
19:
20: #define CTLFILE "/etc/procctl"
21: #define CTL2FILE "/etc/procctl.local"
22: #define UIDFILE "/etc/procuid"
23: #define UID2FILE "/etc/procuid.local"
24: #define LOGLVL 1
25:
26: #define SYSERR 010 /* system error, "something is wrong" */
27: #define BUSY 011 /* destination busy */
28: #define NOCMC 012 /* remote node not answering */
29: #define NODEST 013 /* destination not answering */
30: #define INTERT 014 /* unassigned number */
31: #define REORT 015 /* system overload */
32: #define PERMISSION 017 /* permission denied */
33:
34: /*
35: * format of procctl file entry --
36: *
37: * field 1 - source name, or * for any, of requester for this entry
38: * field 2 - service type requested, character string
39: * field 3 - converted service name for local use in this program
40: * field 4 - parameters, use depends on service type
41: *
42: */
43: struct sprocctl {
44: char * p_sname ; /* source name */
45: char * p_code ; /* service type */
46: char * p_ncode ; /* case stmt type */
47: char * p_param ; /* params for sub-case */
48: } procctl[64] ;
49:
50: /*
51: * format of procuid file entry ---
52: *
53: * field 1 - source name, or * for any, or requester for this entry
54: * field 2 - converted service name requested
55: * field 3 - uid as passed from source nachine, of * for any
56: * field 4 - uid to use locally, or * for same as source
57: */
58: struct sprocuid {
59: char * u_sname ; /* source name */
60: char * u_code ; /* service type */
61: char * u_uid ; /* source provided uid */
62: char * u_nuid ; /* local uid */
63: } procuid[256] ;
64:
65: FILE *fprocctl, *f2procctl, *fprocuid, *f2procuid ; /* file descriptor for control file */
66: long tprocctl, t2procctl, tprocuid, t2procuid ; /* last ctime of file */
67: int nprocctl, nprocuid ; /* number of entries read from file */
68: int zprocctl, zprocuid ; /* size of file at last look */
69: char *bprocctl, *bprocuid ; /* where in memory the file lives */
70:
71: /*
72: * defines for a character string "switch" statement
73: * SSWITCH(string) {
74: * SCASE("value")
75: * statements ;
76: * SCASE("value")
77: * statements ;
78: * }
79: */
80: #define SSWITCH(c) SSTR=c;if(0)
81: #define SCASE(c) }else if (strcmp(SSTR,c)==0){
82: char * SSTR ;
83:
84: char *ncode ; /* converted service code */
85: char uid[16] ; /* uid if special */
86: char dkname[32] ; /* system name from /etc/whoami */
87:
88: char *params ; /* parameters for sub-case handling */
89: char parmbuf[512] ; /* for additional parameters */
90: short parmlen ; /* length of additional stuff */
91: char env1[64];
92: extern char **environ ;
93: static char *envinit[] = {
94: env1,
95: 0
96: } ;
97:
98: char *oursrv ; /* pointer to our server name */
99: struct mgrmsg *imsg ; /* pointer to request message from remote */
100: struct passwd *pwent, *pwsearch(); /* password entry */
101: struct passwd *getnam();
102: int rootable ; /* should we allow root here? */
103: char pwline[256]; /* line from password file */
104: int proctab[512];
105: void chdies(), rmut() ;
106:
107: char *logfile = "/usr/dk/LOGPROC" ;
108: char logbuf[BUFSIZ];
109: int loglvl = LOGLVL ;
110: FILE *logf ;
111: struct sgttyb term ;
112: char FROGS[] = "\n&;^|<>(){}"; /* disallowed argument characters */
113:
114: extern int getopt(), optind;
115: extern char *optarg;
116: extern char *dkfilename();
117:
118: main(argc, argv)
119: char **argv ;
120: {
121: register short i ;
122: register short fi ;
123: short f2 ;
124: FILE * fip ;
125: extern int dkmgropen ;
126: struct mgrmsg *dkmgr() ;
127: extern int errno, dkp_ld, tty_ld, cdkp_ld, rmesg_ld ;
128: register char *cp, *filename;
129: int msg, tty, wargs;
130: int traffic = 2;
131:
132: fi = open("/etc/whoami", 0) ;
133: if (fi < 0) {
134: perror("mgrproc: open /etc/whoami: ") ;
135: exit(1) ;
136: }
137: i = read(fi, dkname, sizeof(dkname)) ;
138: if (i <= 0) {
139: printf("bad read of /etc/whoami\n") ;
140: exit(1) ;
141: }
142: dkname[i] = '\0' ;
143: if ((cp = strchr(dkname, '\n')))
144: *cp = '\0';
145: close(fi) ;
146: oursrv = dkname;
147: while ((i = getopt(argc, argv, "s:t:v:l:")) != EOF) {
148: switch(i) {
149: case 's': /* server */
150: oursrv = optarg;
151: continue;
152:
153: case 't': /* traffic class */
154: traffic = atoi(optarg);
155: continue;
156:
157: case 'v': /* verbosity of logfile comments */
158: loglvl = atoi(optarg);
159: continue;
160:
161: case 'l': /* name of logfile */
162: logfile = optarg;
163: continue;
164:
165: default:
166: exit(1);
167:
168: }
169: }
170: if (i = fork()) {
171: printf("mgrproc: starting server %s on system %s, pid %d\n",
172: oursrv, dkname, i) ;
173: exit(0) ; /* parent exits, child continues */
174: }
175: logf = fopen(logfile, "a") ;
176: if (logf == NULL)
177: printf("cannot open/create log file\n") ;
178: else
179: setbuf(logf, logbuf);
180:
181:
182: signal(SIGINT, SIG_IGN) ;
183: signal(SIGQUIT, SIG_IGN) ;
184: signal(SIGHUP, SIG_IGN) ;
185: signal(SIGTERM, SIG_IGN) ;
186: signal(SIGPIPE, SIG_IGN) ;
187: signal(SIGALRM, SIG_IGN) ;
188: signal(SIGCHLD, chdies) ;
189: pwsearch("root", -1, pwline); /* prime passwd file lookup */
190: loadfiles() ;
191: for (;;) {
192: imsg = dkmgr(oursrv, traffic) ;
193: if (imsg == NULL) {
194: if (errno == EINTR) {
195: # define INULL (int *)NULL
196: while ((i = wait3(INULL, WNOHANG, INULL)) > 0) {
197: register j;
198: for (j=0; j<512; j++)
199: if (proctab[j]==i) {
200: rmut(j);
201: proctab[j] = 0;
202: break;
203: }
204: dolog(3, "CHILD DIES c=%d\n", j) ;
205: }
206: continue ;
207: }
208: perror("mgrproc error in dkmgr: ") ;
209: exit(1) ;
210: }
211: if (imsg->m_service == NULL)
212: imsg->m_service = "(NULL)" ; /* default service */
213: if (imsg->m_uid == NULL || imsg->m_uid[0] == 0)
214: imsg->m_uid = imsg->m_origin ;
215: if (imsg->m_source == NULL)
216: imsg->m_source = "(NULL)" ;
217: dolog(1, "REQUEST c=%d, t=%s, UID=%s, from %s traf %x\n",
218: imsg->m_chan, imsg->m_service, imsg->m_uid, imsg->m_source,
219: imsg->m_traffic&0xFFFF) ;
220: for (cp=imsg->m_service; *cp; cp++)
221: if (*cp == '.')
222: *cp = '\0' ;
223: loadfiles() ;
224: for (i=0; i<nprocctl; i++) {
225: if (strcmp(procctl[i].p_code, imsg->m_service) == 0 &&
226: cksource(procctl[i].p_sname, imsg->m_source)) {
227: ncode = procctl[i].p_ncode ;
228: params = procctl[i].p_param ;
229: goto gotit ;
230: }
231: }
232: dolog(0, "ILLEGAL REQUEST chan %d\n", imsg->m_chan) ;
233: dkmgrnak(imsg->m_chan, INTERT) ;
234: continue ;
235:
236: gotit:
237: pwent = NULL;
238: rootable = 0 ;
239: if (strcmp(imsg->m_uid, "(NULL)")) {
240: for (i=0; i<nprocuid; i++) {
241: if (cksource(procuid[i].u_sname, imsg->m_source) &&
242: cksource(procuid[i].u_code, imsg->m_service) &&
243: cksource(procuid[i].u_uid, imsg->m_uid)) {
244: if (procuid[i].u_nuid[0] != '*') {
245: dolog(1, "UID %s.%s -> %s\n", imsg->m_source, imsg->m_uid, procuid[i].u_nuid) ;
246: imsg->m_uid = procuid[i].u_nuid ;
247: rootable = 1 ;
248: }
249: goto gotuid ;
250: }
251: }
252: imsg->m_uid = "**BAD**" ;
253: gotuid:
254: pwent = pwsearch(imsg->m_uid, -1, pwline);
255: }
256: if ((i = fork()) > 0) {
257: proctab[imsg->m_chan] = i;
258: continue ;
259: } else if (i < 0) {
260: dolog(0, "ERROR can't fork");
261: dkmgrnak(imsg->m_chan, NODEST);
262: continue;
263: }
264: filename = dkfilename(imsg->m_chan);
265: if (filename == NULL) {
266: dolog(0, "Can't find file for chan %d\n", imsg->m_chan);
267: dkmgrnak(imsg->m_chan, NODEST);
268: exit(1);
269: }
270: f2 = open(filename, 2) ;
271: if (f2 < 0) {
272: dolog(0, "ERROR cannot open %s\n", filename);
273: dkmgrnak(imsg->m_chan, NODEST) ; /* error */
274: exit(1) ;
275: }
276: ioctl(f2, DIOCNXCL, 0);
277: dolog(7, "DEBUG ncode %s\n", ncode) ;
278: environ = envinit ;
279: sprintf(environ[0], "DKSOURCE=%s.%s", imsg->m_source,
280: imsg->m_uid);
281:
282: SSWITCH(ncode) {
283:
284: SCASE("login")
285: if (dkproto(f2, cdkp_ld) < 0 ||
286: ioctl(f2, FIOPUSHLD, &tty_ld) < 0) {
287: dolog(0, "FAILED PUSHLD %s\n", ncode) ;
288: dkmgrnak(imsg->m_chan, REORT) ;
289: exit(1) ;
290: }
291: dkmgrack(imsg->m_chan) ;
292: setfd(f2) ;
293: execl("/etc/login", "login", 0) ;
294: execl("/bin/login", "login", 0) ;
295: dolog(0, "FAILED EXEC login\n") ;
296: exit(1) ;
297:
298: SCASE("dcon")
299: msg = 0;
300: goto dc;
301:
302: SCASE("mesgdcon")
303: msg = 1;
304:
305: dc:
306: if (dkproto(f2, dkp_ld) < 0) {
307: dolog(0, "FAILED PUSHLD %s\n", ncode) ;
308: dkmgrnak(imsg->m_chan, REORT) ;
309: exit(1) ;
310: }
311: dkmgrack(imsg->m_chan) ;
312: setwins(f2, imsg->m_traffic);
313: pwent = getnam(imsg->m_uid, f2, pwent, 0) ;
314: if (pwent == NULL) {
315: dolog(0,"FAILED passwd %s\n",imsg->m_uid);
316: exit(1) ;
317: }
318: setfd(f2) ;
319: if (msg)
320: ioctl(0, FIOPUSHLD, &rmesg_ld);
321: else
322: ioctl(0, FIOPUSHLD, &tty_ld);
323: execl("/etc/login", "login", "-p", pwline, 0) ;
324: execl("/bin/login", "login", "-p", pwline, 0) ;
325: dolog(0, "FAILED EXEC login\n") ;
326: exit(1);
327:
328: SCASE("mesgexec")
329: msg = 1;
330: tty = 0;
331: goto ex;
332:
333: SCASE("exec")
334: msg = 0;
335: tty = 0;
336: goto ex;
337:
338: SCASE("ttyexec")
339: msg = 0;
340: tty = 1;
341: ex:
342: if (dkproto(f2, dkp_ld)<0) {
343: dolog(0, "FAILED PUSHLD %s\n", ncode) ;
344: dkmgrnak(imsg->m_chan, REORT) ;
345: exit(1) ;
346: }
347: dkmgrack(imsg->m_chan) ;
348: setwins(f2, imsg->m_traffic);
349: pwent = getnam(imsg->m_uid, f2, pwent, 0) ;
350: if (pwent == NULL)
351: exit(0) ;
352: setfd(f2) ;
353: if (rparm(0, "") < 0)
354: exit(0) ;
355: if (msg) {
356: if (ioctl(0, FIOPUSHLD, &rmesg_ld) < 0) {
357: dolog(0, "FAILED PUSHLD(rmesg)\n");
358: exit(1) ;
359: }
360: }
361: if (tty) {
362: if (ioctl(0, FIOPUSHLD, &tty_ld)<0) {
363: dolog(0, "FAILED PUSHLD(tty)\n");
364: exit(1) ;
365: }
366: }
367: execl("/etc/login", "login", "-p", pwline, parmbuf, 0);
368: execl("/bin/login", "login", "-p", pwline, parmbuf, 0);
369: dolog(0, "FAILED EXEC login\n");
370: exit(1) ;
371:
372: SCASE("cmda") /* fixed cmd, user args */
373: wargs = 1;
374: goto cm;
375:
376: SCASE("cmd") /* fixed cmd, fixed args */
377: wargs = 0;
378: goto cm;
379: cm:
380: /* first param is uid, rest go to sh */
381: dolog(7, "DEBUG cmd %s\n", params) ;
382: if (dkproto(f2, dkp_ld)<0) {
383: dolog(0, "FAILED PUSHLD %s\n", ncode) ;
384: dkmgrnak(imsg->m_chan, REORT) ;
385: exit(1) ;
386: }
387: cp = params ;
388: while (*cp != ' ' && *cp != '\t' && *cp != '\0')
389: cp++ ;
390: *cp++ = '\0' ;
391: while (*cp == ' ' || *cp == '\t')
392: cp++ ;
393: if (params[0] == '*') {
394: params = imsg->m_uid ;
395: if (pwent == NULL || (pwent->pw_uid==0 && rootable==0)) {
396: dkmgrnak(imsg->m_chan, PERMISSION) ;
397: dolog(1, "FAILED procuid %s.%s\n", imsg->m_source, imsg->m_uid) ;
398: exit(1) ;
399: }
400: } else {
401: pwent = pwsearch(params, -1, pwline);
402: rootable = 1 ;
403: }
404: dkmgrack(imsg->m_chan) ;
405: setwins(f2, imsg->m_traffic);
406: setfd(f2) ;
407: dolog(7, "DEBUG cmd uid %s cmd %s\n", params, cp) ;
408: if (wargs) {
409: register char *cp1;
410: char tparmbuf[786];
411:
412: pwent = getnam(params, 0, pwent, rootable);
413: if (rparm(0, FROGS) < 0) {
414: dolog(0, "bad args, cmda\n");
415: exit(0);
416: }
417: /* copy cmd name from procctl, args from parmbuf */
418: cp1 = tparmbuf;
419: while (*cp != ' ' && *cp != '\t' && *cp != '\0')
420: *cp1++ = *cp++ ;
421: *cp1++ = ' ';
422: cp = parmbuf;
423: while ((*cp1++ = *cp++) != '\0')
424: ;
425: strcpy(parmbuf, tparmbuf);
426: cp = parmbuf;
427: dolog(7, "cmda <%s>\n", cp);
428: }
429: execl("/etc/login", "login", "-p", pwline, cp, 0) ;
430: execl("/bin/login", "login", "-p", pwline, cp, 0) ;
431: dolog(0, "FAILED EXEC login %s\n", cp) ;
432: exit(1) ;
433:
434: }
435: dolog(0, "ILLEGAL CODE %s\n", ncode) ;
436: dkmgrnak(imsg->m_chan, INTERT) ;
437: exit(1) ;
438: }
439: }
440:
441: /* VARARGS2 */
442: dolog(level, fmt, a1, a2, a3, a4, a5)
443: char *fmt;
444: {
445: long clock ;
446: long time() ;
447: char *ctime() ;
448:
449: if (loglvl<level || logf==NULL)
450: return;
451: clock = time(0) ;
452: fseek(logf, 0L, 2);
453: fprintf(logf, "%.15s-%d(%d) ", ctime(&clock)+4, getpid(), loglvl) ;
454: fprintf(logf, fmt, a1, a2, a3, a4, a5);
455: fflush(logf);
456: }
457:
458:
459: /*
460: * Interrupt routine for child death
461: */
462: void
463: chdies()
464: {
465: signal(SIGCHLD, chdies);
466: }
467:
468: /*
469: * delete entry from utmp file
470: */
471: void
472: rmut(i)
473: {
474: register f;
475: register char *line;
476: struct utmp wtmp;
477:
478: line = dkfilename(i);
479: if (line==0)
480: return;
481: line += sizeof("/dev/") - 1;
482: f = open("/etc/utmp", 2);
483: if(f >= 0) {
484: while(read(f, (char *)&wtmp, sizeof(wtmp)) == sizeof(wtmp)) {
485: if (strncmp(wtmp.ut_line, line, sizeof(wtmp.ut_line)))
486: continue;
487: lseek(f, -(long)sizeof(wtmp), 1);
488: strncpy(wtmp.ut_name, "", sizeof(wtmp.ut_name));
489: time(&wtmp.ut_time);
490: write(f, (char *)&wtmp, sizeof(wtmp));
491: }
492: close(f);
493: }
494: f = open("/usr/adm/wtmp", 1);
495: if (f >= 0) {
496: strncpy(wtmp.ut_line, line, sizeof(wtmp.ut_line));
497: strncpy(wtmp.ut_name, "", sizeof(wtmp.ut_name));
498: time(&wtmp.ut_time);
499: lseek(f, (long)0, 2);
500: write(f, (char *)&wtmp, sizeof(wtmp));
501: close(f);
502: }
503: }
504:
505: /*
506: * check a source name against a prototype name
507: * in the control file
508: * return 0 if no match
509: * return 1 if ok match
510: */
511: cksource(ck, src)
512: register char *ck, *src ;
513: {
514:
515: while (*ck == *src) {
516: if (*ck == 0)
517: break ;
518: ck++ ; src++ ;
519: }
520: if (*ck == *src)
521: return 1 ;
522: if (*ck == '*')
523: return 1 ;
524: return 0 ;
525: }
526:
527: struct passwd *
528: getnam(try1, f2, pw, root)
529: char * try1;
530: register struct passwd *pw ;
531: int root ;
532: {
533: register char * cp ;
534:
535: if (pw && (pw->pw_uid!=0 || root!=0)) {
536: write(f2, "OK", 2) ;
537: return pw ;
538: }
539: write(f2, "NO", 2);
540: while (1) {
541: if (rparm(f2, "") < 0) {
542: dolog(2, "HANGUP c=%d receiving uid\n", imsg->m_chan) ;
543: exit(1) ;
544: }
545: for (cp = parmbuf; *cp; cp++) {
546: if (*cp == ' ' || *cp == '.' || *cp == ',') {
547: *cp++ = '\0';
548: break ;
549: }
550: }
551: pw = pwsearch(parmbuf, -1, pwline) ;
552: if (pw && pw->pw_uid != 0 && (pw->pw_passwd==NULL
553: || strcmp(crypt(cp, pw->pw_passwd), pw->pw_passwd)==0))
554: break;
555: write(f2, "NO", 2) ;
556: }
557: dolog(4, "TRACE UID %s\n", parmbuf) ;
558: write(f2, "OK", 2) ;
559: return pw ;
560: }
561:
562: /* read command parameters, delete funny ones */
563: rparm(f, frogs)
564: register char *frogs;
565: {
566: register len ;
567: register rlen ;
568: register char *cp ;
569:
570:
571: rlen = sizeof(parmbuf) ;
572: parmlen = 0 ;
573: cp = parmbuf ;
574: while (1) {
575: len = read(f, cp, rlen) ;
576: if (len <= 0)
577: return -1 ;
578: parmlen += len ;
579: rlen -= len ;
580: cp += len - 1 ;
581: if (*cp == '\n' || *cp == '\r') {
582: *cp = '\0' ;
583: cp = parmbuf;
584: while (*cp) {
585: *cp &= 0177;
586: if (strchr(frogs, *cp))
587: *cp = 'X';
588: cp++;
589: }
590: dolog(7, "DEBUG rparam %s\n", parmbuf) ;
591: return 0 ;
592: }
593: cp++ ;
594: }
595: }
596:
597: setfd(f)
598: {
599: int i ;
600:
601: signal(SIGTERM, SIG_DFL) ;
602: signal(SIGPIPE, SIG_DFL) ;
603: signal(SIGQUIT, SIG_DFL) ;
604: signal(SIGINT, SIG_DFL) ;
605: signal(SIGALRM, SIG_DFL) ;
606: signal(SIGHUP, SIG_DFL) ;
607: signal(SIGCHLD, SIG_DFL) ;
608: ioctl(f, TIOCSPGRP, 0) ;
609: close(0) ;
610: close(1) ;
611: close(2) ;
612: close(3) ;
613: dup(f) ;
614: dup(f) ;
615: dup(f) ;
616: dup(f) ;
617: for (i=NSYSFILE; i<9; i++)
618: if (i != fileno(logf))
619: close(i) ;
620: }
621:
622: /* use large transmit window? */
623: setwins(f, traffic)
624: {
625: char ws[5];
626: long wins;
627: if (W_VALID(traffic) && W_TRAF(traffic)) {
628: wins = W_VALUE(W_ORIG(traffic));
629: /* try 3 X 1/4 */
630: wins >>= 2;
631: ws[0] = wins;
632: ws[1] = wins>>8;
633: ws[2] = 0;
634: ws[3] = 0;
635: ws[4] = 3;
636: ioctl(f, DIOCXWIN, ws);
637: }
638: }
639:
640: char * adv(cp)
641: register char *cp ;
642: {
643: while (*cp != '\0' && *cp != '\n' && *cp != ' ' && *cp != '\t') cp++ ;
644: if (*cp == ' ' || *cp == '\t') *cp++ = '\0' ;
645: while (*cp == ' ' || *cp == '\t') cp++ ;
646: return (cp) ;
647: }
648:
649: char * advn(cp)
650: register char *cp ;
651: {
652: while (*cp != '\0' && *cp != '\n') cp++ ;
653: if (*cp == '\n') *cp++ = '\0' ;
654: while (*cp == ' ' || *cp == '\t' || *cp == '\n') cp++ ;
655: return (cp) ;
656: }
657:
658:
659: loadfiles()
660: {
661: struct stat statb ;
662: struct stat statb2 ;
663: register char *cp ;
664: register struct sprocctl *ctlptr ;
665: register struct sprocuid *uidptr ;
666: register i ;
667:
668: f0:
669: if (fprocctl == NULL || f2procctl == NULL) {
670: if (fprocctl == NULL)
671: fprocctl = fopen(CTLFILE, "r") ;
672: if (f2procctl == NULL)
673: f2procctl = fopen(CTL2FILE, "r") ;
674: if (fprocctl == NULL) {
675: fprintf(stderr, "mgrproc, can't open %s\n", CTLFILE) ;
676: nprocctl = 0 ;
677: goto f2 ;
678: }
679: if (f2procctl == NULL) {
680: fprintf(stderr, "mgrproc, can't open %s\n", CTL2FILE) ;
681: nprocctl = 0 ;
682: goto f2 ;
683: }
684: fstat(fileno(fprocctl), &statb) ;
685: fstat(fileno(f2procctl), &statb2) ;
686: } else {
687: fstat(fileno(fprocctl), &statb) ;
688: fstat(fileno(f2procctl), &statb2) ;
689: if (statb.st_ctime == tprocctl && statb2.st_ctime == t2procctl)
690: goto f2 ;
691: fclose(fprocctl) ;
692: fclose(f2procctl) ;
693: fprocctl = f2procctl = NULL ;
694: goto f0 ;
695: }
696: tprocctl = statb.st_ctime ;
697: t2procctl = statb2.st_ctime ;
698: i = statb.st_size + statb2.st_size ;
699: if (i > zprocctl) {
700: if (zprocctl > 0)
701: free(bprocctl) ;
702: bprocctl = (char *)malloc(i+4) ;
703: zprocctl = i ;
704: }
705: rewind(fprocctl) ;
706: rewind(f2procctl) ;
707: fread(bprocctl, statb2.st_size, 1, f2procctl) ;
708: if (statb2.st_size)
709: fread(&bprocctl[statb2.st_size], statb.st_size, 1, fprocctl) ;
710: bprocctl[i] = '\0' ;
711: cp = bprocctl ;
712: ctlptr = procctl ;
713: while (*cp) {
714: while (*cp == '#')
715: cp = advn(cp) ;
716: if (*cp == 0)
717: break ;
718: ctlptr->p_sname = cp ;
719: cp = adv(cp) ;
720: ctlptr->p_code = cp ;
721: cp = adv(cp) ;
722: ctlptr->p_ncode = cp ;
723: if (*cp == '*')
724: ctlptr->p_ncode = ctlptr->p_code ;
725: cp = adv(cp) ;
726: ctlptr->p_param = cp ;
727: cp = advn(cp) ;
728: ctlptr++ ;
729: }
730: nprocctl = ctlptr - procctl ;
731: dolog(7, "Reloaded %s; %d entries\n", CTLFILE, nprocctl) ;
732: f2:
733: if (fprocuid == NULL || f2procuid == NULL) {
734: if (fprocuid == NULL)
735: fprocuid = fopen(UIDFILE, "r") ;
736: if (f2procuid == NULL)
737: f2procuid = fopen(UID2FILE, "r") ;
738: if (fprocuid == NULL) {
739: fprintf(stderr, "mgrproc: can't open %s\n", UIDFILE) ;
740: nprocuid = 0 ;
741: return ;
742: }
743: if (f2procuid == NULL) {
744: fprintf(stderr, "mgrproc: can't open %s\n", UID2FILE) ;
745: nprocuid = 0 ;
746: return ;
747: }
748: fstat(fileno(fprocuid), &statb) ;
749: fstat(fileno(f2procuid), &statb2) ;
750: } else {
751: fstat(fileno(fprocuid), &statb) ;
752: fstat(fileno(f2procuid), &statb2) ;
753: if (statb.st_ctime == tprocuid && statb2.st_ctime == t2procuid)
754: return ;
755: fclose(fprocuid) ;
756: fclose(f2procuid) ;
757: fprocuid = f2procuid = NULL ;
758: goto f2 ;
759: }
760: tprocuid = statb.st_ctime ;
761: t2procuid = statb2.st_ctime ;
762: i = statb.st_size + statb2.st_size ;
763: if (i > zprocuid) {
764: if (zprocuid)
765: free(bprocuid) ;
766: bprocuid = (char *)malloc(i+4) ;
767: zprocuid = i ;
768: }
769: rewind(fprocuid) ;
770: rewind(f2procuid) ;
771: fread(bprocuid, statb2.st_size, 1, f2procuid) ;
772: fread(&bprocuid[statb2.st_size], statb.st_size, 1, fprocuid) ;
773: bprocuid[i] = '\0' ;
774: cp = bprocuid ;
775: uidptr = procuid ;
776: while (*cp) {
777: while (*cp == '#')
778: cp = advn(cp) ;
779: if (*cp == '\0')
780: break ;
781: uidptr->u_sname = cp ;
782: cp = adv(cp) ;
783: uidptr->u_code = cp ;
784: cp = adv(cp) ;
785: uidptr->u_uid = cp ;
786: cp = adv(cp) ;
787: uidptr->u_nuid = cp ;
788: cp = adv(cp) ;
789: cp = advn(cp) ;
790: uidptr++ ;
791: }
792: nprocuid = uidptr - procuid ;
793: dolog(7, "Reloaded %s; %d entries\n", UIDFILE, nprocuid) ;
794: }
795:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.