xref: /original-bsd/usr.sbin/lpr/lpq/lpq.c (revision 898c7514)
1 /*
2  * Copyright (c) 1983, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  *
6  * %sccs.include.redist.c%
7  */
8 
9 #ifndef lint
10 static char copyright[] =
11 "@(#) Copyright (c) 1983, 1993\n\
12 	The Regents of the University of California.  All rights reserved.\n";
13 #endif /* not lint */
14 
15 #ifndef lint
16 static char sccsid[] = "@(#)lpq.c	8.3 (Berkeley) 05/10/95";
17 #endif /* not lint */
18 
19 /*
20  * Spool Queue examination program
21  *
22  * lpq [-a] [-l] [-Pprinter] [user...] [job...]
23  *
24  * -a show all non-null queues on the local machine
25  * -l long output
26  * -P used to identify printer as per lpr/lprm
27  */
28 
29 #include <sys/param.h>
30 
31 #include <syslog.h>
32 #include <dirent.h>
33 #include <unistd.h>
34 #include <stdlib.h>
35 #include <stdio.h>
36 #include <ctype.h>
37 #include "lp.h"
38 #include "lp.local.h"
39 #include "pathnames.h"
40 
41 int	 requ[MAXREQUESTS];	/* job number of spool entries */
42 int	 requests;		/* # of spool requests */
43 char	*user[MAXUSERS];	/* users to process */
44 int	 users;			/* # of users in user array */
45 
46 static int ckqueue __P((char *));
47 void usage __P((void));
48 
49 int
50 main(argc, argv)
51 	register int	argc;
52 	register char	**argv;
53 {
54 	extern char	*optarg;
55 	extern int	optind;
56 	int	ch, aflag, lflag;
57 	char	*buf, *cp;
58 
59 	name = *argv;
60 	if (gethostname(host, sizeof(host))) {
61 		perror("lpq: gethostname");
62 		exit(1);
63 	}
64 	openlog("lpd", 0, LOG_LPR);
65 
66 	aflag = lflag = 0;
67 	while ((ch = getopt(argc, argv, "alP:")) != EOF)
68 		switch((char)ch) {
69 		case 'a':
70 			++aflag;
71 			break;
72 		case 'l':			/* long output */
73 			++lflag;
74 			break;
75 		case 'P':		/* printer name */
76 			printer = optarg;
77 			break;
78 		case '?':
79 		default:
80 			usage();
81 		}
82 
83 	if (!aflag && printer == NULL && (printer = getenv("PRINTER")) == NULL)
84 		printer = DEFLP;
85 
86 	for (argc -= optind, argv += optind; argc; --argc, ++argv)
87 		if (isdigit(argv[0][0])) {
88 			if (requests >= MAXREQUESTS)
89 				fatal("too many requests");
90 			requ[requests++] = atoi(*argv);
91 		}
92 		else {
93 			if (users >= MAXUSERS)
94 				fatal("too many users");
95 			user[users++] = *argv;
96 		}
97 
98 	if (aflag) {
99 		while (cgetnext(&buf, printcapdb) > 0) {
100 			if (ckqueue(buf) <= 0) {
101 				free(buf);
102 				continue;	/* no jobs */
103 			}
104 			for (cp = buf; *cp; cp++)
105 				if (*cp == '|' || *cp == ':') {
106 					*cp = '\0';
107 					break;
108 				}
109 			printer = buf;
110 			printf("%s:\n", printer);
111 			displayq(lflag);
112 			free(buf);
113 			printf("\n");
114 		}
115 	} else
116 		displayq(lflag);
117 	exit(0);
118 }
119 
120 static int
121 ckqueue(cap)
122 	char *cap;
123 {
124 	register struct dirent *d;
125 	DIR *dirp;
126 	char *spooldir;
127 
128 	if (cgetstr(cap, "sd", &spooldir) == -1)
129 		spooldir = _PATH_DEFSPOOL;
130 	if ((dirp = opendir(spooldir)) == NULL)
131 		return (-1);
132 	while ((d = readdir(dirp)) != NULL) {
133 		if (d->d_name[0] != 'c' || d->d_name[1] != 'f')
134 			continue;	/* daemon control files only */
135 		closedir(dirp);
136 		return (1);		/* found something */
137 	}
138 	closedir(dirp);
139 	return (0);
140 }
141 
142 void
143 usage()
144 {
145 	puts("usage: lpq [-a] [-l] [-Pprinter] [user ...] [job ...]");
146 	exit(1);
147 }
148