Annotation of 43BSD/old/vpr/vpr.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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