Annotation of 42BSD/old/vpr/vpd.c, revision 1.1

1.1     ! root        1: #define        CONSOLE         "/dev/console"
        !             2: #define        dprcons         if (debug) prcons
        !             3: /*
        !             4:  * vpd.c                                               updated 11/18/82
        !             5:  * Varian or Versatec printer daemon
        !             6:  */
        !             7: char vpdSCCSid[] = "@(#)vpd.c  1.4\t11/18/82";
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include <sys/param.h>
        !            11: #include <dir.h>
        !            12: #include <signal.h>
        !            13: #include <stat.h>
        !            14: #include <sgtty.h>
        !            15: #include <errno.h>
        !            16: #include <sys/vcmd.h>
        !            17: #include <wait.h>
        !            18: 
        !            19: int    debug;
        !            20: extern int errno;
        !            21: 
        !            22: #define VRAST          "/usr/local/lib/vrast"
        !            23: #define VDMP           "/usr/lib/vdmp"
        !            24: #define VPLTDMP                "/usr/lib/vpltdmp"
        !            25: 
        !            26: #ifdef VARIAN
        !            27: #define DEVICE         "/dev/va0"
        !            28: #define DFNAME         "/usr/spool/vad/"
        !            29: #define SPOOLDIR       "/usr/spool/vad"
        !            30: #define NAME           "Varian"
        !            31: #endif
        !            32: 
        !            33: #ifdef VERSATEC
        !            34: #define DEVICE         "/dev/vp0"
        !            35: #define DFNAME         "/usr/spool/vpd/"
        !            36: #define SPOOLDIR       "/usr/spool/vpd"
        !            37: #define NAME           "Versatec"
        !            38: #endif
        !            39: 
        !            40: int    prtmode[] =     {VPRINT, 0, 0};
        !            41: 
        !            42: char   line[128];
        !            43: char    linep[127];
        !            44: char   banbuf[64];
        !            45: char   banner[512];
        !            46: char   printflag;
        !            47: int    linel;
        !            48: FILE   *dfb;
        !            49: char   dfname[33] = DFNAME;
        !            50: int    waittm = 6;
        !            51: int    onalrm ();
        !            52: char   tmplock[] = "lockXXXXXX";
        !            53: char   fonts[4][50] = {
        !            54:        "/usr/lib/vfont/R",
        !            55:        "/usr/lib/vfont/I",
        !            56:        "/usr/lib/vfont/B",
        !            57:        "/usr/lib/vfont/S"
        !            58: };
        !            59: 
        !            60: main(argc, argv)
        !            61:        int argc;
        !            62:        char **argv;
        !            63: {
        !            64:        char n;
        !            65:        register char *p1, *p2;
        !            66:        register int df;
        !            67:        register struct direct *dirp;
        !            68:        DIR *dp;
        !            69:        struct stat stb;
        !            70:        int offline = 0;
        !            71:        int i, okreque = 1;
        !            72: 
        !            73:        while (argc > 1) {
        !            74:                argc--;
        !            75:                argv++;
        !            76:                if (argv[0][0] != '-')
        !            77:                        continue;
        !            78:                switch (argv[0][1]) {
        !            79:                case 'n':
        !            80:                        if (argc < 2)
        !            81:                                break;
        !            82:                        argv++;
        !            83:                        argc--;
        !            84:                        nice(atol(argv[0]));
        !            85:                        break;
        !            86:                }
        !            87:        }
        !            88:        setuid(getuid());
        !            89:        signal(SIGHUP, SIG_IGN);
        !            90:        signal(SIGINT, SIG_IGN);
        !            91:        signal(SIGQUIT, SIG_IGN);
        !            92:        signal(SIGTERM, SIG_IGN);
        !            93: begin:
        !            94: /*
        !            95:  * Close all files, open root as 0, 1, 2
        !            96:  * to assure standard environment
        !            97:  */
        !            98:        for (df = 0; df <= 15; df++)
        !            99:                close(df);
        !           100:        open("/", 0);
        !           101:        dup(0);
        !           102:        dup(0);
        !           103:        if (chdir(SPOOLDIR) < 0 || (df = creat(mktemp(tmplock), 0)) < 0) {
        !           104:                close(1);
        !           105:                prcons("%s: error accessing %s\n", NAME, SPOOLDIR);
        !           106:                exit(1);
        !           107:        }
        !           108:        if (link(tmplock, "lock") < 0) {
        !           109:                unlink(tmplock);
        !           110:                exit(0);
        !           111:        }
        !           112:        unlink(tmplock);
        !           113:        close(df);
        !           114: floop:
        !           115:        dprcons("floop\n");
        !           116:        i = fork();
        !           117:        if (i < 0) {
        !           118:                sleep(5);
        !           119:                goto floop;
        !           120:        }
        !           121:        if (i != 0)
        !           122:                exit(0);
        !           123: reopen:
        !           124:        dprcons("reopen\n");
        !           125:        for (;;) {
        !           126:                if (open(DEVICE, 1) == 3)
        !           127:                        break;
        !           128:                if (errno != EIO) {
        !           129:                        extern char *sys_errlist[];
        !           130:                        prcons("%s: %s: %s\n", NAME, DEVICE, sys_errlist[errno]);
        !           131:                        unlink("lock");
        !           132:                        exit(1);
        !           133:                }
        !           134:                if (offline == 0) {
        !           135:                        int f = open("/dev/tty", 1);
        !           136: 
        !           137:                        offline++;
        !           138:                        if (f > 0) {
        !           139:                                write(f, NAME, strlen(NAME));
        !           140:                                write(f, " is offline\n", 12);
        !           141:                                close(f);
        !           142:                        }
        !           143:                        dprcons("offline\n");
        !           144:                }
        !           145:                sleep(10);
        !           146:        }
        !           147:        dp = opendir(".");
        !           148: search:
        !           149:        dprcons("search\n");
        !           150:        if (okreque == 1) {
        !           151:                rewinddir(dp);
        !           152:                do {
        !           153:                        dirp = readdir(dp);
        !           154:                        if (dirp == NULL) {
        !           155:                                if (printflag)
        !           156:                                        lastpage();
        !           157:                                unlink("lock");
        !           158:                                dprcons("nomore\n");
        !           159:                                if (printflag==0) {
        !           160:                                        dprcons("bye\n");
        !           161:                                        exit(0);
        !           162:                                }
        !           163:                                dprcons("one last time\n");
        !           164:                                printflag = 0;
        !           165:                                close(3);
        !           166:                                closedir(dp);
        !           167:                                sleep(30);
        !           168:                                goto begin;
        !           169:                        }
        !           170:                } while (dirp->d_name[0] != 'd' || dirp->d_name[1] != 'f');
        !           171:                strcpy(&dfname[15], dirp->d_name);
        !           172:                dprcons("found %s\n", dirp->d_name);
        !           173:        }
        !           174:        dprcons("trying %s\n", dfname);
        !           175:        printflag = 1;
        !           176:        if (okreque == 0)
        !           177:                feedpage();
        !           178:        if (trysend(dfname, okreque)) {
        !           179:                okreque = 0;
        !           180:                closedir(dp);
        !           181:                printf("reque %s\n", dfname);
        !           182:                close(3);
        !           183:                goto reopen;
        !           184:        }
        !           185:        dprcons("ok\n");
        !           186:        okreque = 1;
        !           187:        goto search;
        !           188: }
        !           189: 
        !           190: trysend(file, okreque)
        !           191: char *file;
        !           192: int okreque;
        !           193: {
        !           194:        register int i;
        !           195:        char plot;
        !           196:        union wait status;
        !           197:        int bomb = 0;
        !           198: 
        !           199:        resfonts();
        !           200:        dfb = fopen(file, "r");
        !           201:        if (dfb == NULL) {
        !           202:                unlink(file);
        !           203:                return (0);
        !           204:        }
        !           205:        banner[0] = '\0';
        !           206:        for(*banbuf= plot= 0; getline();) switch(line[0]) {
        !           207: 
        !           208:        case 'L':
        !           209:                strcpy(banbuf, line + 1);
        !           210:                continue;
        !           211: 
        !           212:        case 'B':       /* banner */
        !           213:                if(banner[0] == '\0')
        !           214:                    strcat(banner, line + 1);
        !           215:                  else {
        !           216:                    strcat(banner,"\n");
        !           217:                    strcat(banner, line+1);
        !           218:                    }
        !           219:                continue;
        !           220: 
        !           221:        case '1':
        !           222:        case '2':
        !           223:        case '3':
        !           224:        case '4':
        !           225:                strcpy(fonts[line[0]-'1'], line + 1);
        !           226:                continue;
        !           227: 
        !           228:        case 'C':       /* called by cifplot */
        !           229:        case 'V':       /* called by vplot */
        !           230:        case 'F':
        !           231:        case 'G':       /* Like f, but invoke vpf with -l flag. */
        !           232:        case 'T':
        !           233:                status.w_status = send(line[0]);
        !           234:                break;
        !           235: 
        !           236:        case 'P':
        !           237:                if (plot) {
        !           238:                        plot = 0;
        !           239:                        status.w_status = send(line[0]);
        !           240:                        break;
        !           241:                }
        !           242:                strcpy(linep, line + 1);
        !           243:                plot++;
        !           244:                continue;
        !           245: 
        !           246:        case 'U':
        !           247:                continue;
        !           248: 
        !           249:        case 'M':
        !           250:                continue;
        !           251:        }
        !           252:        /*
        !           253:         * If the process that did the work did an exit(1),
        !           254:         * we should requeue the file.
        !           255:         */
        !           256:        if (!WIFEXITED(status) || status.w_retcode > 1) {
        !           257:                ioctl(3, VSETSTATE, prtmode);
        !           258:                write(3, "\nDAEMON MALFUNCTION\n", 20);
        !           259:                feedpage();
        !           260:                bomb++;
        !           261:        } else if (status.w_retcode == 1 && okreque)
        !           262:                return (1);
        !           263:        /*
        !           264:         * All done, for better or for worse.
        !           265:         */
        !           266:        fseek(dfb, 0, 0);
        !           267:        while (getline()) switch (*line) {
        !           268: 
        !           269:        default:
        !           270:                continue;
        !           271: 
        !           272:        case 'U':
        !           273:                unlink(line + 1);
        !           274:                continue;
        !           275: 
        !           276:        case 'M':
        !           277:                sendmail(bomb);
        !           278:                continue;
        !           279:        }
        !           280: remret:
        !           281:        fclose(dfb);
        !           282:        unlink(file);
        !           283:        return (0);
        !           284: }
        !           285: 
        !           286: static char ifonts[4][50] = {
        !           287:        "/usr/lib/vfont/R",
        !           288:        "/usr/lib/vfont/I",
        !           289:        "/usr/lib/vfont/B",
        !           290:        "/usr/lib/vfont/S"
        !           291: };
        !           292: 
        !           293: resfonts()
        !           294: {
        !           295:        int i;
        !           296:        for (i = 0; i < 4; i++)
        !           297:                strcpy(fonts[i], ifonts[i]);
        !           298: }
        !           299: 
        !           300: sendmail(bomb)
        !           301:        int bomb;
        !           302: {
        !           303:        static int p[2];
        !           304:        register i;
        !           305:        int stat;
        !           306: 
        !           307:        pipe(p);
        !           308:        if (fork() == 0) {
        !           309:                alarm(0);
        !           310:                close(0);
        !           311:                dup(p[0]);
        !           312:                for (i = 3; i <= 15; i++)
        !           313:                        close(i);
        !           314:                execl("/bin/mail", "mail", &line[1], 0);
        !           315:                exit(0);
        !           316:        }
        !           317:        close(1);
        !           318:        dup(p[1]);
        !           319:        printf("Your %s job %s\n", NAME, bomb ? "screwed up" : "is done");
        !           320:        close(1);
        !           321:        close(p[0]);
        !           322:        close(p[1]);
        !           323:        open("/", 0);
        !           324:        wait(&stat);
        !           325: }
        !           326: 
        !           327: getline()
        !           328: {
        !           329:        register char *lp;
        !           330:        register int c;
        !           331: 
        !           332:        lp = line;
        !           333:        linel = 0;
        !           334:        while ((c = getc (dfb)) != '\n') {
        !           335:                if (c < 0)
        !           336:                        return (0);
        !           337:                if (c == '\t') {
        !           338:                        do {
        !           339:                                *lp++ = ' ';
        !           340:                                linel++;
        !           341:                        } while ((linel & 07) != 0);
        !           342:                        continue;
        !           343:                }
        !           344:                *lp++ = c;
        !           345:                linel++;
        !           346:        }
        !           347:        *lp++ = 0;
        !           348:        return (1);
        !           349: }
        !           350: 
        !           351: int    pid;
        !           352: 
        !           353: send (c)
        !           354: char c;
        !           355: {
        !           356:        int p, i, rm;
        !           357: 
        !           358:        if (pid = fork ()) {
        !           359:                if (pid == -1)
        !           360:                        return (1);
        !           361:                setexit();
        !           362:                signal(SIGALRM, onalrm);
        !           363:                alarm(30);
        !           364:                wait(&p);
        !           365:                alarm(0);
        !           366:                return(p);
        !           367:        }
        !           368:        ioctl (3, VSETSTATE, prtmode);
        !           369:        switch (c) {
        !           370: 
        !           371:        case 'F':
        !           372:                if (banbuf[0]) {
        !           373:                        execl ("/usr/lib/vpf", "vpf",
        !           374: #ifdef VERSATEC
        !           375:                                "-W",
        !           376: #endif
        !           377:                                "-b", banbuf, line+1, 0);
        !           378:                        break;
        !           379:                }
        !           380:                execl ("/usr/lib/vpf", "vpf",
        !           381: #ifdef VERSATEC
        !           382:                        "-W",
        !           383: #endif
        !           384:                        line, 0);
        !           385:                break;
        !           386: 
        !           387:        case 'G':       /* Like F (vpf), but passes through -l
        !           388:                           flag to vpf (print control chars). */
        !           389:                if (banbuf[0]) {
        !           390:                        execl ("/usr/lib/vpf", "vpf", "-l",
        !           391: #ifdef VERSATEC
        !           392:                                "-W",
        !           393: #endif
        !           394:                                "-b", banbuf, line+1, 0);
        !           395:                        break;
        !           396:                }
        !           397:                execl ("/usr/lib/vpf", "vpf", "-l",
        !           398: #ifdef VERSATEC
        !           399:                        "-W",
        !           400: #endif
        !           401:                        line, 0);
        !           402:                break;
        !           403: 
        !           404:        case 'T':
        !           405:                unlink(".railmag");
        !           406:                rm = creat(".railmag", 0666);
        !           407:                for (i = 0; i < 4; i++) {
        !           408:                        if (fonts[i][0] != '/')
        !           409:                                write(rm, "/usr/lib/vfont/", 15);
        !           410:                        write(rm, fonts[i], strlen (fonts[i]));
        !           411:                        write(rm, "\n", 1);
        !           412:                }
        !           413:                close(rm);
        !           414:                if (banbuf[0]) {
        !           415: #ifdef VARIAN
        !           416:                        execl("/usr/lib/rvcat", "rvcat",
        !           417: #endif
        !           418: #ifdef VERSATEC
        !           419:                        execl("/usr/lib/vcat", "rvcat",
        !           420:                                "-W",
        !           421: #endif
        !           422:                                "-3", "-b", banbuf, line+1, 0);
        !           423:                        break;
        !           424:                }
        !           425: #ifdef VARIAN
        !           426:                execl("/usr/lib/rvcat", "rvcat",
        !           427: #endif
        !           428: #ifdef VERSATEC
        !           429:                execl("/usr/lib/vcat", "rvcat",
        !           430:                        "-W",
        !           431: #endif
        !           432:                        "-3", line+1, 0);
        !           433:                break;
        !           434: 
        !           435:        case 'P':
        !           436:                close(1);
        !           437:                dup(3);
        !           438:                if (banbuf[0]) {
        !           439:                        execl(VRAST, "vrast",
        !           440: #ifdef VERSATEC
        !           441:                                "-W",
        !           442: #endif
        !           443:                                "-v", "-b", banbuf, line+1, linep, 0);
        !           444:                        break;
        !           445:                }
        !           446:                execl(VRAST, "vrast",
        !           447: #ifdef VERSATEC
        !           448:                        "-W",
        !           449: #endif
        !           450:                        "-v", line+1, linep, 0);
        !           451:                break;
        !           452:        case 'C':
        !           453:                execl(VDMP,"vdmp","-n",banbuf,"-b",banner,
        !           454: #ifdef VERSATEC
        !           455:                        "-W",
        !           456: #endif
        !           457:                        line+1,0);
        !           458:                break;
        !           459:        case 'V':
        !           460:                execl(VPLTDMP,"vpltdmp","-n",banbuf,"-b",banner,
        !           461: #ifdef VERSATEC
        !           462:                        "-W",
        !           463: #endif
        !           464:                        line+1,0);
        !           465:                break;
        !           466:        }
        !           467:        exit(2);        /* execl failed or not one of above cases. */
        !           468: }
        !           469: 
        !           470: onalrm()
        !           471: {
        !           472:        struct stat stb;
        !           473: 
        !           474:        signal(SIGALRM, onalrm);
        !           475:        if (stat(dfname, &stb) < 0)
        !           476:                kill(pid, SIGEMT);
        !           477:        reset();
        !           478: }
        !           479: 
        !           480: /*
        !           481:  * skip 16 inches or do two formfeeds.
        !           482:  */
        !           483: lastpage()
        !           484: {
        !           485:        register int i;
        !           486: 
        !           487:        ioctl(3, VSETSTATE, prtmode);
        !           488: #ifdef VARIAN
        !           489:        write(3, "\014\014", 2);
        !           490: #endif
        !           491: #ifdef VERSATEC
        !           492:        for (i = 0; i < 18; i++)
        !           493:                write(3, "\n\n\n\n\n\n\n\n", 8);
        !           494: #endif
        !           495: }
        !           496: 
        !           497: feedpage()
        !           498: {
        !           499: 
        !           500:        ioctl(3, VSETSTATE, prtmode);
        !           501: #ifdef VARIAN
        !           502:        write(3, "\014\0", 2);
        !           503: #endif
        !           504: #ifdef VERSATEC
        !           505:        write(3, "\n\n\n", 8);
        !           506: #endif
        !           507: }
        !           508: 
        !           509: prcons(cp, a1, a2, a3, a4, a5)
        !           510:        char *cp;
        !           511: {
        !           512:        char buf[BUFSIZ];
        !           513:        int f = open(CONSOLE, 1);
        !           514: 
        !           515:        sprintf(buf, cp, a1, a2, a3, a4, a5);
        !           516:        write(f, buf, strlen(buf));
        !           517:        close(f);
        !           518: }

unix.superglobalmegacorp.com

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