Annotation of researchv10no/dk/cmd/omgrproc.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: 
                     18: #define CTLFILE        "/etc/procctl"
                     19: #define LOGLVL 1
                     20: 
                     21: #define        SYSERR  010             /* system error, "something is wrong" */
                     22: #define        BUSY    011             /* destination busy */
                     23: #define        NOCMC   012             /* remote node not answering */
                     24: #define        NODEST  013             /* destination not answering */
                     25: #define        INTERT  014             /* unassigned number */
                     26: #define        REORT   015             /* system overload */
                     27: 
                     28: /*
                     29:  *     format of procctl file entry --
                     30:  *
                     31:  *     field 1 - source name, or * for any, of requester for this entry
                     32:  *     field 2 - service type requested, character string
                     33:  *     field 3 - converted service name for local use in this program
                     34:  *
                     35:  /
                     36: 
                     37: /*
                     38:  * defines for a character string "switch" statement
                     39:  *             SSWITCH(string) {
                     40:  *                     SCASE("value")
                     41:  *                             statements ;
                     42:  *                     SCASE("value")
                     43:  *                             statements ;
                     44:  *             }
                     45:  */
                     46: #define SSWITCH(c)     SSTR=c;if(0)
                     47: #define        SCASE(c)        }else if (strcmp(SSTR,c)==0){
                     48: char * SSTR ;
                     49: 
                     50: char   sname[32] ;             /* system name from ctl file */
                     51: char   code[16] ;              /* service code from ctl file */
                     52: char   ncode[16] ;             /* converted service code */
                     53: char   uid[16] ;               /* uid if special */
                     54: char   remuid[16] ;            /* uid from remote system to map */
                     55: char   dkname[32] ;            /* system name from /etc/whoami */
                     56: 
                     57: char   parmbuf[512] ;          /* for additional parameters */
                     58: short  parmlen ;               /* length of additional stuff */
                     59: char   env1[64];
                     60: extern char **environ ;
                     61: static char *envinit[] = {
                     62:        env1,
                     63:        0
                     64: } ;
                     65: 
                     66: char   *oursrv ;               /* pointer to our server name */
                     67: struct mgrmsg *imsg ;          /* pointer to request message from remote */
                     68: struct passwd *pwent, *pwsearch();  /* password entry */
                     69: struct passwd *getnam();
                     70: char   pwline[256];            /* line from password file */
                     71: char   *strchr();
                     72: int    proctab[512];
                     73: void   chdies(), rmut() ;
                     74: 
                     75: char   *logfile = "/usr/dk/LOGPROC" ;
                     76: char   logbuf[BUFSIZ];
                     77: int    loglvl = LOGLVL ;
                     78: FILE   *logf ;
                     79: struct sgttyb term ;
                     80: 
                     81: extern int getopt(), optind;
                     82: extern char *optarg;
                     83: extern char *dkfilename();
                     84: 
                     85: main(argc, argv)
                     86: char **argv ;
                     87: {
                     88:        register short i ;
                     89:        register short fi ;
                     90:        short f2 ;
                     91:        FILE * fip ;
                     92:        extern int dkmgropen ;
                     93:        struct mgrmsg *dkmgr() ;
                     94:        extern int errno, dkp_ld, tty_ld, cdkp_ld, rmesg_ld ;
                     95:        register char *cp, *filename;
                     96:        int msg, tty;
                     97:        int traffic = 2;
                     98: 
                     99:        fi = open("/etc/whoami", 0) ;
                    100:        if (fi < 0) {
                    101:                perror("mgrproc: open /etc/whoami: ") ;
                    102:                exit(1) ;
                    103:        }
                    104:        i = read(fi, dkname, sizeof(dkname)) ;
                    105:        if (i <= 0) {
                    106:                printf("bad read of /etc/whoami\n") ;
                    107:                exit(1) ;
                    108:        }
                    109:        dkname[i] = '\0' ;
                    110:        if ((cp = strchr(dkname, '\n')))
                    111:                *cp = '\0';
                    112:        close(fi) ;
                    113:        oursrv = dkname;
                    114:        while ((i = getopt(argc, argv, "s:t:v:l:")) != EOF) {
                    115:                switch(i) {
                    116:                case 's':       /* server */
                    117:                        oursrv = optarg;
                    118:                        continue;
                    119: 
                    120:                case 't':       /* traffic class */
                    121:                        traffic = atoi(optarg);
                    122:                        continue;
                    123: 
                    124:                case 'v':       /* verbosity of logfile comments */
                    125:                        loglvl = atoi(optarg);
                    126:                        continue;
                    127: 
                    128:                case 'l':       /* name of logfile */
                    129:                        logfile = optarg;
                    130:                        continue;
                    131: 
                    132:                default:        
                    133:                        exit(1);
                    134: 
                    135:                }
                    136:        }
                    137:        if (i = fork()) {
                    138:                printf("mgrproc:  starting server %s on system %s, pid %d\n",
                    139:                    oursrv, dkname, i) ;
                    140:                exit(0) ;       /* parent exits, child continues */
                    141:        }
                    142:        logf = fopen(logfile, "a") ;
                    143:        if (logf == NULL)
                    144:                printf("cannot open/create log file\n") ;
                    145:        else
                    146:                setbuf(logf, logbuf);
                    147: 
                    148: 
                    149:        signal(SIGINT, SIG_IGN) ;
                    150:        signal(SIGQUIT, SIG_IGN) ;
                    151:        signal(SIGHUP, SIG_IGN) ;
                    152:        signal(SIGTERM, SIG_IGN) ;
                    153:        signal(SIGPIPE, SIG_IGN) ;
                    154:        signal(SIGALRM, SIG_IGN) ;
                    155:        signal(SIGCHLD, chdies) ;
                    156:        pwsearch("root", -1, pwline);   /* prime passwd file lookup */
                    157:        fip = fopen(CTLFILE, "r") ;
                    158:        if (fip == NULL) {
                    159:                printf("mgrproc: can't open /etc/procctl\n");
                    160:                exit(1);
                    161:        }
                    162:        for (;;) {
                    163:                imsg = dkmgr(oursrv, traffic) ;
                    164:                if (imsg == NULL) {
                    165:                        if (errno == EINTR) {
                    166: #                              define INULL (int *)NULL
                    167:                                while ((i = wait3(INULL, WNOHANG, INULL)) > 0) {
                    168:                                        register j;
                    169:                                        for (j=0; j<512; j++)
                    170:                                                if (proctab[j]==i) {
                    171:                                                        rmut(j);
                    172:                                                        proctab[j] = 0;
                    173:                                                        break;
                    174:                                                }
                    175:                                        dolog(3, "CHILD DIES c=%d\n", j) ;
                    176:                                }
                    177:                                continue ;
                    178:                        }
                    179:                        perror("mgrproc error in dkmgr: ") ;
                    180:                        exit(1) ;
                    181:                }
                    182:                if (imsg->m_service == NULL)
                    183:                        imsg->m_service = "(NULL)" ;    /* default service */
                    184:                if (imsg->m_uid == NULL)
                    185:                        imsg->m_uid = "(NULL)" ;
                    186:                if (imsg->m_source == NULL)
                    187:                        imsg->m_source = "(NULL)" ;
                    188:                dolog(1, "REQUEST c=%d, t=%s, UID=%s, from %s\n",
                    189:                  imsg->m_chan, imsg->m_service, imsg->m_uid, imsg->m_source) ;
                    190:                for (cp=imsg->m_service; *cp; cp++)
                    191:                        if (*cp == '.')
                    192:                                *cp = '\0' ;
                    193:                fseek(fip, 0L, 0);
                    194:                while (fscanf(fip, "%s %s %s %[^\n]\n",
                    195:                      sname, code, ncode, parmbuf) != EOF) {
                    196:                        if (strcmp(code, imsg->m_service) == 0 &&
                    197:                            cksource(sname, imsg->m_source) )
                    198:                                goto gotit ;
                    199:                }
                    200:                dolog(0, "ILLEGAL REQUEST  chan %d\n", imsg->m_chan) ;
                    201:                dkmgrnak(imsg->m_chan, INTERT) ;
                    202:                continue ;
                    203: 
                    204: gotit:
                    205:                if (ncode[0] == '*')
                    206:                        strcpy(ncode, code) ;
                    207:                pwent = NULL;
                    208:                if (strcmp(imsg->m_uid, "(NULL)"))
                    209:                        pwent = pwsearch(imsg->m_uid, -1, pwline);
                    210:                if ((i = fork()) > 0) {
                    211:                        proctab[imsg->m_chan] = i;
                    212:                        continue ;
                    213:                } else if (i < 0) {
                    214:                        dolog(0, "ERROR can't fork");
                    215:                        dkmgrnak(imsg->m_chan, NODEST);
                    216:                        continue;
                    217:                }
                    218:                filename = dkfilename(imsg->m_chan);
                    219:                if (filename == NULL) {
                    220:                        dolog(0, "Can't find file for chan %d\n", imsg->m_chan);
                    221:                        dkmgrnak(imsg->m_chan, NODEST);
                    222:                        exit(1);
                    223:                }
                    224:                f2 = open(filename, 2) ;
                    225:                if (f2 < 0) {
                    226:                        dolog(0, "ERROR cannot open %s\n", filename);
                    227:                        dkmgrnak(imsg->m_chan, NODEST) ;        /* error */
                    228:                        exit(1) ;
                    229:                }
                    230:                dolog(7, "DEBUG ncode %s\n", ncode) ;
                    231:                environ = envinit ;
                    232:                sprintf(environ[0], "DKSOURCE=%s.%s", imsg->m_source,
                    233:                        imsg->m_uid);
                    234:  
                    235:                SSWITCH(ncode) {
                    236: 
                    237:                SCASE("login")
                    238:                        if (dkproto(f2, cdkp_ld) < 0 ||
                    239:                          ioctl(f2, FIOPUSHLD, &tty_ld) < 0) {
                    240:                                dolog(0, "FAILED PUSHLD %s\n", ncode) ;
                    241:                                dkmgrnak(imsg->m_chan, REORT) ;
                    242:                                exit(1) ;
                    243:                        }
                    244:                        dkmgrack(imsg->m_chan) ;
                    245:                        setfd(f2) ;
                    246:                        execl("/etc/login", "login", 0) ;
                    247:                        execl("/bin/login", "login", 0) ;
                    248:                        dolog(0, "FAILED EXEC login\n") ;
                    249:                        exit(1) ;
                    250: 
                    251:                SCASE("dcon")
                    252:                        msg = 0;
                    253:                        goto dc;
                    254: 
                    255:                SCASE("mesgdcon")
                    256:                        msg = 1;
                    257: 
                    258:                dc:
                    259:                        if (dkproto(f2, dkp_ld) < 0) {
                    260:                                dolog(0, "FAILED PUSHLD %s\n", ncode) ;
                    261:                                dkmgrnak(imsg->m_chan, REORT) ;
                    262:                                exit(1) ;
                    263:                        }
                    264:                        dkmgrack(imsg->m_chan) ;
                    265:                        pwent = getnam(imsg->m_uid, f2, pwent) ;
                    266:                        if (pwent == NULL) {
                    267:                                dolog(0,"FAILED passwd %s\n",imsg->m_uid);
                    268:                                exit(1) ;
                    269:                        }
                    270:                        setfd(f2) ;
                    271:                        if (msg)
                    272:                                ioctl(0, FIOPUSHLD, &rmesg_ld);
                    273:                        else
                    274:                                ioctl(0, FIOPUSHLD, &tty_ld);
                    275:                        execl("/etc/login", "login", "-p", pwline, 0) ;
                    276:                        execl("/bin/login", "login", "-p", pwline, 0) ;
                    277:                        dolog(0, "FAILED EXEC login\n") ;
                    278:                        exit(1);
                    279: 
                    280:                SCASE("mesgexec")
                    281:                        msg = 1;
                    282:                        tty = 0;
                    283:                        goto ex;
                    284: 
                    285:                SCASE("exec")
                    286:                        msg = 0;
                    287:                        tty = 0;
                    288:                        goto ex;
                    289: 
                    290:                SCASE("ttyexec")
                    291:                        msg = 0;
                    292:                        tty = 1;
                    293:                ex:
                    294:                        if (dkproto(f2, dkp_ld)<0) {
                    295:                                dolog(0, "FAILED PUSHLD %s\n", ncode) ;
                    296:                                dkmgrnak(imsg->m_chan, REORT) ;
                    297:                                exit(1) ;
                    298:                        }
                    299:                        dkmgrack(imsg->m_chan) ;
                    300:                        pwent = getnam(imsg->m_uid, f2, pwent) ;
                    301:                        if (pwent == NULL)
                    302:                                exit(0) ;
                    303:                        setfd(f2) ;
                    304:                        if (rparm(0) < 0)
                    305:                                exit(0) ;
                    306:                        if (msg) {
                    307:                                if (ioctl(0, FIOPUSHLD, &rmesg_ld) < 0) {
                    308:                                        dolog(0, "FAILED PUSHLD(rmesg)\n");
                    309:                                        exit(1) ;
                    310:                                }
                    311:                        }
                    312:                        if (tty) {
                    313:                                if (ioctl(0, FIOPUSHLD, &tty_ld)<0) {
                    314:                                        dolog(0, "FAILED PUSHLD(tty)\n");
                    315:                                        exit(1) ;
                    316:                                }
                    317:                        }
                    318:                        execl("/etc/login", "login", "-p", pwline, parmbuf, 0);
                    319:                        execl("/bin/login", "login", "-p", pwline, parmbuf, 0);
                    320:                        dolog(0, "FAILED EXEC login\n");
                    321:                        exit(1) ;
                    322: 
                    323:                SCASE("cmd")
                    324:                        /* first param is uid, rest go to sh */
                    325:                        dolog(7, "DEBUG cmd %s\n", parmbuf) ;
                    326:                        if (dkproto(f2, dkp_ld)<0) {
                    327:                                dolog(0, "FAILED PUSHLD %s\n", ncode) ;
                    328:                                dkmgrnak(imsg->m_chan, REORT) ;
                    329:                                exit(1) ;
                    330:                        }
                    331:                        dkmgrack(imsg->m_chan) ;
                    332:                        setfd(f2) ;
                    333:                        cp = parmbuf ;
                    334:                        while (*cp != ' ' && *cp != '\t' && *cp != '\0')
                    335:                                cp++ ;
                    336:                        *cp++ = '\0' ;
                    337:                        while (*cp == ' ' || *cp == '\t')
                    338:                                cp++ ;
                    339:                        dolog(7, "DEBUG cmd uid %s cmd %s\n", parmbuf, cp) ;
                    340:                        execl("/etc/login", "login", "-f", parmbuf, cp, 0) ;
                    341:                        execl("/bin/login", "login", "-f", parmbuf, cp, 0) ;
                    342:                        dolog(0, "FAILED EXEC login %s\n", cp) ;
                    343:                        exit(1) ;
                    344: 
                    345:                }
                    346:                dolog(0, "ILLEGAL CODE %s\n", ncode) ;
                    347:                dkmgrnak(imsg->m_chan, INTERT) ;
                    348:                exit(1) ;
                    349:        }
                    350: }
                    351: 
                    352: /* VARARGS2 */
                    353: dolog(level, fmt, a1, a2, a3, a4, a5)
                    354: char *fmt;
                    355: {
                    356:        long clock ;
                    357:        long time() ;
                    358:        char *ctime() ;
                    359: 
                    360:        if (loglvl<level || logf==NULL)
                    361:                return;
                    362:        clock = time(0) ;
                    363:        fseek(logf, 0L, 2);
                    364:        fprintf(logf, "%.15s-%d(%d)  ", ctime(&clock)+4, getpid(), loglvl) ;
                    365:        fprintf(logf, fmt, a1, a2, a3, a4, a5);
                    366:        fflush(logf);
                    367: }
                    368: 
                    369: 
                    370: /*
                    371:  * Interrupt routine for child death
                    372:  */
                    373: void
                    374: chdies()
                    375: {
                    376:        signal(SIGCHLD, chdies);
                    377: }
                    378: 
                    379: /*
                    380:  * delete entry from utmp file
                    381:  */
                    382: void
                    383: rmut(i)
                    384: {
                    385:        register f;
                    386:        register char *line;
                    387:        struct utmp wtmp;
                    388: 
                    389:        line = dkfilename(i);
                    390:        if (line==0)
                    391:                return;
                    392:        line += sizeof("/dev/") - 1;
                    393:        f = open("/etc/utmp", 2);
                    394:        if(f >= 0) {
                    395:                while(read(f, (char *)&wtmp, sizeof(wtmp)) == sizeof(wtmp)) {
                    396:                        if (strncmp(wtmp.ut_line, line, sizeof(wtmp.ut_line)))
                    397:                                continue;
                    398:                        lseek(f, -(long)sizeof(wtmp), 1);
                    399:                        strncpy(wtmp.ut_name, "", sizeof(wtmp.ut_name));
                    400:                        time(&wtmp.ut_time);
                    401:                        write(f, (char *)&wtmp, sizeof(wtmp));
                    402:                }
                    403:                close(f);
                    404:        }
                    405:        f = open("/usr/adm/wtmp", 1);
                    406:        if (f >= 0) {
                    407:                strncpy(wtmp.ut_line, line, sizeof(wtmp.ut_line));
                    408:                strncpy(wtmp.ut_name, "", sizeof(wtmp.ut_name));
                    409:                time(&wtmp.ut_time);
                    410:                lseek(f, (long)0, 2);
                    411:                write(f, (char *)&wtmp, sizeof(wtmp));
                    412:                close(f);
                    413:        }
                    414: }
                    415: 
                    416: /*
                    417:  *     check a source name against a prototype name
                    418:  *     in the control file
                    419:  *             return 0 if no match
                    420:  *             return 1 if ok match
                    421:  */
                    422: cksource(ck, src)
                    423: register char *ck, *src ;
                    424: {
                    425: 
                    426:        while (*ck == *src) {
                    427:                if (*ck == 0)
                    428:                        break ;
                    429:                ck++ ; src++ ;
                    430:        }
                    431:        if (*ck == *src)
                    432:                return 1 ;
                    433:        if (*ck == '*')
                    434:                return 1 ;
                    435:        return 0 ;
                    436: }
                    437: 
                    438: struct passwd *
                    439: getnam(try1, f2, pw)
                    440: char * try1;
                    441: register struct passwd *pw ;
                    442: {
                    443:        register char * cp ;
                    444: 
                    445:        if (pw && pw->pw_uid) {
                    446:                write(f2, "OK", 2) ;
                    447:                return pw ;
                    448:        }
                    449:        write(f2, "NO", 2);
                    450:        while (1) {
                    451:                if (rparm(f2) < 0) {
                    452:                        dolog(2, "HANGUP c=%d receiving uid\n", imsg->m_chan) ;
                    453:                        exit(1) ;
                    454:                }
                    455:                for (cp = parmbuf; *cp; cp++) {
                    456:                        if (*cp == ' ' || *cp == '.' || *cp == ',') {
                    457:                                *cp++ = '\0';
                    458:                                break ;
                    459:                        }
                    460:                }
                    461:                pw = pwsearch(parmbuf, -1, pwline) ;
                    462:                if (pw && (pw->pw_passwd==NULL
                    463:                  || strcmp(crypt(cp, pw->pw_passwd), pw->pw_passwd)==0))
                    464:                        break;
                    465:                write(f2, "NO", 2) ;
                    466:        }
                    467:        dolog(4, "TRACE UID %s\n", parmbuf) ;
                    468:        write(f2, "OK", 2) ;
                    469:        return pw ;
                    470: }
                    471: 
                    472: 
                    473: rparm(f)
                    474: {
                    475: register len ;
                    476: register rlen ;
                    477: register char *cp ;
                    478: 
                    479: 
                    480:        rlen = sizeof(parmbuf) ;
                    481:        parmlen = 0 ;
                    482:        cp = parmbuf ;
                    483:        while (1) {
                    484:                len = read(f, cp, rlen) ;
                    485:                if (len <= 0)
                    486:                        return -1 ;
                    487:                parmlen += len ;
                    488:                rlen -= len ;
                    489:                cp += len - 1 ;
                    490:                if (*cp == '\n' ||
                    491:                    *cp == '\r') {
                    492:                        *cp = '\0' ;
                    493:                        dolog(7, "DEBUG rparam %s\n", parmbuf) ;
                    494:                        return 0 ;
                    495:                }
                    496:                cp++ ;
                    497:        }
                    498: }
                    499: 
                    500: setfd(f)
                    501: {
                    502: int i ;
                    503: 
                    504:        signal(SIGTERM, SIG_DFL) ;
                    505:        signal(SIGPIPE, SIG_DFL) ;
                    506:        signal(SIGQUIT, SIG_DFL) ;
                    507:        signal(SIGINT, SIG_DFL) ;
                    508:        signal(SIGALRM, SIG_DFL) ;
                    509:        signal(SIGHUP, SIG_DFL) ;
                    510:        signal(SIGCHLD, SIG_DFL) ;
                    511:        ioctl(f, TIOCSPGRP, 0) ;
                    512:        close(0) ;
                    513:        close(1) ;
                    514:        close(2) ;
                    515:        close(3) ;
                    516:        dup(f) ;
                    517:        dup(f) ;
                    518:        dup(f) ;
                    519:        dup(f) ;
                    520:        for (i=NSYSFILE; i<9; i++)
                    521:                if (i != fileno(logf))
                    522:                        close(i) ;
                    523: }

unix.superglobalmegacorp.com

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