/* 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 -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; }