lpq.c revision 78300
1/*
2 * Copyright (c) 1983, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 *    must display the following acknowledgement:
16 *	This product includes software developed by the University of
17 *	California, Berkeley and its contributors.
18 * 4. Neither the name of the University nor the names of its contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35#ifndef lint
36static const char copyright[] =
37"@(#) Copyright (c) 1983, 1993\n\
38	The Regents of the University of California.  All rights reserved.\n";
39#endif /* not lint */
40
41#ifndef lint
42/*
43static char sccsid[] = "@(#)lpq.c	8.3 (Berkeley) 5/10/95";
44*/
45static const char rcsid[] =
46  "$FreeBSD: head/usr.sbin/lpr/lpq/lpq.c 78300 2001-06-15 22:03:07Z gad $";
47#endif /* not lint */
48
49/*
50 * Spool Queue examination program
51 *
52 * lpq [-a] [-l] [-Pprinter] [user...] [job...]
53 *
54 * -a show all non-null queues on the local machine
55 * -l long output
56 * -P used to identify printer as per lpr/lprm
57 */
58
59#include <sys/param.h>
60
61#include <ctype.h>
62#include <dirent.h>
63#include <err.h>
64#include <stdio.h>
65#include <stdlib.h>
66#include <syslog.h>
67#include <unistd.h>
68
69#include "lp.h"
70#include "lp.local.h"
71#include "pathnames.h"
72
73int	 requ[MAXREQUESTS];	/* job number of spool entries */
74int	 requests;		/* # of spool requests */
75char	*user[MAXUSERS];	/* users to process */
76int	 users;			/* # of users in user array */
77
78uid_t	uid, euid;
79
80static int	 ckqueue(const struct printer *_pp);
81static void	 usage(void);
82int 		 main(int _argc, char **_argv);
83
84int
85main(int argc, char **argv)
86{
87	int ch, aflag, lflag;
88	const char *printer;
89	struct printer myprinter, *pp = &myprinter;
90
91	printer = NULL;
92	euid = geteuid();
93	uid = getuid();
94	seteuid(uid);
95	progname = *argv;
96	if (gethostname(local_host, sizeof(local_host)))
97		err(1, "gethostname");
98	openlog("lpd", 0, LOG_LPR);
99
100	aflag = lflag = 0;
101	while ((ch = getopt(argc, argv, "alP:")) != -1)
102		switch((char)ch) {
103		case 'a':
104			++aflag;
105			break;
106		case 'l':			/* long output */
107			++lflag;
108			break;
109		case 'P':		/* printer name */
110			printer = optarg;
111			break;
112		case '?':
113		default:
114			usage();
115		}
116
117	if (!aflag && printer == NULL && (printer = getenv("PRINTER")) == NULL)
118		printer = DEFLP;
119
120	for (argc -= optind, argv += optind; argc; --argc, ++argv)
121		if (isdigit(argv[0][0])) {
122			if (requests >= MAXREQUESTS)
123				fatal(0, "too many requests");
124			requ[requests++] = atoi(*argv);
125		}
126		else {
127			if (users >= MAXUSERS)
128				fatal(0, "too many users");
129			user[users++] = *argv;
130		}
131
132	if (aflag) {
133		int more, status;
134
135		more = firstprinter(pp, &status);
136		if (status)
137			goto looperr;
138		while (more) {
139			if (ckqueue(pp) > 0) {
140				printf("%s:\n", pp->printer);
141				displayq(pp, lflag);
142				printf("\n");
143			}
144			do {
145				more = nextprinter(pp, &status);
146looperr:
147				switch (status) {
148				case PCAPERR_TCOPEN:
149					printf("warning: %s: unresolved "
150					       "tc= reference(s) ",
151					       pp->printer);
152				case PCAPERR_SUCCESS:
153					break;
154				default:
155					fatal(pp, pcaperr(status));
156				}
157			} while (more && status);
158		}
159	} else {
160		int status;
161
162		init_printer(pp);
163		status = getprintcap(printer, pp);
164		if (status < 0)
165			fatal(pp, pcaperr(status));
166
167		displayq(pp, lflag);
168	}
169	exit(0);
170}
171
172static int
173ckqueue(const struct printer *pp)
174{
175	register struct dirent *d;
176	DIR *dirp;
177	char *spooldir;
178
179	spooldir = pp->spool_dir;
180	if ((dirp = opendir(spooldir)) == NULL)
181		return (-1);
182	while ((d = readdir(dirp)) != NULL) {
183		if (d->d_name[0] != 'c' || d->d_name[1] != 'f')
184			continue;	/* daemon control files only */
185		closedir(dirp);
186		return (1);		/* found something */
187	}
188	closedir(dirp);
189	return (0);
190}
191
192static void
193usage(void)
194{
195	fprintf(stderr,
196	"usage: lpq [-a] [-l] [-Pprinter] [user ...] [job ...]\n");
197	exit(1);
198}
199