|
|
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: /****/ dolog(7, "DEBUG wins %d\n", wins) ; ! 630: /* try 3 X 1/4 */ ! 631: wins >>= 2; ! 632: ws[0] = wins; ! 633: ws[1] = wins>>8; ! 634: ws[2] = 0; ! 635: ws[3] = 0; ! 636: ws[4] = 3; ! 637: /****/ dolog(7, "DEBUG ws0-%d 1-%d 4-%d\n", ws[0], ws[1], ws[4]) ; ! 638: ioctl(f, DIOCXWIN, ws); ! 639: } ! 640: } ! 641: ! 642: char * adv(cp) ! 643: register char *cp ; ! 644: { ! 645: while (*cp != '\0' && *cp != '\n' && *cp != ' ' && *cp != '\t') cp++ ; ! 646: if (*cp == ' ' || *cp == '\t') *cp++ = '\0' ; ! 647: while (*cp == ' ' || *cp == '\t') cp++ ; ! 648: return (cp) ; ! 649: } ! 650: ! 651: char * advn(cp) ! 652: register char *cp ; ! 653: { ! 654: while (*cp != '\0' && *cp != '\n') cp++ ; ! 655: if (*cp == '\n') *cp++ = '\0' ; ! 656: while (*cp == ' ' || *cp == '\t' || *cp == '\n') cp++ ; ! 657: return (cp) ; ! 658: } ! 659: ! 660: ! 661: loadfiles() ! 662: { ! 663: struct stat statb ; ! 664: struct stat statb2 ; ! 665: register char *cp ; ! 666: register struct sprocctl *ctlptr ; ! 667: register struct sprocuid *uidptr ; ! 668: register i ; ! 669: ! 670: f0: ! 671: if (fprocctl == NULL || f2procctl == NULL) { ! 672: if (fprocctl == NULL) ! 673: fprocctl = fopen(CTLFILE, "r") ; ! 674: if (f2procctl == NULL) ! 675: f2procctl = fopen(CTL2FILE, "r") ; ! 676: if (fprocctl == NULL) { ! 677: fprintf(stderr, "mgrproc, can't open %s\n", CTLFILE) ; ! 678: nprocctl = 0 ; ! 679: goto f2 ; ! 680: } ! 681: if (f2procctl == NULL) { ! 682: fprintf(stderr, "mgrproc, can't open %s\n", CTL2FILE) ; ! 683: nprocctl = 0 ; ! 684: goto f2 ; ! 685: } ! 686: fstat(fileno(fprocctl), &statb) ; ! 687: fstat(fileno(f2procctl), &statb2) ; ! 688: } else { ! 689: fstat(fileno(fprocctl), &statb) ; ! 690: fstat(fileno(f2procctl), &statb2) ; ! 691: if (statb.st_ctime == tprocctl && statb2.st_ctime == t2procctl) ! 692: goto f2 ; ! 693: fclose(fprocctl) ; ! 694: fclose(f2procctl) ; ! 695: fprocctl = f2procctl = NULL ; ! 696: goto f0 ; ! 697: } ! 698: tprocctl = statb.st_ctime ; ! 699: t2procctl = statb2.st_ctime ; ! 700: i = statb.st_size + statb2.st_size ; ! 701: if (i > zprocctl) { ! 702: if (zprocctl > 0) ! 703: free(bprocctl) ; ! 704: bprocctl = (char *)malloc(i+4) ; ! 705: zprocctl = i ; ! 706: } ! 707: rewind(fprocctl) ; ! 708: rewind(f2procctl) ; ! 709: fread(bprocctl, statb2.st_size, 1, f2procctl) ; ! 710: if (statb2.st_size) ! 711: fread(&bprocctl[statb2.st_size], statb.st_size, 1, fprocctl) ; ! 712: bprocctl[i] = '\0' ; ! 713: cp = bprocctl ; ! 714: ctlptr = procctl ; ! 715: while (*cp) { ! 716: while (*cp == '#') ! 717: cp = advn(cp) ; ! 718: if (*cp == 0) ! 719: break ; ! 720: ctlptr->p_sname = cp ; ! 721: cp = adv(cp) ; ! 722: ctlptr->p_code = cp ; ! 723: cp = adv(cp) ; ! 724: ctlptr->p_ncode = cp ; ! 725: if (*cp == '*') ! 726: ctlptr->p_ncode = ctlptr->p_code ; ! 727: cp = adv(cp) ; ! 728: ctlptr->p_param = cp ; ! 729: cp = advn(cp) ; ! 730: ctlptr++ ; ! 731: } ! 732: nprocctl = ctlptr - procctl ; ! 733: dolog(7, "Reloaded %s; %d entries\n", CTLFILE, nprocctl) ; ! 734: f2: ! 735: if (fprocuid == NULL || f2procuid == NULL) { ! 736: if (fprocuid == NULL) ! 737: fprocuid = fopen(UIDFILE, "r") ; ! 738: if (f2procuid == NULL) ! 739: f2procuid = fopen(UID2FILE, "r") ; ! 740: if (fprocuid == NULL) { ! 741: fprintf(stderr, "mgrproc: can't open %s\n", UIDFILE) ; ! 742: nprocuid = 0 ; ! 743: return ; ! 744: } ! 745: if (f2procuid == NULL) { ! 746: fprintf(stderr, "mgrproc: can't open %s\n", UID2FILE) ; ! 747: nprocuid = 0 ; ! 748: return ; ! 749: } ! 750: fstat(fileno(fprocuid), &statb) ; ! 751: fstat(fileno(f2procuid), &statb2) ; ! 752: } else { ! 753: fstat(fileno(fprocuid), &statb) ; ! 754: fstat(fileno(f2procuid), &statb2) ; ! 755: if (statb.st_ctime == tprocuid && statb2.st_ctime == t2procuid) ! 756: return ; ! 757: fclose(fprocuid) ; ! 758: fclose(f2procuid) ; ! 759: fprocuid = f2procuid = NULL ; ! 760: goto f2 ; ! 761: } ! 762: tprocuid = statb.st_ctime ; ! 763: t2procuid = statb2.st_ctime ; ! 764: i = statb.st_size + statb2.st_size ; ! 765: if (i > zprocuid) { ! 766: if (zprocuid) ! 767: free(bprocuid) ; ! 768: bprocuid = (char *)malloc(i+4) ; ! 769: zprocuid = i ; ! 770: } ! 771: rewind(fprocuid) ; ! 772: rewind(f2procuid) ; ! 773: fread(bprocuid, statb2.st_size, 1, f2procuid) ; ! 774: fread(&bprocuid[statb2.st_size], statb.st_size, 1, fprocuid) ; ! 775: bprocuid[i] = '\0' ; ! 776: cp = bprocuid ; ! 777: uidptr = procuid ; ! 778: while (*cp) { ! 779: while (*cp == '#') ! 780: cp = advn(cp) ; ! 781: if (*cp == '\0') ! 782: break ; ! 783: uidptr->u_sname = cp ; ! 784: cp = adv(cp) ; ! 785: uidptr->u_code = cp ; ! 786: cp = adv(cp) ; ! 787: uidptr->u_uid = cp ; ! 788: cp = adv(cp) ; ! 789: uidptr->u_nuid = cp ; ! 790: cp = adv(cp) ; ! 791: cp = advn(cp) ; ! 792: uidptr++ ; ! 793: } ! 794: nprocuid = uidptr - procuid ; ! 795: dolog(7, "Reloaded %s; %d entries\n", UIDFILE, nprocuid) ; ! 796: } ! 797:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.