|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)cmds.c 5.4 (Berkeley) 6/30/88";
20: #endif /* not lint */
21:
22: /*
23: * lpc -- line printer control program -- commands:
24: */
25:
26: #include "lp.h"
27: #include <sys/time.h>
28:
29: /*
30: * kill an existing daemon and disable printing.
31: */
32: abort(argc, argv)
33: char *argv[];
34: {
35: register int c, status;
36: register char *cp1, *cp2;
37: char prbuf[100];
38:
39: if (argc == 1) {
40: printf("Usage: abort {all | printer ...}\n");
41: return;
42: }
43: if (argc == 2 && !strcmp(argv[1], "all")) {
44: printer = prbuf;
45: while (getprent(line) > 0) {
46: cp1 = prbuf;
47: cp2 = line;
48: while ((c = *cp2++) && c != '|' && c != ':')
49: *cp1++ = c;
50: *cp1 = '\0';
51: abortpr(1);
52: }
53: return;
54: }
55: while (--argc) {
56: printer = *++argv;
57: if ((status = pgetent(line, printer)) < 0) {
58: printf("cannot open printer description file\n");
59: continue;
60: } else if (status == 0) {
61: printf("unknown printer %s\n", printer);
62: continue;
63: }
64: abortpr(1);
65: }
66: }
67:
68: abortpr(dis)
69: {
70: register FILE *fp;
71: struct stat stbuf;
72: int pid, fd;
73:
74: bp = pbuf;
75: if ((SD = pgetstr("sd", &bp)) == NULL)
76: SD = DEFSPOOL;
77: if ((LO = pgetstr("lo", &bp)) == NULL)
78: LO = DEFLOCK;
79: (void) sprintf(line, "%s/%s", SD, LO);
80: printf("%s:\n", printer);
81:
82: /*
83: * Turn on the owner execute bit of the lock file to disable printing.
84: */
85: if (dis) {
86: if (stat(line, &stbuf) >= 0) {
87: if (chmod(line, (stbuf.st_mode & 0777) | 0100) < 0)
88: printf("\tcannot disable printing\n");
89: else
90: printf("\tprinting disabled\n");
91: } else if (errno == ENOENT) {
92: if ((fd = open(line, O_WRONLY|O_CREAT, 0760)) < 0)
93: printf("\tcannot create lock file\n");
94: else {
95: (void) close(fd);
96: printf("\tprinting disabled\n");
97: printf("\tno daemon to abort\n");
98: }
99: return;
100: } else {
101: printf("\tcannot stat lock file\n");
102: return;
103: }
104: }
105: /*
106: * Kill the current daemon to stop printing now.
107: */
108: if ((fp = fopen(line, "r")) == NULL) {
109: printf("\tcannot open lock file\n");
110: return;
111: }
112: if (!getline(fp) || flock(fileno(fp), LOCK_SH|LOCK_NB) == 0) {
113: (void) fclose(fp); /* unlocks as well */
114: printf("\tno daemon to abort\n");
115: return;
116: }
117: (void) fclose(fp);
118: if (kill(pid = atoi(line), SIGTERM) < 0)
119: printf("\tWarning: daemon (pid %d) not killed\n", pid);
120: else
121: printf("\tdaemon (pid %d) killed\n", pid);
122: }
123:
124: /*
125: * Remove all spool files and temporaries from the spooling area.
126: */
127: clean(argc, argv)
128: char *argv[];
129: {
130: register int c, status;
131: register char *cp1, *cp2;
132: char prbuf[100];
133:
134: if (argc == 1) {
135: printf("Usage: clean {all | printer ...}\n");
136: return;
137: }
138: if (argc == 2 && !strcmp(argv[1], "all")) {
139: printer = prbuf;
140: while (getprent(line) > 0) {
141: cp1 = prbuf;
142: cp2 = line;
143: while ((c = *cp2++) && c != '|' && c != ':')
144: *cp1++ = c;
145: *cp1 = '\0';
146: cleanpr();
147: }
148: return;
149: }
150: while (--argc) {
151: printer = *++argv;
152: if ((status = pgetent(line, printer)) < 0) {
153: printf("cannot open printer description file\n");
154: continue;
155: } else if (status == 0) {
156: printf("unknown printer %s\n", printer);
157: continue;
158: }
159: cleanpr();
160: }
161: }
162:
163: select(d)
164: struct direct *d;
165: {
166: int c = d->d_name[0];
167:
168: if ((c == 't' || c == 'c' || c == 'd') && d->d_name[1] == 'f')
169: return(1);
170: return(0);
171: }
172:
173: /*
174: * Comparison routine for scandir. Sort by job number and machine, then
175: * by `cf', `tf', or `df', then by the sequence letter A-Z, a-z.
176: */
177: sortq(d1, d2)
178: struct direct **d1, **d2;
179: {
180: int c1, c2;
181:
182: if (c1 = strcmp((*d1)->d_name + 3, (*d2)->d_name + 3))
183: return(c1);
184: c1 = (*d1)->d_name[0];
185: c2 = (*d2)->d_name[0];
186: if (c1 == c2)
187: return((*d1)->d_name[2] - (*d2)->d_name[2]);
188: if (c1 == 'c')
189: return(-1);
190: if (c1 == 'd' || c2 == 'c')
191: return(1);
192: return(-1);
193: }
194:
195: /*
196: * Remove incomplete jobs from spooling area.
197: */
198: cleanpr()
199: {
200: register int i, n;
201: register char *cp, *cp1, *lp;
202: struct direct **queue;
203: int nitems;
204:
205: bp = pbuf;
206: if ((SD = pgetstr("sd", &bp)) == NULL)
207: SD = DEFSPOOL;
208: printf("%s:\n", printer);
209:
210: for (lp = line, cp = SD; *lp++ = *cp++; )
211: ;
212: lp[-1] = '/';
213:
214: nitems = scandir(SD, &queue, select, sortq);
215: if (nitems < 0) {
216: printf("\tcannot examine spool directory\n");
217: return;
218: }
219: if (nitems == 0)
220: return;
221: i = 0;
222: do {
223: cp = queue[i]->d_name;
224: if (*cp == 'c') {
225: n = 0;
226: while (i + 1 < nitems) {
227: cp1 = queue[i + 1]->d_name;
228: if (*cp1 != 'd' || strcmp(cp + 3, cp1 + 3))
229: break;
230: i++;
231: n++;
232: }
233: if (n == 0) {
234: strcpy(lp, cp);
235: unlinkf(line);
236: }
237: } else {
238: /*
239: * Must be a df with no cf (otherwise, it would have
240: * been skipped above) or a tf file (which can always
241: * be removed).
242: */
243: strcpy(lp, cp);
244: unlinkf(line);
245: }
246: } while (++i < nitems);
247: }
248:
249: unlinkf(name)
250: char *name;
251: {
252: if (unlink(name) < 0)
253: printf("\tcannot remove %s\n", name);
254: else
255: printf("\tremoved %s\n", name);
256: }
257:
258: /*
259: * Enable queuing to the printer (allow lpr's).
260: */
261: enable(argc, argv)
262: char *argv[];
263: {
264: register int c, status;
265: register char *cp1, *cp2;
266: char prbuf[100];
267:
268: if (argc == 1) {
269: printf("Usage: enable {all | printer ...}\n");
270: return;
271: }
272: if (argc == 2 && !strcmp(argv[1], "all")) {
273: printer = prbuf;
274: while (getprent(line) > 0) {
275: cp1 = prbuf;
276: cp2 = line;
277: while ((c = *cp2++) && c != '|' && c != ':')
278: *cp1++ = c;
279: *cp1 = '\0';
280: enablepr();
281: }
282: return;
283: }
284: while (--argc) {
285: printer = *++argv;
286: if ((status = pgetent(line, printer)) < 0) {
287: printf("cannot open printer description file\n");
288: continue;
289: } else if (status == 0) {
290: printf("unknown printer %s\n", printer);
291: continue;
292: }
293: enablepr();
294: }
295: }
296:
297: enablepr()
298: {
299: struct stat stbuf;
300:
301: bp = pbuf;
302: if ((SD = pgetstr("sd", &bp)) == NULL)
303: SD = DEFSPOOL;
304: if ((LO = pgetstr("lo", &bp)) == NULL)
305: LO = DEFLOCK;
306: (void) sprintf(line, "%s/%s", SD, LO);
307: printf("%s:\n", printer);
308:
309: /*
310: * Turn off the group execute bit of the lock file to enable queuing.
311: */
312: if (stat(line, &stbuf) >= 0) {
313: if (chmod(line, stbuf.st_mode & 0767) < 0)
314: printf("\tcannot enable queuing\n");
315: else
316: printf("\tqueuing enabled\n");
317: }
318: }
319:
320: /*
321: * Disable queuing.
322: */
323: disable(argc, argv)
324: char *argv[];
325: {
326: register int c, status;
327: register char *cp1, *cp2;
328: char prbuf[100];
329:
330: if (argc == 1) {
331: printf("Usage: disable {all | printer ...}\n");
332: return;
333: }
334: if (argc == 2 && !strcmp(argv[1], "all")) {
335: printer = prbuf;
336: while (getprent(line) > 0) {
337: cp1 = prbuf;
338: cp2 = line;
339: while ((c = *cp2++) && c != '|' && c != ':')
340: *cp1++ = c;
341: *cp1 = '\0';
342: disablepr();
343: }
344: return;
345: }
346: while (--argc) {
347: printer = *++argv;
348: if ((status = pgetent(line, printer)) < 0) {
349: printf("cannot open printer description file\n");
350: continue;
351: } else if (status == 0) {
352: printf("unknown printer %s\n", printer);
353: continue;
354: }
355: disablepr();
356: }
357: }
358:
359: disablepr()
360: {
361: register int fd;
362: struct stat stbuf;
363:
364: bp = pbuf;
365: if ((SD = pgetstr("sd", &bp)) == NULL)
366: SD = DEFSPOOL;
367: if ((LO = pgetstr("lo", &bp)) == NULL)
368: LO = DEFLOCK;
369: (void) sprintf(line, "%s/%s", SD, LO);
370: printf("%s:\n", printer);
371: /*
372: * Turn on the group execute bit of the lock file to disable queuing.
373: */
374: if (stat(line, &stbuf) >= 0) {
375: if (chmod(line, (stbuf.st_mode & 0777) | 010) < 0)
376: printf("\tcannot disable queuing\n");
377: else
378: printf("\tqueuing disabled\n");
379: } else if (errno == ENOENT) {
380: if ((fd = open(line, O_WRONLY|O_CREAT, 0670)) < 0)
381: printf("\tcannot create lock file\n");
382: else {
383: (void) close(fd);
384: printf("\tqueuing disabled\n");
385: }
386: return;
387: } else
388: printf("\tcannot stat lock file\n");
389: }
390:
391: /*
392: * Disable queuing and printing and put a message into the status file
393: * (reason for being down).
394: */
395: down(argc, argv)
396: char *argv[];
397: {
398: register int c, status;
399: register char *cp1, *cp2;
400: char prbuf[100];
401:
402: if (argc == 1) {
403: printf("Usage: down {all | printer} [message ...]\n");
404: return;
405: }
406: if (!strcmp(argv[1], "all")) {
407: printer = prbuf;
408: while (getprent(line) > 0) {
409: cp1 = prbuf;
410: cp2 = line;
411: while ((c = *cp2++) && c != '|' && c != ':')
412: *cp1++ = c;
413: *cp1 = '\0';
414: putmsg(argc - 2, argv + 2);
415: }
416: return;
417: }
418: printer = argv[1];
419: if ((status = pgetent(line, printer)) < 0) {
420: printf("cannot open printer description file\n");
421: return;
422: } else if (status == 0) {
423: printf("unknown printer %s\n", printer);
424: return;
425: }
426: putmsg(argc - 2, argv + 2);
427: }
428:
429: putmsg(argc, argv)
430: char **argv;
431: {
432: register int fd;
433: register char *cp1, *cp2;
434: char buf[1024];
435: struct stat stbuf;
436:
437: bp = pbuf;
438: if ((SD = pgetstr("sd", &bp)) == NULL)
439: SD = DEFSPOOL;
440: if ((LO = pgetstr("lo", &bp)) == NULL)
441: LO = DEFLOCK;
442: if ((ST = pgetstr("st", &bp)) == NULL)
443: ST = DEFSTAT;
444: printf("%s:\n", printer);
445: /*
446: * Turn on the group execute bit of the lock file to disable queuing and
447: * turn on the owner execute bit of the lock file to disable printing.
448: */
449: (void) sprintf(line, "%s/%s", SD, LO);
450: if (stat(line, &stbuf) >= 0) {
451: if (chmod(line, (stbuf.st_mode & 0777) | 0110) < 0)
452: printf("\tcannot disable queuing\n");
453: else
454: printf("\tprinter and queuing disabled\n");
455: } else if (errno == ENOENT) {
456: if ((fd = open(line, O_WRONLY|O_CREAT, 0770)) < 0)
457: printf("\tcannot create lock file\n");
458: else {
459: (void) close(fd);
460: printf("\tprinter and queuing disabled\n");
461: }
462: return;
463: } else
464: printf("\tcannot stat lock file\n");
465: /*
466: * Write the message into the status file.
467: */
468: (void) sprintf(line, "%s/%s", SD, ST);
469: fd = open(line, O_WRONLY|O_CREAT, 0664);
470: if (fd < 0 || flock(fd, LOCK_EX) < 0) {
471: printf("\tcannot create status file\n");
472: return;
473: }
474: (void) ftruncate(fd, 0);
475: if (argc <= 0) {
476: (void) write(fd, "\n", 1);
477: (void) close(fd);
478: return;
479: }
480: cp1 = buf;
481: while (--argc >= 0) {
482: cp2 = *argv++;
483: while (*cp1++ = *cp2++)
484: ;
485: cp1[-1] = ' ';
486: }
487: cp1[-1] = '\n';
488: *cp1 = '\0';
489: (void) write(fd, buf, strlen(buf));
490: (void) close(fd);
491: }
492:
493: /*
494: * Exit lpc
495: */
496: quit(argc, argv)
497: char *argv[];
498: {
499: exit(0);
500: }
501:
502: /*
503: * Kill and restart the daemon.
504: */
505: restart(argc, argv)
506: char *argv[];
507: {
508: register int c, status;
509: register char *cp1, *cp2;
510: char prbuf[100];
511:
512: if (argc == 1) {
513: printf("Usage: restart {all | printer ...}\n");
514: return;
515: }
516: if (argc == 2 && !strcmp(argv[1], "all")) {
517: printer = prbuf;
518: while (getprent(line) > 0) {
519: cp1 = prbuf;
520: cp2 = line;
521: while ((c = *cp2++) && c != '|' && c != ':')
522: *cp1++ = c;
523: *cp1 = '\0';
524: abortpr(0);
525: startpr(0);
526: }
527: return;
528: }
529: while (--argc) {
530: printer = *++argv;
531: if ((status = pgetent(line, printer)) < 0) {
532: printf("cannot open printer description file\n");
533: continue;
534: } else if (status == 0) {
535: printf("unknown printer %s\n", printer);
536: continue;
537: }
538: abortpr(0);
539: startpr(0);
540: }
541: }
542:
543: /*
544: * Enable printing on the specified printer and startup the daemon.
545: */
546: start(argc, argv)
547: char *argv[];
548: {
549: register int c, status;
550: register char *cp1, *cp2;
551: char prbuf[100];
552:
553: if (argc == 1) {
554: printf("Usage: start {all | printer ...}\n");
555: return;
556: }
557: if (argc == 2 && !strcmp(argv[1], "all")) {
558: printer = prbuf;
559: while (getprent(line) > 0) {
560: cp1 = prbuf;
561: cp2 = line;
562: while ((c = *cp2++) && c != '|' && c != ':')
563: *cp1++ = c;
564: *cp1 = '\0';
565: startpr(1);
566: }
567: return;
568: }
569: while (--argc) {
570: printer = *++argv;
571: if ((status = pgetent(line, printer)) < 0) {
572: printf("cannot open printer description file\n");
573: continue;
574: } else if (status == 0) {
575: printf("unknown printer %s\n", printer);
576: continue;
577: }
578: startpr(1);
579: }
580: }
581:
582: startpr(enable)
583: {
584: struct stat stbuf;
585:
586: bp = pbuf;
587: if ((SD = pgetstr("sd", &bp)) == NULL)
588: SD = DEFSPOOL;
589: if ((LO = pgetstr("lo", &bp)) == NULL)
590: LO = DEFLOCK;
591: (void) sprintf(line, "%s/%s", SD, LO);
592: printf("%s:\n", printer);
593:
594: /*
595: * Turn off the owner execute bit of the lock file to enable printing.
596: */
597: if (enable && stat(line, &stbuf) >= 0) {
598: if (chmod(line, stbuf.st_mode & (enable==2 ? 0666 : 0677)) < 0)
599: printf("\tcannot enable printing\n");
600: else
601: printf("\tprinting enabled\n");
602: }
603: if (!startdaemon(printer))
604: printf("\tcouldn't start daemon\n");
605: else
606: printf("\tdaemon started\n");
607: }
608:
609: /*
610: * Print the status of each queue listed or all the queues.
611: */
612: status(argc, argv)
613: char *argv[];
614: {
615: register int c, status;
616: register char *cp1, *cp2;
617: char prbuf[100];
618:
619: if (argc == 1) {
620: printer = prbuf;
621: while (getprent(line) > 0) {
622: cp1 = prbuf;
623: cp2 = line;
624: while ((c = *cp2++) && c != '|' && c != ':')
625: *cp1++ = c;
626: *cp1 = '\0';
627: prstat();
628: }
629: return;
630: }
631: while (--argc) {
632: printer = *++argv;
633: if ((status = pgetent(line, printer)) < 0) {
634: printf("cannot open printer description file\n");
635: continue;
636: } else if (status == 0) {
637: printf("unknown printer %s\n", printer);
638: continue;
639: }
640: prstat();
641: }
642: }
643:
644: /*
645: * Print the status of the printer queue.
646: */
647: prstat()
648: {
649: struct stat stbuf;
650: register int fd, i;
651: register struct direct *dp;
652: DIR *dirp;
653:
654: bp = pbuf;
655: if ((SD = pgetstr("sd", &bp)) == NULL)
656: SD = DEFSPOOL;
657: if ((LO = pgetstr("lo", &bp)) == NULL)
658: LO = DEFLOCK;
659: if ((ST = pgetstr("st", &bp)) == NULL)
660: ST = DEFSTAT;
661: printf("%s:\n", printer);
662: (void) sprintf(line, "%s/%s", SD, LO);
663: if (stat(line, &stbuf) >= 0) {
664: printf("\tqueuing is %s\n",
665: (stbuf.st_mode & 010) ? "disabled" : "enabled");
666: printf("\tprinting is %s\n",
667: (stbuf.st_mode & 0100) ? "disabled" : "enabled");
668: } else {
669: printf("\tqueuing is enabled\n");
670: printf("\tprinting is enabled\n");
671: }
672: if ((dirp = opendir(SD)) == NULL) {
673: printf("\tcannot examine spool directory\n");
674: return;
675: }
676: i = 0;
677: while ((dp = readdir(dirp)) != NULL) {
678: if (*dp->d_name == 'c' && dp->d_name[1] == 'f')
679: i++;
680: }
681: closedir(dirp);
682: if (i == 0)
683: printf("\tno entries\n");
684: else if (i == 1)
685: printf("\t1 entry in spool area\n");
686: else
687: printf("\t%d entries in spool area\n", i);
688: fd = open(line, O_RDONLY);
689: if (fd < 0 || flock(fd, LOCK_SH|LOCK_NB) == 0) {
690: (void) close(fd); /* unlocks as well */
691: printf("\tno daemon present\n");
692: return;
693: }
694: (void) close(fd);
695: putchar('\t');
696: (void) sprintf(line, "%s/%s", SD, ST);
697: fd = open(line, O_RDONLY);
698: if (fd >= 0) {
699: (void) flock(fd, LOCK_SH);
700: while ((i = read(fd, line, sizeof(line))) > 0)
701: (void) fwrite(line, 1, i, stdout);
702: (void) close(fd); /* unlocks as well */
703: }
704: }
705:
706: /*
707: * Stop the specified daemon after completing the current job and disable
708: * printing.
709: */
710: stop(argc, argv)
711: char *argv[];
712: {
713: register int c, status;
714: register char *cp1, *cp2;
715: char prbuf[100];
716:
717: if (argc == 1) {
718: printf("Usage: stop {all | printer ...}\n");
719: return;
720: }
721: if (argc == 2 && !strcmp(argv[1], "all")) {
722: printer = prbuf;
723: while (getprent(line) > 0) {
724: cp1 = prbuf;
725: cp2 = line;
726: while ((c = *cp2++) && c != '|' && c != ':')
727: *cp1++ = c;
728: *cp1 = '\0';
729: stoppr();
730: }
731: return;
732: }
733: while (--argc) {
734: printer = *++argv;
735: if ((status = pgetent(line, printer)) < 0) {
736: printf("cannot open printer description file\n");
737: continue;
738: } else if (status == 0) {
739: printf("unknown printer %s\n", printer);
740: continue;
741: }
742: stoppr();
743: }
744: }
745:
746: stoppr()
747: {
748: register int fd;
749: struct stat stbuf;
750:
751: bp = pbuf;
752: if ((SD = pgetstr("sd", &bp)) == NULL)
753: SD = DEFSPOOL;
754: if ((LO = pgetstr("lo", &bp)) == NULL)
755: LO = DEFLOCK;
756: (void) sprintf(line, "%s/%s", SD, LO);
757: printf("%s:\n", printer);
758:
759: /*
760: * Turn on the owner execute bit of the lock file to disable printing.
761: */
762: if (stat(line, &stbuf) >= 0) {
763: if (chmod(line, (stbuf.st_mode & 0777) | 0100) < 0)
764: printf("\tcannot disable printing\n");
765: else
766: printf("\tprinting disabled\n");
767: } else if (errno == ENOENT) {
768: if ((fd = open(line, O_WRONLY|O_CREAT, 0760)) < 0)
769: printf("\tcannot create lock file\n");
770: else {
771: (void) close(fd);
772: printf("\tprinting disabled\n");
773: }
774: } else
775: printf("\tcannot stat lock file\n");
776: }
777:
778: struct queue **queue;
779: int nitems;
780: time_t mtime;
781:
782: /*
783: * Put the specified jobs at the top of printer queue.
784: */
785: topq(argc, argv)
786: char *argv[];
787: {
788: register int n, i;
789: struct stat stbuf;
790: register char *cfname;
791: int status, changed;
792:
793: if (argc < 3) {
794: printf("Usage: topq printer [jobnum ...] [user ...]\n");
795: return;
796: }
797:
798: --argc;
799: printer = *++argv;
800: status = pgetent(line, printer);
801: if (status < 0) {
802: printf("cannot open printer description file\n");
803: return;
804: } else if (status == 0) {
805: printf("%s: unknown printer\n", printer);
806: return;
807: }
808: bp = pbuf;
809: if ((SD = pgetstr("sd", &bp)) == NULL)
810: SD = DEFSPOOL;
811: if ((LO = pgetstr("lo", &bp)) == NULL)
812: LO = DEFLOCK;
813: printf("%s:\n", printer);
814:
815: if (chdir(SD) < 0) {
816: printf("\tcannot chdir to %s\n", SD);
817: return;
818: }
819: nitems = getq(&queue);
820: if (nitems == 0)
821: return;
822: changed = 0;
823: mtime = queue[0]->q_time;
824: for (i = argc; --i; ) {
825: if (doarg(argv[i]) == 0) {
826: printf("\tjob %s is not in the queue\n", argv[i]);
827: continue;
828: } else
829: changed++;
830: }
831: for (i = 0; i < nitems; i++)
832: free(queue[i]);
833: free(queue);
834: if (!changed) {
835: printf("\tqueue order unchanged\n");
836: return;
837: }
838: /*
839: * Turn on the public execute bit of the lock file to
840: * get lpd to rebuild the queue after the current job.
841: */
842: if (changed && stat(LO, &stbuf) >= 0)
843: (void) chmod(LO, (stbuf.st_mode & 0777) | 01);
844: }
845:
846: /*
847: * Reposition the job by changing the modification time of
848: * the control file.
849: */
850: touch(q)
851: struct queue *q;
852: {
853: struct timeval tvp[2];
854:
855: tvp[0].tv_sec = tvp[1].tv_sec = --mtime;
856: tvp[0].tv_usec = tvp[1].tv_usec = 0;
857: return(utimes(q->q_name, tvp));
858: }
859:
860: /*
861: * Checks if specified job name is in the printer's queue.
862: * Returns: negative (-1) if argument name is not in the queue.
863: */
864: doarg(job)
865: char *job;
866: {
867: register struct queue **qq;
868: register int jobnum, n;
869: register char *cp, *machine;
870: int cnt = 0;
871: FILE *fp;
872:
873: /*
874: * Look for a job item consisting of system name, colon, number
875: * (example: ucbarpa:114)
876: */
877: if ((cp = index(job, ':')) != NULL) {
878: machine = job;
879: *cp++ = '\0';
880: job = cp;
881: } else
882: machine = NULL;
883:
884: /*
885: * Check for job specified by number (example: 112 or 235ucbarpa).
886: */
887: if (isdigit(*job)) {
888: jobnum = 0;
889: do
890: jobnum = jobnum * 10 + (*job++ - '0');
891: while (isdigit(*job));
892: for (qq = queue + nitems; --qq >= queue; ) {
893: n = 0;
894: for (cp = (*qq)->q_name+3; isdigit(*cp); )
895: n = n * 10 + (*cp++ - '0');
896: if (jobnum != n)
897: continue;
898: if (*job && strcmp(job, cp) != 0)
899: continue;
900: if (machine != NULL && strcmp(machine, cp) != 0)
901: continue;
902: if (touch(*qq) == 0) {
903: printf("\tmoved %s\n", (*qq)->q_name);
904: cnt++;
905: }
906: }
907: return(cnt);
908: }
909: /*
910: * Process item consisting of owner's name (example: henry).
911: */
912: for (qq = queue + nitems; --qq >= queue; ) {
913: if ((fp = fopen((*qq)->q_name, "r")) == NULL)
914: continue;
915: while (getline(fp) > 0)
916: if (line[0] == 'P')
917: break;
918: (void) fclose(fp);
919: if (line[0] != 'P' || strcmp(job, line+1) != 0)
920: continue;
921: if (touch(*qq) == 0) {
922: printf("\tmoved %s\n", (*qq)->q_name);
923: cnt++;
924: }
925: }
926: return(cnt);
927: }
928:
929: /*
930: * Enable everything and start printer (undo `down').
931: */
932: up(argc, argv)
933: char *argv[];
934: {
935: register int c, status;
936: register char *cp1, *cp2;
937: char prbuf[100];
938:
939: if (argc == 1) {
940: printf("Usage: up {all | printer ...}\n");
941: return;
942: }
943: if (argc == 2 && !strcmp(argv[1], "all")) {
944: printer = prbuf;
945: while (getprent(line) > 0) {
946: cp1 = prbuf;
947: cp2 = line;
948: while ((c = *cp2++) && c != '|' && c != ':')
949: *cp1++ = c;
950: *cp1 = '\0';
951: startpr(2);
952: }
953: return;
954: }
955: while (--argc) {
956: printer = *++argv;
957: if ((status = pgetent(line, printer)) < 0) {
958: printf("cannot open printer description file\n");
959: continue;
960: } else if (status == 0) {
961: printf("unknown printer %s\n", printer);
962: continue;
963: }
964: startpr(2);
965: }
966: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.