|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: char copyright[] =
9: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
10: All rights reserved.\n";
11: #endif not lint
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)lpq.c 5.2 (Berkeley) 11/17/85";
15: #endif not lint
16:
17: /*
18: * Spool Queue examination program
19: *
20: * lpq [+[n]] [-Pprinter] [user...] [job...]
21: *
22: * + means continually scan queue until empty
23: * -P used to identify printer as per lpr/lprm
24: */
25:
26: #include "lp.h"
27:
28: char *user[MAXUSERS]; /* users to process */
29: int users; /* # of users in user array */
30: int requ[MAXREQUESTS]; /* job number of spool entries */
31: int requests; /* # of spool requests */
32:
33: static int repeat; /* + flag indicator */
34: static int slptime = 30; /* pause between screen refereshes */
35: static int lflag; /* long output option */
36:
37: /*
38: * Termcap stuff for fancy display
39: */
40: #ifdef TERMCAP
41: struct sgttyb sbuf;
42: static unsigned ospeed;
43: static int dumb; /* whether to use capabilities */
44: static char PC; /* pad character for output */
45: static char *UP; /* up one line */
46: static char *BC; /* backspace character, other than \b */
47: static char *CM; /* cursor motion */
48: static char *CL; /* clear display */
49: static char *TI; /* terminal init for CM */
50: static char *TE; /* terminal clear for CM */
51: static char *SO; /* stand out start */
52: static char *SE; /* stand out end */
53:
54: char *tgetstr();
55: int putch(); /* for tputs' */
56: #endif
57:
58: main(argc, argv)
59: char *argv[];
60: {
61: register char *arg;
62: register int n;
63:
64: name = argv[0];
65: gethostname(host, sizeof(host));
66: openlog("lpd", 0, LOG_LPR);
67:
68: while (--argc) {
69: if ((arg = *++argv)[0] == '+') {
70: if (arg[1] != '\0')
71: if ((n = atoi(&arg[1])) > 0)
72: slptime = n;
73: repeat++;
74: } else if (arg[0] == '-')
75: switch (arg[1]) {
76: case 'P': /* printer name */
77: if (arg[2])
78: printer = &arg[2];
79: else if (argc > 1) {
80: argc--;
81: printer = *++argv;
82: }
83: break;
84:
85: case 'l': /* long output */
86: lflag++;
87: break;
88:
89: default:
90: usage();
91: } else {
92: if (isdigit(arg[0])) {
93: if (requests >= MAXREQUESTS)
94: fatal("too many requests");
95: requ[requests++] = atoi(arg);
96: } else {
97: if (users >= MAXUSERS)
98: fatal("too many users");
99: user[users++] = arg;
100: }
101: }
102: }
103: if (printer == NULL && (printer = getenv("PRINTER")) == NULL)
104: printer = DEFLP;
105: #ifdef TERMCAP
106: dumb = termcap();
107: #endif
108:
109: if (repeat) {
110: #ifdef TERMCAP
111: if (TI)
112: tputs(TI, 0, putch);
113: #endif
114: do {
115: #ifdef TERMCAP
116: if (!dumb) {
117: tputs(CL, 0, putch);
118: tputs(tgoto(CM, 0, 0), 0, putch);
119: }
120: #endif
121: if ((n = displayq(lflag)) > 0)
122: sleep(slptime);
123: } while (n > 0);
124: #ifdef TERMCAP
125: if (!dumb) {
126: standout(stdout, "Hit return to continue");
127: while (getchar() != '\n');
128: if (TE)
129: tputs(TE, 0, putch);
130: }
131: #endif
132: } else
133: displayq(lflag);
134: exit(0);
135: }
136:
137: static
138: usage()
139: {
140: printf("usage: lpq [-Pprinter] [-l] [+[n]] [user...] [job...]\n");
141: exit(1);
142: }
143:
144: /*
145: * If we have the capability, print this in standout mode
146: */
147: static
148: standout(f, s, a1, a2)
149: FILE *f;
150: char *s;
151: {
152: #ifdef TERMCAP
153: if (SO)
154: tputs(SO, 0, putch);
155: fprintf(f, s, a1, a2);
156: if (SO && SE)
157: tputs(SE, 0, putch);
158: #else
159: fprintf(f, s, a1, a2);
160: #endif
161: }
162:
163: #ifdef TERMCAP
164: static char *
165: capstrings[] = {
166: "bc", "cl", "cm", "so", "se", "ti", "te", "up",
167: 0
168: };
169:
170: static char **
171: caps[] = {
172: &BC, &CL, &CM, &SO, &SE, &TI, &TE, &UP,
173: };
174:
175: /*
176: * All we need from termcap is to clear screen and
177: * position cursor at the top; if these aren't available
178: * we say the terminal is dumb and let things scroll
179: */
180: static
181: termcap()
182: {
183: char *term, tbuf[BUFSIZ];
184: static char buf[BUFSIZ/2];
185: register short columns;
186: char *bp = buf;
187: register char **p, ***q, *cp;
188:
189: ioctl(0, TIOCGETP, (char *)&sbuf);
190: ospeed = sbuf.sg_ospeed;
191: if ((term = getenv("TERM")) != NULL && tgetent(tbuf, term) > 0) {
192: for (p = capstrings, q = caps; *p != NULL; p++, q++)
193: **q = tgetstr(*p, &bp);
194: if ((cp = tgetstr("pc", &bp)) != NULL)
195: PC = *cp;
196: }
197: return(CL == NULL || CM == NULL);
198: }
199:
200: /*
201: * Putchar writearound for tputs
202: */
203: static
204: putch(c)
205: char c;
206: {
207: putchar(c);
208: }
209: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.