Annotation of researchv10no/dk/cmd/mgrproc.c, revision 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.