diff options
Diffstat (limited to 'usr.sbin/lpr/lpq/lpq.c')
-rw-r--r-- | usr.sbin/lpr/lpq/lpq.c | 63 |
1 files changed, 55 insertions, 8 deletions
diff --git a/usr.sbin/lpr/lpq/lpq.c b/usr.sbin/lpr/lpq/lpq.c index b091e8e..7d1b520 100644 --- a/usr.sbin/lpr/lpq/lpq.c +++ b/usr.sbin/lpr/lpq/lpq.c @@ -39,14 +39,15 @@ static char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)lpq.c 8.1 (Berkeley) 6/6/93"; +static char sccsid[] = "@(#)lpq.c 8.3 (Berkeley) 5/10/95"; #endif /* not lint */ /* * Spool Queue examination program * - * lpq [-l] [-Pprinter] [user...] [job...] + * lpq [-a] [-l] [-Pprinter] [user...] [job...] * + * -a show all non-null queues on the local machine * -l long output * -P used to identify printer as per lpr/lprm */ @@ -61,12 +62,14 @@ static char sccsid[] = "@(#)lpq.c 8.1 (Berkeley) 6/6/93"; #include <ctype.h> #include "lp.h" #include "lp.local.h" +#include "pathnames.h" int requ[MAXREQUESTS]; /* job number of spool entries */ int requests; /* # of spool requests */ char *user[MAXUSERS]; /* users to process */ int users; /* # of users in user array */ +static int ckqueue __P((char *)); void usage __P((void)); int @@ -76,7 +79,8 @@ main(argc, argv) { extern char *optarg; extern int optind; - int ch, lflag; /* long output option */ + int ch, aflag, lflag; + char *buf, *cp; name = *argv; if (gethostname(host, sizeof(host))) { @@ -85,9 +89,12 @@ main(argc, argv) } openlog("lpd", 0, LOG_LPR); - lflag = 0; - while ((ch = getopt(argc, argv, "lP:")) != EOF) + aflag = lflag = 0; + while ((ch = getopt(argc, argv, "alP:")) != EOF) switch((char)ch) { + case 'a': + ++aflag; + break; case 'l': /* long output */ ++lflag; break; @@ -99,7 +106,7 @@ main(argc, argv) usage(); } - if (printer == NULL && (printer = getenv("PRINTER")) == NULL) + if (!aflag && printer == NULL && (printer = getenv("PRINTER")) == NULL) printer = DEFLP; for (argc -= optind, argv += optind; argc; --argc, ++argv) @@ -114,13 +121,53 @@ main(argc, argv) user[users++] = *argv; } - displayq(lflag); + if (aflag) { + while (cgetnext(&buf, printcapdb) > 0) { + if (ckqueue(buf) <= 0) { + free(buf); + continue; /* no jobs */ + } + for (cp = buf; *cp; cp++) + if (*cp == '|' || *cp == ':') { + *cp = '\0'; + break; + } + printer = buf; + printf("%s:\n", printer); + displayq(lflag); + free(buf); + printf("\n"); + } + } else + displayq(lflag); exit(0); } +static int +ckqueue(cap) + char *cap; +{ + register struct dirent *d; + DIR *dirp; + char *spooldir; + + if (cgetstr(cap, "sd", &spooldir) == -1) + spooldir = _PATH_DEFSPOOL; + if ((dirp = opendir(spooldir)) == NULL) + return (-1); + while ((d = readdir(dirp)) != NULL) { + if (d->d_name[0] != 'c' || d->d_name[1] != 'f') + continue; /* daemon control files only */ + closedir(dirp); + return (1); /* found something */ + } + closedir(dirp); + return (0); +} + void usage() { - puts("usage: lpq [-l] [-Pprinter] [user ...] [job ...]"); + puts("usage: lpq [-a] [-l] [-Pprinter] [user ...] [job ...]"); exit(1); } |