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