diff options
Diffstat (limited to 'printutils/lpq.c')
-rw-r--r-- | printutils/lpq.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/printutils/lpq.c b/printutils/lpq.c new file mode 100644 index 0000000..ce9a10c --- /dev/null +++ b/printutils/lpq.c @@ -0,0 +1,108 @@ +/* vi: set sw=4 ts=4: */ +/* + * Copyright 2008 Walter Harms (WHarms@bfs.de) + * + * Licensed under the GPL v2, see the file LICENSE in this tarball. + */ +#include "libbb.h" +#include "lpr.h" + +/* + this is a *very* resticted form of lpq + since we do not read /etc/printcap (and never will) + we can only do things rfc1179 allows: + - show print jobs for a given queue long/short form + - remove a job from a given queue + + -P <queue> + -s short + -d delete job + -f force any waiting job to be printed +*/ +enum { + LPQ_SHORT = 1 << 0, + LPQ_DELETE = 1 << 1, + LPQ_FORCE = 1 << 2, + LPQ_P = 1 << 3, + LPQ_t = 1 << 4, +}; + +/* + print everthing that comes +*/ +static void get_answer(int sockfd) +{ + char buf[80]; + int n; + + buf[0] = '\n'; + while (1) { + n = safe_read(sockfd, buf, sizeof(buf)); + if (n <= 0) + break; + full_write(STDOUT_FILENO, buf, n); + buf[0] = buf[n-1]; /* last written char */ + } + + /* Don't leave last output line unterminated */ + if (buf[0] != '\n') + full_write(STDOUT_FILENO, "\n", 1); +} + +/* + is this too simple ? + should we support more ENV ? + PRINTER, LPDEST, NPRINTER, NGPRINTER +*/ +int lpq_main(int argc, char *argv[]) MAIN_EXTERNALLY_VISIBLE; +int lpq_main(int argc, char *argv[]) +{ + struct netprint netprint; + const char *netopt; + const char *delopt = "0"; + int sockfd = sockfd; /* for compiler */ + unsigned opt; + int delay; /* delay in [s] */ + + netopt = NULL; + opt = getopt32(argv, "sdfP:t:", &netopt, &delopt); + argv += optind; + delay = xatoi_u(delopt); + parse_prt(netopt, &netprint); + + /* do connect */ + if (opt & (LPQ_FORCE|LPQ_DELETE)) + sockfd = xconnect_stream(netprint.lsa); + + /* force printing of every job still in queue */ + if (opt & LPQ_FORCE) { + fdprintf(sockfd, "\x1" "%s", netprint.queue); + get_answer(sockfd); + return EXIT_SUCCESS; + } + + /* delete job (better a list of jobs). username is now LOGNAME */ + if (opt & LPQ_DELETE) { + while (*argv) { + fdprintf(sockfd, "\x5" "%s %s %s", + netprint.queue, + getenv("LOGNAME"), /* FIXME - may be NULL? */ + *argv); + get_answer(sockfd); + argv++; + } + return EXIT_SUCCESS; + } + + do { + sockfd = xconnect_stream(netprint.lsa); + fdprintf(sockfd, "%c%s\n", (opt & LPQ_SHORT) ? 3 : 4, + netprint.queue); + + get_answer(sockfd); + close(sockfd); + sleep(delay); + } while (delay != 0); + + return EXIT_SUCCESS; +} |