Annotation of 42BSD/usr.lib/lpr/cmds.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)cmds.c     4.8 (Berkeley) 7/27/83";
                      3: #endif
                      4: 
                      5: /*
                      6:  * lpc -- line printer control program
                      7:  */
                      8: 
                      9: #include "lp.h"
                     10: 
                     11: /*
                     12:  * kill an existing daemon and disable printing.
                     13:  */
                     14: abort(argc, argv)
                     15:        char *argv[];
                     16: {
                     17:        register int c, status;
                     18:        register char *cp1, *cp2;
                     19:        char prbuf[100];
                     20: 
                     21:        if (argc == 1) {
                     22:                printf("Usage: abort {all | printer ...}\n");
                     23:                return;
                     24:        }
                     25:        if (argc == 2 && !strcmp(argv[1], "all")) {
                     26:                printer = prbuf;
                     27:                while (getprent(line) > 0) {
                     28:                        cp1 = prbuf;
                     29:                        cp2 = line;
                     30:                        while ((c = *cp2++) && c != '|' && c != ':')
                     31:                                *cp1++ = c;
                     32:                        *cp1 = '\0';
                     33:                        abortpr();
                     34:                }
                     35:                return;
                     36:        }
                     37:        while (--argc) {
                     38:                printer = *++argv;
                     39:                if ((status = pgetent(line, printer)) < 0) {
                     40:                        printf("cannot open printer description file\n");
                     41:                        continue;
                     42:                } else if (status == 0) {
                     43:                        printf("unknown printer %s\n", printer);
                     44:                        continue;
                     45:                }
                     46:                abortpr();
                     47:        }
                     48: }
                     49: 
                     50: abortpr()
                     51: {
                     52:        register FILE *fp;
                     53:        struct stat stbuf;
                     54:        int pid, fd;
                     55: 
                     56:        bp = pbuf;
                     57:        if ((SD = pgetstr("sd", &bp)) == NULL)
                     58:                SD = DEFSPOOL;
                     59:        if ((LO = pgetstr("lo", &bp)) == NULL)
                     60:                LO = DEFLOCK;
                     61:        (void) sprintf(line, "%s/%s", SD, LO);
                     62:        printf("%s:\n", printer);
                     63: 
                     64:        /*
                     65:         * Turn on the owner execute bit of the lock file to disable printing.
                     66:         */
                     67:        if (stat(line, &stbuf) >= 0) {
                     68:                if (chmod(line, (stbuf.st_mode & 0777) | 0100) < 0)
                     69:                        printf("\tcannot disable printing\n");
                     70:                else
                     71:                        printf("\tprinting disabled\n");
                     72:        } else if (errno == ENOENT) {
                     73:                if ((fd = open(line, O_WRONLY|O_CREAT, 0760)) < 0)
                     74:                        printf("\tcannot create lock file\n");
                     75:                else {
                     76:                        (void) close(fd);
                     77:                        printf("\tprinting disabled\n");
                     78:                        printf("\tno daemon to abort\n");
                     79:                }
                     80:                return;
                     81:        } else {
                     82:                printf("\tcannot stat lock file\n");
                     83:                return;
                     84:        }
                     85:        /*
                     86:         * Kill the current daemon to stop printing now.
                     87:         */
                     88:        if ((fp = fopen(line, "r")) == NULL) {
                     89:                printf("\tcannot open lock file\n");
                     90:                return;
                     91:        }
                     92:        if (!getline(fp) || flock(fileno(fp), LOCK_SH|LOCK_NB) == 0) {
                     93:                (void) fclose(fp);      /* unlocks as well */
                     94:                printf("\tno daemon to abort\n");
                     95:                return;
                     96:        }
                     97:        (void) fclose(fp);
                     98:        if (kill(pid = atoi(line), SIGINT) < 0)
                     99:                printf("\tWarning: daemon (pid %d) not killed\n", pid);
                    100:        else
                    101:                printf("\tdaemon (pid %d) killed\n", pid);
                    102: }
                    103: 
                    104: /*
                    105:  * Remove all spool files and temporaries from the spooling area.
                    106:  */
                    107: clean(argc, argv)
                    108:        char *argv[];
                    109: {
                    110:        register int c, status;
                    111:        register char *cp1, *cp2;
                    112:        char prbuf[100];
                    113: 
                    114:        if (argc == 1) {
                    115:                printf("Usage: clean {all | printer ...}\n");
                    116:                return;
                    117:        }
                    118:        if (argc == 2 && !strcmp(argv[1], "all")) {
                    119:                printer = prbuf;
                    120:                while (getprent(line) > 0) {
                    121:                        cp1 = prbuf;
                    122:                        cp2 = line;
                    123:                        while ((c = *cp2++) && c != '|' && c != ':')
                    124:                                *cp1++ = c;
                    125:                        *cp1 = '\0';
                    126:                        cleanpr();
                    127:                }
                    128:                return;
                    129:        }
                    130:        while (--argc) {
                    131:                printer = *++argv;
                    132:                if ((status = pgetent(line, printer)) < 0) {
                    133:                        printf("cannot open printer description file\n");
                    134:                        continue;
                    135:                } else if (status == 0) {
                    136:                        printf("unknown printer %s\n", printer);
                    137:                        continue;
                    138:                }
                    139:                cleanpr();
                    140:        }
                    141: }
                    142: 
                    143: cleanpr()
                    144: {
                    145:        register int c;
                    146:        register DIR *dirp;
                    147:        register struct direct *dp;
                    148:        char *cp, *cp1;
                    149: 
                    150:        bp = pbuf;
                    151:        if ((SD = pgetstr("sd", &bp)) == NULL)
                    152:                SD = DEFSPOOL;
                    153:        for (cp = line, cp1 = SD; *cp++ = *cp1++; );
                    154:        cp[-1] = '/';
                    155:        printf("%s:\n", printer);
                    156: 
                    157:        if ((dirp = opendir(SD)) == NULL) {
                    158:                printf("\tcannot examine spool directory\n");
                    159:                return;
                    160:        }
                    161:        while ((dp = readdir(dirp)) != NULL) {
                    162:                c = dp->d_name[0];
                    163:                if ((c == 'c' || c == 't' || c == 'd') && dp->d_name[1]=='f') {
                    164:                        strcpy(cp, dp->d_name);
                    165:                        if (unlink(line) < 0)
                    166:                                printf("\tcannot remove %s\n", line);
                    167:                        else
                    168:                                printf("\tremoved %s\n", line);
                    169:                }
                    170:        }
                    171:        closedir(dirp);
                    172: }
                    173: 
                    174: /*
                    175:  * Enable queuing to the printer (allow lpr's).
                    176:  */
                    177: enable(argc, argv)
                    178:        char *argv[];
                    179: {
                    180:        register int c, status;
                    181:        register char *cp1, *cp2;
                    182:        char prbuf[100];
                    183: 
                    184:        if (argc == 1) {
                    185:                printf("Usage: enable {all | printer ...}\n");
                    186:                return;
                    187:        }
                    188:        if (argc == 2 && !strcmp(argv[1], "all")) {
                    189:                printer = prbuf;
                    190:                while (getprent(line) > 0) {
                    191:                        cp1 = prbuf;
                    192:                        cp2 = line;
                    193:                        while ((c = *cp2++) && c != '|' && c != ':')
                    194:                                *cp1++ = c;
                    195:                        *cp1 = '\0';
                    196:                        enablepr();
                    197:                }
                    198:                return;
                    199:        }
                    200:        while (--argc) {
                    201:                printer = *++argv;
                    202:                if ((status = pgetent(line, printer)) < 0) {
                    203:                        printf("cannot open printer description file\n");
                    204:                        continue;
                    205:                } else if (status == 0) {
                    206:                        printf("unknown printer %s\n", printer);
                    207:                        continue;
                    208:                }
                    209:                enablepr();
                    210:        }
                    211: }
                    212: 
                    213: enablepr()
                    214: {
                    215:        struct stat stbuf;
                    216: 
                    217:        bp = pbuf;
                    218:        if ((SD = pgetstr("sd", &bp)) == NULL)
                    219:                SD = DEFSPOOL;
                    220:        if ((LO = pgetstr("lo", &bp)) == NULL)
                    221:                LO = DEFLOCK;
                    222:        (void) sprintf(line, "%s/%s", SD, LO);
                    223:        printf("%s:\n", printer);
                    224: 
                    225:        /*
                    226:         * Turn off the group execute bit of the lock file to enable queuing.
                    227:         */
                    228:        if (stat(line, &stbuf) >= 0) {
                    229:                if (chmod(line, stbuf.st_mode & 0767) < 0)
                    230:                        printf("\tcannot enable queuing\n");
                    231:                else
                    232:                        printf("\tqueuing enabled\n");
                    233:        }
                    234: }
                    235: 
                    236: /*
                    237:  * Disable queuing.
                    238:  */
                    239: disable(argc, argv)
                    240:        char *argv[];
                    241: {
                    242:        register int c, status;
                    243:        register char *cp1, *cp2;
                    244:        char prbuf[100];
                    245: 
                    246:        if (argc == 1) {
                    247:                printf("Usage: disable {all | printer ...}\n");
                    248:                return;
                    249:        }
                    250:        if (argc == 2 && !strcmp(argv[1], "all")) {
                    251:                printer = prbuf;
                    252:                while (getprent(line) > 0) {
                    253:                        cp1 = prbuf;
                    254:                        cp2 = line;
                    255:                        while ((c = *cp2++) && c != '|' && c != ':')
                    256:                                *cp1++ = c;
                    257:                        *cp1 = '\0';
                    258:                        disablepr();
                    259:                }
                    260:                return;
                    261:        }
                    262:        while (--argc) {
                    263:                printer = *++argv;
                    264:                if ((status = pgetent(line, printer)) < 0) {
                    265:                        printf("cannot open printer description file\n");
                    266:                        continue;
                    267:                } else if (status == 0) {
                    268:                        printf("unknown printer %s\n", printer);
                    269:                        continue;
                    270:                }
                    271:                disablepr();
                    272:        }
                    273: }
                    274: 
                    275: disablepr()
                    276: {
                    277:        register int fd;
                    278:        struct stat stbuf;
                    279: 
                    280:        bp = pbuf;
                    281:        if ((SD = pgetstr("sd", &bp)) == NULL)
                    282:                SD = DEFSPOOL;
                    283:        if ((LO = pgetstr("lo", &bp)) == NULL)
                    284:                LO = DEFLOCK;
                    285:        (void) sprintf(line, "%s/%s", SD, LO);
                    286:        printf("%s:\n", printer);
                    287:        /*
                    288:         * Turn on the group execute bit of the lock file to disable queuing.
                    289:         */
                    290:        if (stat(line, &stbuf) >= 0) {
                    291:                if (chmod(line, (stbuf.st_mode & 0777) | 010) < 0)
                    292:                        printf("\tcannot disable queuing\n");
                    293:                else
                    294:                        printf("\tqueuing disabled\n");
                    295:        } else if (errno == ENOENT) {
                    296:                if ((fd = open(line, O_WRONLY|O_CREAT, 0670)) < 0)
                    297:                        printf("\tcannot create lock file\n");
                    298:                else {
                    299:                        (void) close(fd);
                    300:                        printf("\tqueuing disabled\n");
                    301:                }
                    302:                return;
                    303:        } else
                    304:                printf("\tcannot stat lock file\n");
                    305: }
                    306: 
                    307: /*
                    308:  * Exit lpc
                    309:  */
                    310: quit(argc, argv)
                    311:        char *argv[];
                    312: {
                    313:        exit(0);
                    314: }
                    315: 
                    316: /*
                    317:  * Startup the daemon.
                    318:  */
                    319: restart(argc, argv)
                    320:        char *argv[];
                    321: {
                    322:        register int c, status;
                    323:        register char *cp1, *cp2;
                    324:        char prbuf[100];
                    325: 
                    326:        if (argc == 1) {
                    327:                printf("Usage: restart {all | printer ...}\n");
                    328:                return;
                    329:        }
                    330:        gethostname(host, sizeof(host));
                    331:        if (argc == 2 && !strcmp(argv[1], "all")) {
                    332:                printer = prbuf;
                    333:                while (getprent(line) > 0) {
                    334:                        cp1 = prbuf;
                    335:                        cp2 = line;
                    336:                        while ((c = *cp2++) && c != '|' && c != ':')
                    337:                                *cp1++ = c;
                    338:                        *cp1 = '\0';
                    339:                        startpr(0);
                    340:                }
                    341:                return;
                    342:        }
                    343:        while (--argc) {
                    344:                printer = *++argv;
                    345:                if ((status = pgetent(line, printer)) < 0) {
                    346:                        printf("cannot open printer description file\n");
                    347:                        continue;
                    348:                } else if (status == 0) {
                    349:                        printf("unknown printer %s\n", printer);
                    350:                        continue;
                    351:                }
                    352:                startpr(0);
                    353:        }
                    354: }
                    355: 
                    356: /*
                    357:  * Enable printing on the specified printer and startup the daemon.
                    358:  */
                    359: start(argc, argv)
                    360:        char *argv[];
                    361: {
                    362:        register int c, status;
                    363:        register char *cp1, *cp2;
                    364:        char prbuf[100];
                    365: 
                    366:        if (argc == 1) {
                    367:                printf("Usage: start {all | printer ...}\n");
                    368:                return;
                    369:        }
                    370:        gethostname(host, sizeof(host));
                    371:        if (argc == 2 && !strcmp(argv[1], "all")) {
                    372:                printer = prbuf;
                    373:                while (getprent(line) > 0) {
                    374:                        cp1 = prbuf;
                    375:                        cp2 = line;
                    376:                        while ((c = *cp2++) && c != '|' && c != ':')
                    377:                                *cp1++ = c;
                    378:                        *cp1 = '\0';
                    379:                        startpr(1);
                    380:                }
                    381:                return;
                    382:        }
                    383:        while (--argc) {
                    384:                printer = *++argv;
                    385:                if ((status = pgetent(line, printer)) < 0) {
                    386:                        printf("cannot open printer description file\n");
                    387:                        continue;
                    388:                } else if (status == 0) {
                    389:                        printf("unknown printer %s\n", printer);
                    390:                        continue;
                    391:                }
                    392:                startpr(1);
                    393:        }
                    394: }
                    395: 
                    396: startpr(enable)
                    397: {
                    398:        struct stat stbuf;
                    399: 
                    400:        bp = pbuf;
                    401:        if ((SD = pgetstr("sd", &bp)) == NULL)
                    402:                SD = DEFSPOOL;
                    403:        if ((LO = pgetstr("lo", &bp)) == NULL)
                    404:                LO = DEFLOCK;
                    405:        (void) sprintf(line, "%s/%s", SD, LO);
                    406:        printf("%s:\n", printer);
                    407: 
                    408:        /*
                    409:         * Turn off the owner execute bit of the lock file to enable printing.
                    410:         */
                    411:        if (enable && stat(line, &stbuf) >= 0) {
                    412:                if (chmod(line, stbuf.st_mode & 0677) < 0)
                    413:                        printf("\tcannot enable printing\n");
                    414:                else
                    415:                        printf("\tprinting enabled\n");
                    416:        }
                    417:        if (!startdaemon(printer))
                    418:                printf("\tcouldn't start daemon\n");
                    419:        else
                    420:                printf("\tdaemon started\n");
                    421: }
                    422: 
                    423: /*
                    424:  * Print the status of each queue listed or all the queues.
                    425:  */
                    426: status(argc, argv)
                    427:        char *argv[];
                    428: {
                    429:        register int c, status;
                    430:        register char *cp1, *cp2;
                    431:        char prbuf[100];
                    432: 
                    433:        if (argc == 1) {
                    434:                printer = prbuf;
                    435:                while (getprent(line) > 0) {
                    436:                        cp1 = prbuf;
                    437:                        cp2 = line;
                    438:                        while ((c = *cp2++) && c != '|' && c != ':')
                    439:                                *cp1++ = c;
                    440:                        *cp1 = '\0';
                    441:                        prstat();
                    442:                }
                    443:                return;
                    444:        }
                    445:        while (--argc) {
                    446:                printer = *++argv;
                    447:                if ((status = pgetent(line, printer)) < 0) {
                    448:                        printf("cannot open printer description file\n");
                    449:                        continue;
                    450:                } else if (status == 0) {
                    451:                        printf("unknown printer %s\n", printer);
                    452:                        continue;
                    453:                }
                    454:                prstat();
                    455:        }
                    456: }
                    457: 
                    458: /*
                    459:  * Print the status of the printer queue.
                    460:  */
                    461: prstat()
                    462: {
                    463:        struct stat stbuf;
                    464:        register int fd, i;
                    465:        register struct direct *dp;
                    466:        DIR *dirp;
                    467: 
                    468:        bp = pbuf;
                    469:        if ((SD = pgetstr("sd", &bp)) == NULL)
                    470:                SD = DEFSPOOL;
                    471:        if ((LO = pgetstr("lo", &bp)) == NULL)
                    472:                LO = DEFLOCK;
                    473:        if ((ST = pgetstr("st", &bp)) == NULL)
                    474:                ST = DEFSTAT;
                    475:        printf("%s:\n", printer);
                    476:        (void) sprintf(line, "%s/%s", SD, LO);
                    477:        if (stat(line, &stbuf) >= 0) {
                    478:                printf("\tqueuing is %s\n",
                    479:                        (stbuf.st_mode & 010) ? "disabled" : "enabled");
                    480:                printf("\tprinting is %s\n",
                    481:                        (stbuf.st_mode & 0100) ? "disabled" : "enabled");
                    482:        } else {
                    483:                printf("\tqueuing is enabled\n");
                    484:                printf("\tprinting is enabled\n");
                    485:        }
                    486:        if ((dirp = opendir(SD)) == NULL) {
                    487:                printf("\tcannot examine spool directory\n");
                    488:                return;
                    489:        }
                    490:        i = 0;
                    491:        while ((dp = readdir(dirp)) != NULL) {
                    492:                if (*dp->d_name == 'c' && dp->d_name[1] == 'f')
                    493:                        i++;
                    494:        }
                    495:        closedir(dirp);
                    496:        if (i == 0)
                    497:                printf("\tno entries\n");
                    498:        else if (i == 1)
                    499:                printf("\t1 entry in spool area\n");
                    500:        else
                    501:                printf("\t%d entries in spool area\n", i);
                    502:        fd = open(line, O_RDONLY);
                    503:        if (fd < 0 || flock(fd, LOCK_SH|LOCK_NB) == 0) {
                    504:                (void) close(fd);       /* unlocks as well */
                    505:                printf("\tno daemon present\n");
                    506:                return;
                    507:        }
                    508:        (void) close(fd);
                    509:        putchar('\t');
                    510:        (void) sprintf(line, "%s/%s", SD, ST);
                    511:        fd = open(line, O_RDONLY);
                    512:        if (fd >= 0) {
                    513:                (void) flock(fd, LOCK_SH);
                    514:                while ((i = read(fd, line, sizeof(line))) > 0)
                    515:                        (void) fwrite(line, 1, i, stdout);
                    516:                (void) close(fd);       /* unlocks as well */
                    517:        }
                    518: }
                    519: 
                    520: /*
                    521:  * Stop the specified daemon after completing the current job and disable
                    522:  * printing.
                    523:  */
                    524: stop(argc, argv)
                    525:        char *argv[];
                    526: {
                    527:        register int c, status;
                    528:        register char *cp1, *cp2;
                    529:        char prbuf[100];
                    530: 
                    531:        if (argc == 1) {
                    532:                printf("Usage: stop {all | printer ...}\n");
                    533:                return;
                    534:        }
                    535:        if (argc == 2 && !strcmp(argv[1], "all")) {
                    536:                printer = prbuf;
                    537:                while (getprent(line) > 0) {
                    538:                        cp1 = prbuf;
                    539:                        cp2 = line;
                    540:                        while ((c = *cp2++) && c != '|' && c != ':')
                    541:                                *cp1++ = c;
                    542:                        *cp1 = '\0';
                    543:                        stoppr();
                    544:                }
                    545:                return;
                    546:        }
                    547:        while (--argc) {
                    548:                printer = *++argv;
                    549:                if ((status = pgetent(line, printer)) < 0) {
                    550:                        printf("cannot open printer description file\n");
                    551:                        continue;
                    552:                } else if (status == 0) {
                    553:                        printf("unknown printer %s\n", printer);
                    554:                        continue;
                    555:                }
                    556:                stoppr();
                    557:        }
                    558: }
                    559: 
                    560: stoppr()
                    561: {
                    562:        register int fd;
                    563:        struct stat stbuf;
                    564: 
                    565:        bp = pbuf;
                    566:        if ((SD = pgetstr("sd", &bp)) == NULL)
                    567:                SD = DEFSPOOL;
                    568:        if ((LO = pgetstr("lo", &bp)) == NULL)
                    569:                LO = DEFLOCK;
                    570:        (void) sprintf(line, "%s/%s", SD, LO);
                    571:        printf("%s:\n", printer);
                    572: 
                    573:        /*
                    574:         * Turn on the owner execute bit of the lock file to disable printing.
                    575:         */
                    576:        if (stat(line, &stbuf) >= 0) {
                    577:                if (chmod(line, (stbuf.st_mode & 0777) | 0100) < 0)
                    578:                        printf("\tcannot disable printing\n");
                    579:                else
                    580:                        printf("\tprinting disabled\n");
                    581:        } else if (errno == ENOENT) {
                    582:                if ((fd = open(line, O_WRONLY|O_CREAT, 0760)) < 0)
                    583:                        printf("\tcannot create lock file\n");
                    584:                else {
                    585:                        (void) close(fd);
                    586:                        printf("\tprinting disabled\n");
                    587:                }
                    588:        } else
                    589:                printf("\tcannot stat lock file\n");
                    590: }
                    591: 
                    592: /*
                    593:  * Put the specified jobs at the top of printer queue.
                    594:  */
                    595: topq(argc, argv)
                    596:        char *argv[];
                    597: {
                    598:        register int status, nitems, n;
                    599:        struct stat stbuf;
                    600:        register char *cfname;
                    601:        struct queue **queue;
                    602:        int changed = 0;
                    603: 
                    604:        if (argc == 1) {
                    605:                printf("Usage: topq printer [jobnum ...] [user ...]\n");
                    606:                return;
                    607:        }
                    608: 
                    609:        --argc;
                    610:        printer = *++argv;
                    611:        status = pgetent(line, printer);
                    612:        if (status < 0) {
                    613:                printf("cannot open printer description file\n");
                    614:                return;
                    615:        } else if (status == 0) {
                    616:                printf("%s: unknown printer\n", printer);
                    617:                return;
                    618:        }
                    619:        bp = pbuf;
                    620:        if ((SD = pgetstr("sd", &bp)) == NULL)
                    621:                SD = DEFSPOOL;
                    622:        if ((LO = pgetstr("lo", &bp)) == NULL)
                    623:                LO = DEFLOCK;
                    624:        printf("%s:\n", printer);
                    625: 
                    626:        if (chdir(SD) < 0) {
                    627:                printf("\tcannot chdir to %s\n", SD);
                    628:                return;
                    629:        }
                    630:        nitems = getq(&queue);
                    631:        while (--argc) {
                    632:                if ((n = inqueue(*++argv, queue, nitems)) < 0) {
                    633:                        printf("\tjob %s is not in the queue\n", *argv);
                    634:                        continue;
                    635:                }
                    636:                /*
                    637:                 * Reposition the job by changing the modification time of
                    638:                 * the control file.
                    639:                 */
                    640:                if (touch(queue[n]->q_name)) {
                    641:                        free(queue[n]);
                    642:                        queue[n] = NULL;
                    643:                        changed++;
                    644:                }
                    645:        }
                    646:        /*
                    647:         * Put the remaining jobs at the end of the queue.
                    648:         */
                    649:        for (n = 0; n < nitems; n++) {
                    650:                if (queue[n] == NULL)
                    651:                        continue;
                    652:                cfname = queue[n]->q_name;
                    653:                if (changed)
                    654:                        touch(cfname);
                    655:                free(cfname);
                    656:        }
                    657:        free(queue);
                    658:        printf("\tqueue order %s\n", changed ? "changed" : "unchanged");
                    659:        /*
                    660:         * Turn on the public execute bit of the lock file to
                    661:         * get lpd to rebuild the queue after the current job.
                    662:         */
                    663:        if (changed && stat(LO, &stbuf) >= 0)
                    664:                (void) chmod(LO, (stbuf.st_mode & 0777) | 01);
                    665: } 
                    666: 
                    667: /* 
                    668:  * Change the modification time of the file.
                    669:  *     Returns boolean if successful.  
                    670:  */
                    671: touch(cfname)
                    672:        char *cfname;
                    673: {
                    674:        register int fd;
                    675: 
                    676:        fd = open(cfname, O_RDWR);
                    677:        if (fd < 0) {
                    678:                printf("\tcannot open %s\n", cfname);
                    679:                return(0); 
                    680:        }
                    681:        (void) read(fd, line, 1);
                    682:        (void) lseek(fd, 0L, 0);        /* set pointer back to top of file */
                    683:        (void) write(fd, line, 1);
                    684:        (void) close(fd);
                    685:        sleep(1);                       /* so times will be different */
                    686:        return(1);
                    687: }
                    688: 
                    689: /*
                    690:  * Checks if specified job name is in the printer's queue.
                    691:  * Returns:  negative (-1) if argument name is not in the queue.
                    692:  *     0 to n:  array index of pointer to argument name.
                    693:  */
                    694: inqueue(job, queue, nitems)
                    695:        char *job;
                    696:        struct queue *queue[];
                    697:        int nitems;
                    698: {
                    699:        register struct queue *q;
                    700:        register int n, jobnum;
                    701:        register char *cp;
                    702:        FILE *fp;
                    703: 
                    704:        jobnum = -1;
                    705:        if (isdigit(*job)) {
                    706:                jobnum = 0;
                    707:                do
                    708:                        jobnum = jobnum * 10 + (*job++ - '0');
                    709:                while (isdigit(*job));
                    710:        }
                    711: 
                    712:        while (--nitems >= 0) {
                    713:                if ((q = queue[nitems]) == NULL)
                    714:                        continue;
                    715:                /* this needs to be fixed since the same number can be used
                    716:                   by different machines (i.e. jobnum & machine) */
                    717:                if (jobnum >= 0) {
                    718:                        n = 0;
                    719:                        for (cp = q->q_name+3; isdigit(*cp); )
                    720:                                n = n * 10 + (*cp++ - '0');
                    721:                        if (jobnum == n)
                    722:                                return(nitems);
                    723:                        continue;
                    724:                }
                    725:                /*
                    726:                 * Read cf file for owner's name
                    727:                 */
                    728:                if ((fp = fopen(q->q_name, "r")) == NULL)
                    729:                        continue;
                    730:                while (getline(fp) > 0) {
                    731:                        if (line[0] == 'P' && !strcmp(job, line+1)) {
                    732:                                (void) fclose(fp);
                    733:                                return(nitems);
                    734:                        }
                    735:                }
                    736:                (void) fclose(fp);
                    737:        }
                    738:        return(-1);
                    739: }

unix.superglobalmegacorp.com

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