Annotation of 3BSD/cmd/versatec/vpr.c, revision 1.1

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

unix.superglobalmegacorp.com

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