Annotation of 3BSD/cmd/versatec/vpd.c, revision 1.1.1.1

1.1       root        1: #
                      2: 
                      3: /*
                      4:  * Versatec printer daemon
                      5:  */
                      6: 
                      7: #include <stdio.h>
                      8: #include <sys/types.h>
                      9: #include <dir.h>
                     10: #include <signal.h>
                     11: #include <stat.h>
                     12: #include <sgtty.h>
                     13: #include <errno.h>
                     14: 
                     15: extern int errno;
                     16: 
                     17: #define        SETSTATE        (('v'<<8)|1)
                     18: #define VRAST          "/usr/local/lib/vrast"
                     19: int    prtmode[] =     {0100, 0, 0};
                     20: 
                     21: char   line[128];
                     22: char    linep[127];
                     23: char   banbuf[64];
                     24: char   printflag;
                     25: int    linel;
                     26: FILE   *dfb;
                     27: char   dfname [27] = "/usr/vpd/";
                     28: int    waittm = 6;
                     29: struct dir dbuf;
                     30: int    onalrm ();
                     31: char   fonts[4][50] =
                     32: {
                     33:        "/usr/lib/vfont/R",
                     34:        "/usr/lib/vfont/I",
                     35:        "/usr/lib/vfont/B",
                     36:        "/usr/lib/vfont/S"
                     37: };
                     38: 
                     39: main (argc, argv)
                     40: {
                     41:        char dp, n;
                     42:        register char *p1, *p2;
                     43:        register int df;
                     44:        struct stat stb;
                     45:        int offline = 0;
                     46:        int i;
                     47: 
                     48:        signal (SIGHUP, SIG_IGN);
                     49:        signal (SIGINT, SIG_IGN);
                     50:        signal (SIGQUIT, SIG_IGN);
                     51:        signal (SIGTERM, SIG_IGN);
                     52: /*
                     53:  * Close all files, open root as 0, 1, 2
                     54:  * to assure standard environment
                     55:  */
                     56:        for (df=0; df<=15; df++)
                     57:                close (df);
                     58:        open ("/", 0);
                     59:        dup (0);
                     60:        dup (0);
                     61:        if (chdir ("/usr/vpd") < 0)
                     62:                exit (1);
                     63:        if (stat ("lock", &stb) >= 0)
                     64:                exit ();
                     65:        if ((df=creat ("lock", 0)) < 0)
                     66:                exit ();
                     67:        close (df);
                     68:        i = fork ();
                     69:        if (i < 0)
                     70:        {
                     71:                unlink ("lock");
                     72:                exit ();
                     73:        }
                     74:        if (i != 0)
                     75:                exit ();
                     76:        for (;;)
                     77:        {
                     78:                if (open ("/dev/vp0", 1) == 3)
                     79:                        break;
                     80:                if (errno != EIO)
                     81:                {
                     82:                        perror ("/dev/vp0");
                     83:                        unlink ("lock");
                     84:                        exit ();
                     85:                }
                     86:                if (offline == 0)
                     87:                {
                     88:                        int f = open ("/dev/tty", 1);
                     89:                        offline++;
                     90:                        if (f > 0)
                     91:                        {
                     92:                                write (f, "Versatec is offline\n", 20);
                     93:                                close (f);
                     94:                        }
                     95:                }
                     96:                sleep (10);
                     97:        }
                     98:        dp = open (".", 0);
                     99:        /*
                    100:         * the main loop
                    101:         */
                    102:        for (;;)
                    103:        {
                    104:                /*
                    105:                 * find the first queueable directory entry
                    106:                 */
                    107:                lseek (dp, 0, 0);
                    108:                for (;;)
                    109:                {
                    110:                        n = read (dp, &dbuf, sizeof dbuf);
                    111:                        if (n <= 0)
                    112:                        {
                    113:                                /*
                    114:                                 * if there was a job printed
                    115:                                 * pull it out of the toner bath
                    116:                                 */
                    117:                                if (printflag)
                    118:                                        feedpage ();
                    119:                                unlink ("lock");
                    120:                                exit ();
                    121:                        }
                    122:                        if
                    123:                        (
                    124:                                dbuf.d_ino
                    125:                                &&
                    126:                                dbuf.d_name[0] == 'd'
                    127:                                &&
                    128:                                dbuf.d_name[1] == 'f'
                    129:                        )
                    130:                        {
                    131:                                break;
                    132:                        }
                    133:                }
                    134:                strcpy (&dfname [9], dbuf.d_name);
                    135:                if (trysend (dfname) == 0) /* everything was ok */
                    136:                {
                    137:                        write (3, "\n\n\n", 3);
                    138:                        printflag++;
                    139:                }
                    140:        }
                    141: }
                    142: 
                    143: trysend (file)
                    144: char *file;
                    145: {
                    146:        register int i;
                    147:        extern int badexit ();
                    148:        char plot;
                    149: 
                    150:        resfonts();
                    151:        dfb = fopen (file, "r");
                    152:        if (dfb == NULL)
                    153:                return (0);
                    154:        for (*banbuf = plot = 0; getline ();)
                    155:        {
                    156:                switch (line[0])
                    157:                {
                    158:                        case 'L':
                    159:                                strcpy (banbuf, line + 1);
                    160:                                continue;
                    161: 
                    162:                        case '1':
                    163:                        case '2':
                    164:                        case '3':
                    165:                        case '4':
                    166:                                strcpy (fonts[line[0]-'1'], line + 1);
                    167:                                continue;
                    168: 
                    169:                        case 'F':
                    170:                        case 'T':
                    171:                                if (send (line[0]))
                    172:                                {
                    173:                                        ioctl (3, SETSTATE, prtmode);
                    174:                                        write (3, "\nJOB ABORTED***\n", 16);
                    175:                                }
                    176:                                continue;
                    177: 
                    178:                        case 'P':
                    179:                                if (plot)
                    180:                                {
                    181:                                        plot = 0;
                    182:                                        if (send (line[0]))
                    183:                                        {
                    184:                                                ioctl (3, SETSTATE, prtmode);
                    185:                                                write (3, "\nJOB ABORTED***\n", 16);
                    186:                                        }
                    187:                                        else
                    188:                                                continue;
                    189:                                }
                    190:                                else
                    191:                                {
                    192:                                        strcpy (linep, line + 1);
                    193:                                        plot++;
                    194:                                        continue;
                    195:                                }
                    196: 
                    197:                        case 'U':
                    198:                                continue;
                    199: 
                    200:                        case 'M':
                    201:                                continue;
                    202:                }
                    203:        }
                    204:        /*
                    205:         * Second pass.
                    206:         * Unlink files and send mail.
                    207:         */
                    208:        fseek (dfb, 0, 0);
                    209:        while (getline ())
                    210:        {
                    211:                switch (*line)
                    212:                {
                    213:                        default:
                    214:                                continue;
                    215: 
                    216:                        case 'U':
                    217:                                unlink (line + 1);
                    218:                                continue;
                    219: 
                    220:                        case 'M':
                    221:                                sendmail ();
                    222:                                continue;
                    223:                }
                    224:        }
                    225:        fclose (dfb);
                    226:        unlink (file);
                    227:        return (0);
                    228: }
                    229: 
                    230: static char    ifonts[4][50] =
                    231: {
                    232:        "/usr/lib/vfont/R",
                    233:        "/usr/lib/vfont/I",
                    234:        "/usr/lib/vfont/B",
                    235:        "/usr/lib/vfont/S"
                    236: };
                    237: 
                    238: resfonts()
                    239: {
                    240:        int i;
                    241:        for (i = 0; i < 4; i++)
                    242:                strcpy(fonts[i], ifonts[i]);
                    243: }
                    244: sendmail ()
                    245: {
                    246:        static int p[2];
                    247:        register i;
                    248:        int stat;
                    249: 
                    250:        pipe (p);
                    251:        if (fork ()==0)
                    252:        {
                    253:                alarm (0);
                    254:                close (0);
                    255:                dup (p[0]);
                    256:                for (i=3; i<=15; i++)
                    257:                        close (i);
                    258:                execl ("/bin/mail", "mail", &line[1], 0);
                    259:                exit ();
                    260:        }
                    261:        close (1);
                    262:        dup (p[1]);
                    263:        printf ("Your versatec job is done\n");
                    264:        close (1);
                    265:        close (p[0]);
                    266:        close (p[1]);
                    267:        open ("/", 0);
                    268:        wait (&stat);
                    269: }
                    270: 
                    271: getline ()
                    272: {
                    273:        register char *lp;
                    274:        register int c;
                    275: 
                    276:        lp = line;
                    277:        linel = 0;
                    278:        while ((c = getc (dfb)) != '\n')
                    279:        {
                    280:                if (c<0)
                    281:                        return (0);
                    282:                if (c=='\t')
                    283:                {
                    284:                        do
                    285:                        {
                    286:                                *lp++ = ' ';
                    287:                                linel++;
                    288:                        } while ((linel & 07) != 0);
                    289:                        continue;
                    290:                }
                    291:                *lp++ = c;
                    292:                linel++;
                    293:        }
                    294:        *lp++ = 0;
                    295:        return (1);
                    296: }
                    297: 
                    298: int    pid;
                    299: 
                    300: send (c)
                    301: char c;
                    302: {
                    303:        int p;
                    304: 
                    305:        if (pid = fork ())
                    306:        {
                    307:                if (pid == -1)
                    308:                        return (1);
                    309:                setexit ();
                    310:                signal (SIGALRM, onalrm);
                    311:                alarm (30);
                    312:                wait (&p);
                    313:                alarm (0);
                    314:                return (p);
                    315:        }
                    316:        ioctl (3, SETSTATE, prtmode);
                    317:        if (c == 'F')
                    318:        {
                    319:                if (banbuf[0])
                    320:                {
                    321:                        execl ("/usr/lib/vpf", "vpf", "-b", banbuf, line+1, 0);
                    322:                        return (1);
                    323:                }
                    324:                execl ("/usr/lib/vpf", "vpf", line, 0);
                    325:        }
                    326:        else if (c == 'T')
                    327:        {
                    328:                int i;
                    329:                int rm;
                    330:                unlink (".railmag");
                    331:                rm = creat (".railmag", 0666);
                    332:                for (i = 0; i < 4; i++)
                    333:                {
                    334:                        if (fonts[i][0] != '/')
                    335:                                write (rm, "/usr/lib/vfont/", strlen ("/usr/lib/vfont/"));
                    336:                        write (rm, fonts[i], strlen (fonts[i]));
                    337:                        write (rm, "\n", 1);
                    338:                }
                    339:                close (rm);
                    340:                if (banbuf[0])
                    341:                {
                    342:                        execl ("/usr/lib/vcat", "vcat", "-3", "-b", banbuf, line+1, 0);
                    343:                        return (1);
                    344:                }
                    345:                execl ("/usr/lib/vcat", "vcat", "-3", line+1, 0);
                    346:        }
                    347:        else if (c == 'P')
                    348:        {
                    349:                close (1);
                    350:                dup (3);
                    351:                if (banbuf[0])
                    352:                {
                    353:                        execl (VRAST, "vrast", "-v", "-b", banbuf, line+1, linep, 0);
                    354:                        return (1);
                    355:                }
                    356:                execl (VRAST, "vrast", "-v", line+1, linep, 0);
                    357:        }
                    358: 
                    359:        return (1);
                    360: }
                    361: 
                    362: onalrm ()
                    363: {
                    364:        struct stat stb;
                    365: 
                    366:        signal (SIGALRM, onalrm);
                    367:        if (stat (dfname, &stb) < 0)
                    368:                kill (pid, SIGEMT);
                    369:        reset ();
                    370: }
                    371: 
                    372: struct sgttyb ttyb =
                    373: {
                    374:        B1200, B1200,
                    375:        0, 0,
                    376:        XTABS|ANYP|NL2|CR2
                    377: };
                    378: 
                    379: /*
                    380:  * skip 16 inches
                    381:  */
                    382: feedpage ()
                    383: {
                    384:        char i;
                    385: 
                    386:        ioctl (3, SETSTATE, prtmode);
                    387:        for (i = 0; i < 18; i++)
                    388:                write (3, "\n\n\n\n\n\n\n\n", 8);
                    389: }

unix.superglobalmegacorp.com

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