Annotation of 3BSD/cmd/versatec/vpr.c, revision 1.1.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.