Annotation of researchv10no/dk/cmd/mgrproc.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.