Annotation of 41BSD/cmd/vpr/vpr.c, revision 1.1

1.1     ! root        1: #include <signal.h>
        !             2: #include <pagsiz.h>
        !             3: #define        BUFSIZ  BSIZE
        !             4: 
        !             5: /*
        !             6:  *     vpr -- varian and versatec (as printers) spooler
        !             7:  */
        !             8: 
        !             9: #define VAD            "/usr/lib/vad"
        !            10: #define VPD            "/usr/lib/vpd"
        !            11: char   VAtfname[] =    "/usr/spool/vad/tfaXXXXX";
        !            12: char   VAcfname[] =    "/usr/spool/vad/cfaXXXXX";
        !            13: char   VAdfname[] =    "/usr/spool/vad/dfaXXXXX";
        !            14: char   VPtfname[] =    "/usr/spool/vpd/tfaXXXXX";
        !            15: char   VPcfname[] =    "/usr/spool/vpd/cfaXXXXX";
        !            16: char   VPdfname[] =    "/usr/spool/vpd/dfaXXXXX";
        !            17: char   *tfname;
        !            18: char   *cfname;
        !            19: /* char        *lfname; */
        !            20: char   *dfname;
        !            21: int    wide;
        !            22: int    literal;
        !            23: int    nact;
        !            24: int    tff;
        !            25: int    mailflg;
        !            26: char   person[10];
        !            27: int    inchar;
        !            28: int    maxrec  = 2000;
        !            29: char   *width = "-w106";
        !            30: int    troffit;
        !            31: int     plotit;
        !            32: char   *fonts[4];
        !            33: 
        !            34: main(argc, argv)
        !            35:        int argc;
        !            36:        char *argv[];
        !            37: {
        !            38:        register char *arg, *remote;
        !            39:        int c, f, fv, flag;
        !            40:        int out();
        !            41: 
        !            42:        if (signal(SIGINT, SIG_IGN) == SIG_DFL)
        !            43:                signal(SIGINT, out);
        !            44:        if (signal(SIGQUIT, SIG_IGN) == SIG_DFL)
        !            45:                signal(SIGQUIT, out);
        !            46:        if (signal(SIGHUP, SIG_IGN) == SIG_DFL)
        !            47:                signal(SIGHUP, out);
        !            48:        if (signal(SIGTERM, SIG_IGN) == SIG_DFL)
        !            49:                signal(SIGTERM, out);
        !            50:        remote = "$     remote  **,onl";
        !            51:        flag = 0;
        !            52:        wide = 0;
        !            53:        tfname = VAtfname;
        !            54:        cfname = VAcfname;
        !            55:        dfname = VAdfname;
        !            56:        while (argc>1 && (arg = argv[1])[0]=='-') {
        !            57:                if (arg[1] && arg[2]) {
        !            58:                        remote[12] = arg[1];
        !            59:                        remote[13] = arg[2];
        !            60:                        remote[14] = 0;
        !            61:                } else switch (arg[1]) {
        !            62: 
        !            63:                case 'W':
        !            64:                        wide++;
        !            65:                        tfname = VPtfname;
        !            66:                        cfname = VPcfname;
        !            67:                        dfname = VPdfname;
        !            68:                        break;
        !            69: 
        !            70:                case '-':
        !            71:                        remote[12] = 'r';
        !            72:                        remote[13] = '1';
        !            73:                        remote[14] = '\0';
        !            74:                        break;
        !            75: 
        !            76:                case 'c':
        !            77:                        flag = '+';
        !            78:                        break;
        !            79: 
        !            80:                case 'r':
        !            81:                        flag = '-';
        !            82:                        break;
        !            83: 
        !            84:                 case 'v':
        !            85:                         plotit = 1;
        !            86:                         width = 0;
        !            87:                         break;
        !            88: 
        !            89:                case 'm':
        !            90:                        mailflg = 1;
        !            91:                        break;
        !            92: 
        !            93:                case 't':
        !            94:                        troffit = 1;
        !            95:                        width = 0;
        !            96:                        break;
        !            97: 
        !            98:                case '4':
        !            99:                case '3':
        !           100:                case '2':
        !           101:                case '1':
        !           102:                        fonts[arg[1] - '1'] = argv[2];
        !           103:                        troffit = 1;
        !           104:                        argv++;
        !           105:                        argc--;
        !           106:                        break;
        !           107: 
        !           108:                case 'w':
        !           109:                        if (troffit)
        !           110:                                break;
        !           111:                        if (arg[2] == 0)
        !           112:                                width = 0;
        !           113:                        else
        !           114:                                width = arg;
        !           115:                        break;
        !           116: 
        !           117:                case 'l':
        !           118:                        literal++;      /* Pass control chars through. */
        !           119:                        break;
        !           120:                }
        !           121:                argc--;
        !           122:                argv++;
        !           123:        }
        !           124:        pidfn();
        !           125:        tff = nfile(tfname);
        !           126:        if (!wide)              /* varian doesn't use sidebyside. */
        !           127:                width = 0;
        !           128:        ident();
        !           129:        if(argc == 1)
        !           130:                copy(0);
        !           131:        while(--argc > 0) {
        !           132:                arg = *++argv;
        !           133: /*
        !           134:                if(flag == '+')
        !           135:                        goto cf;
        !           136:  * This may not work because the daemon runs as someone else, so don't bother
        !           137:                if(*arg == '/' && flag != '-') {
        !           138:                        card(literal ? 'G' : 'F', arg);
        !           139:                        nact++;
        !           140:                        continue;
        !           141:                }
        !           142:                if(link(arg, lfname) < 0)
        !           143:                        goto cf;
        !           144:                card(literal ? 'G' : 'F', lfname);
        !           145:                card('U', lfname);
        !           146:                lfname[inchar]++;
        !           147:                nact++;
        !           148:                goto df;
        !           149:  */
        !           150: 
        !           151:        cf:
        !           152:                f = open(arg, 0);
        !           153:                if(f < 0) {
        !           154:                        printf("Cannot open %s\n", arg);
        !           155:                        if (plotit) {
        !           156:                                --argc;
        !           157:                                arg = *++argv;
        !           158:                        }
        !           159:                        continue;
        !           160:                }
        !           161:                 if (plotit) {
        !           162:                        if (--argc > 0) {
        !           163:                                arg = *++argv;
        !           164:                                fv = open(arg, 0);
        !           165:                                if (fv < 0) {
        !           166:                                        printf("Cannot open %s\n", arg);
        !           167:                                        close(f);
        !           168:                                        continue;
        !           169:                                }
        !           170:                        }
        !           171:                        else {
        !           172:                                printf("Versaplot requires parm and vector file\n");
        !           173:                                close(f);
        !           174:                                continue;
        !           175:                        }
        !           176:                        copy(fv);
        !           177:                        close(fv);
        !           178:                }
        !           179:                copy(f);
        !           180:                close(f);
        !           181: 
        !           182:        df:
        !           183:                if(flag == '-') {
        !           184:                        f = unlink(arg);
        !           185:                        if(f < 0)
        !           186:                                printf("Cannot remove %s\n", arg);
        !           187:                }
        !           188:        }
        !           189: 
        !           190:        if(nact) {
        !           191:                tfname[inchar]--;
        !           192:                f = link(tfname, dfname);
        !           193:                if(f < 0) {
        !           194:                        printf("Cannot rename %s\n", dfname);
        !           195:                        tfname[inchar]++;
        !           196:                        out();
        !           197:                }
        !           198:                unlink(tfname);
        !           199:                if (wide)
        !           200:                        execl(VPD, "vpd", 0);
        !           201:                else
        !           202:                        execl(VAD, "vad", 0);
        !           203:                dfname[inchar]++;
        !           204:                printf("Daemon doesn't exist\n");
        !           205:                exit(0);
        !           206:        }
        !           207:        out();
        !           208: }
        !           209: 
        !           210: copy(f)
        !           211: int f;
        !           212: {
        !           213:        int ff, i, nr, nc;
        !           214:        static char buf[BUFSIZ];
        !           215:        int status;
        !           216: 
        !           217:        for (i = 0; i < 3; i++)
        !           218:                if (fonts[i])
        !           219:                        card('1' + i, fonts[i]);
        !           220:        if (troffit)
        !           221:                card('T', cfname);
        !           222:        else if (plotit)
        !           223:                card('P', cfname);
        !           224:        else
        !           225:                card(literal ? 'G' : 'F', cfname);
        !           226:        card('U', cfname);
        !           227:        ff = nfile(cfname);
        !           228:        nc = 0;
        !           229:        nr = 0;
        !           230:        if (width) {
        !           231:                int pvec[2];
        !           232:                pipe(pvec);
        !           233:                i = fork();
        !           234:                if (i < 0) {
        !           235:                        printf("No more processes\n");
        !           236:                        out();
        !           237:                }
        !           238:                if (i == 0) {
        !           239:                        if (f != 0) {
        !           240:                                close(0);
        !           241:                                dup(f);
        !           242:                        }
        !           243:                        close(1);
        !           244:                        dup(pvec[1]);
        !           245:                        close(pvec[0]);
        !           246:                        close(pvec[1]);
        !           247:                        execl("/usr/lib/sidebyside", "sidebyside", width, 0);
        !           248:                        perror("/usr/lib/sidebyside");
        !           249:                        exit(1);
        !           250:                }
        !           251:                close(pvec[1]);
        !           252:                close(f);
        !           253:                f = pvec[0];
        !           254:        }
        !           255:        while((i = read(f, buf, BUFSIZ)) > 0) {
        !           256:                write(ff, buf, i);
        !           257:                nc += i;
        !           258:                if(nc >= BUFSIZ) {
        !           259:                        nc -= BUFSIZ;
        !           260:                        nr++;
        !           261:                        if(nr > maxrec) {
        !           262:                                printf("Copy file is too large\n");
        !           263:                                break;
        !           264:                        }
        !           265:                }
        !           266:        }
        !           267:        close(ff);
        !           268:        nact++;
        !           269:        wait(&status);
        !           270: }
        !           271: 
        !           272: card(c, s)
        !           273: int c;
        !           274: char s[];
        !           275: {
        !           276:        char *p1, *p2;
        !           277:        static char buf[BUFSIZ];
        !           278:        int col;
        !           279: 
        !           280:        p1 = buf;
        !           281:        p2 = s;
        !           282:        col = 0;
        !           283:        *p1++ = c;
        !           284:        while((c = *p2++) != '\0') {
        !           285:                *p1++ = c;
        !           286:                col++;
        !           287:        }
        !           288:        *p1++ = '\n';
        !           289:        write(tff, buf, col+2);
        !           290: }
        !           291: 
        !           292: ident()
        !           293: {
        !           294:        int c, n;
        !           295:        register char *b1p, *pp, *b2p;
        !           296:        static char b1[100], b2[100];
        !           297: 
        !           298:        b1p = b1;
        !           299:        if(getpw(getuid(), b1p)) {
        !           300:                b1p = "pdp::::m0000,m000:";
        !           301:        }
        !           302:        n = 0;
        !           303:        b2p = b2;
        !           304:        while(*b2p++ = "$       ident   "[n++]);
        !           305:        b2p--;
        !           306:        n = 5;
        !           307:        while(--n) while(*b1p++ != ':');
        !           308:        while((*b2p++ = *b1p++) != ':');
        !           309:        b2p[-1] = ',';
        !           310:        b1p = b1;
        !           311:        pp = person;
        !           312:        while((c = *b1p++) != ':') {
        !           313:                *b2p++ = c;
        !           314:                *pp++ = c;
        !           315:        }
        !           316:        *b2p++ = 0;
        !           317:        *pp++ = 0;
        !           318:        card('L', person);
        !           319:        if (mailflg)
        !           320:                card('M', person);
        !           321: }
        !           322: 
        !           323: pidfn()
        !           324: {
        !           325:        register i, j, c;
        !           326:        int s;
        !           327:        int p;
        !           328: 
        !           329:        s = p = getpid();
        !           330:        p &= 077777;
        !           331:        i = 0;
        !           332:        while(tfname[i] != 'X')
        !           333:                i++;
        !           334:        i += 4;
        !           335:        for(j=0; j<5; j++) {
        !           336:                c = (p%10) + '0';
        !           337:                if(s<0 && j==4)
        !           338:                        c += 4;
        !           339:                p /= 10;
        !           340:                tfname[i] = c;
        !           341:                cfname[i] = c;
        !           342: /*
        !           343:                lfname[i] = c;
        !           344: */
        !           345:                dfname[i] = c;
        !           346:                i--;
        !           347:        }
        !           348:        inchar = i;
        !           349: }
        !           350: 
        !           351: nfile(name)
        !           352: char *name;
        !           353: {
        !           354:        register f;
        !           355: 
        !           356:        f = creat(name, 0644);
        !           357:        if(f < 0) {
        !           358:                printf("Cannot create %s\n", name);
        !           359:                out();
        !           360:        }
        !           361:        name[inchar]++;
        !           362:        return(f);
        !           363: }
        !           364: 
        !           365: out()
        !           366: {
        !           367:        register i;
        !           368: 
        !           369:        signal(SIGINT, SIG_IGN);
        !           370:        signal(SIGQUIT, SIG_IGN);
        !           371:        signal(SIGHUP, SIG_IGN);
        !           372:        signal(SIGTERM, SIG_IGN);
        !           373:        i = inchar;
        !           374:        while(tfname[i] != 'a') {
        !           375:                tfname[i]--;
        !           376:                unlink(tfname);
        !           377:        }
        !           378:        while(cfname[i] != 'a') {
        !           379:                cfname[i]--;
        !           380:                unlink(cfname);
        !           381:        }
        !           382: /*
        !           383:        while(lfname[i] != 'a') {
        !           384:                lfname[i]--;
        !           385:                unlink(lfname);
        !           386:        }
        !           387: */
        !           388:        while(dfname[i] != 'a') {
        !           389:                dfname[i]--;
        !           390:                unlink(dfname);
        !           391:        }
        !           392:        exit(0);
        !           393: }

unix.superglobalmegacorp.com

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