diff options
Diffstat (limited to 'usr.sbin/lpr/lpq')
| -rw-r--r-- | usr.sbin/lpr/lpq/Makefile | 13 | ||||
| -rw-r--r-- | usr.sbin/lpr/lpq/Makefile.depend | 16 | ||||
| -rw-r--r-- | usr.sbin/lpr/lpq/lpq.1 | 135 | ||||
| -rw-r--r-- | usr.sbin/lpr/lpq/lpq.c | 183 | 
4 files changed, 347 insertions, 0 deletions
| diff --git a/usr.sbin/lpr/lpq/Makefile b/usr.sbin/lpr/lpq/Makefile new file mode 100644 index 000000000000..2e29a0386204 --- /dev/null +++ b/usr.sbin/lpr/lpq/Makefile @@ -0,0 +1,13 @@ +BINDIR=	/usr/bin + +PACKAGE=lp +PROG=	lpq +BINOWN=	root +BINGRP=	daemon +BINMODE= 6555 + +CFLAGS+= -I${.CURDIR:H}/common_source + +LIBADD=	lpr + +.include <bsd.prog.mk> diff --git a/usr.sbin/lpr/lpq/Makefile.depend b/usr.sbin/lpr/lpq/Makefile.depend new file mode 100644 index 000000000000..52597b984452 --- /dev/null +++ b/usr.sbin/lpr/lpq/Makefile.depend @@ -0,0 +1,16 @@ +# Autogenerated - do NOT edit! + +DIRDEPS = \ +	include \ +	include/xlocale \ +	lib/${CSU_DIR} \ +	lib/libc \ +	lib/libcompiler_rt \ +	usr.sbin/lpr/common_source \ + + +.include <dirdeps.mk> + +.if ${DEP_RELDIR} == ${_DEP_RELDIR} +# local dependencies - needed for -jN in clean tree +.endif diff --git a/usr.sbin/lpr/lpq/lpq.1 b/usr.sbin/lpr/lpq/lpq.1 new file mode 100644 index 000000000000..c87bcbbaa94d --- /dev/null +++ b/usr.sbin/lpr/lpq/lpq.1 @@ -0,0 +1,135 @@ +.\" Copyright (c) 1983, 1990, 1993 +.\"	The Regents of the University of California.  All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\"    notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\"    notice, this list of conditions and the following disclaimer in the +.\"    documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\"    may be used to endorse or promote products derived from this software +.\"    without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.Dd April 28, 1995 +.Dt LPQ 1 +.Os +.Sh NAME +.Nm lpq +.Nd spool queue examination program +.Sh SYNOPSIS +.Nm +.Op Fl a +.Op Fl l +.Op Fl P Ns Ar printer +.Op job # ...\& +.Op user ...\& +.Sh DESCRIPTION +The +.Nm +utility examines the spooling area used by +.Xr lpd 8 +for printing files on the line printer, and reports the status of the +specified jobs or all jobs associated with a user. +The +.Nm +utility invoked +without any arguments reports on any jobs currently in the queue. +.Pp +Options: +.Bl -tag -width indent +.It Fl P +Specify a particular printer, otherwise the default +line printer is used (or the value of the +.Ev PRINTER +variable in the +environment). +All other arguments supplied are interpreted as user +names or job numbers to filter out only those jobs of interest. +.It Fl l +Information about each of the files comprising the job entry +is printed. +Normally, only as much information as will fit on one line is displayed. +.It Fl a +Report on the local queues for all printers, +rather than just the specified printer. +.El +.Pp +For each job submitted (i.e., invocation of +.Xr lpr 1 ) +.Nm +reports the user's name, current rank in the queue, the +names of files comprising the job, the job identifier (a number which +may be supplied to +.Xr lprm 1 +for removing a specific job), and the total size in bytes. +Job ordering is dependent on +the algorithm used to scan the spooling directory and is supposed +to be +.Tn FIFO +(First in First Out). +File names comprising a job may be unavailable +(when +.Xr lpr 1 +is used as a sink in a pipeline) in which case the file +is indicated as ``(standard input)''. +.Pp +If +.Nm +warns that there is no daemon present (i.e., due to some malfunction), +the +.Xr lpc 8 +command can be used to restart the printer daemon. +.Sh ENVIRONMENT +If the following environment variable exists, it is used by +.Nm : +.Bl -tag -width PRINTER +.It Ev PRINTER +Specifies an alternate default printer. +.El +.Sh FILES +.Bl -tag -width "/var/spool/*/lock" -compact +.It Pa /etc/printcap +To determine printer characteristics. +.It Pa /var/spool/* +The spooling directory, as determined from printcap. +.It Pa /var/spool/*/cf* +Control files specifying jobs. +.It Pa /var/spool/*/lock +The lock file to obtain the currently active job. +.El +.Sh DIAGNOSTICS +Unable to open various files. +The lock file being malformed. +Garbage +files when there is no daemon active, but files in the spooling directory. +.Sh SEE ALSO +.Xr lpr 1 , +.Xr lprm 1 , +.Xr lpc 8 , +.Xr lpd 8 +.Sh HISTORY +A +.Nm +utility appeared in +.Bx 3 . +.Sh BUGS +Due to the dynamic nature of the information in the spooling directory +.Nm +may report unreliably. +Output formatting is sensitive to the line length of the terminal; +this can results in widely spaced columns. diff --git a/usr.sbin/lpr/lpq/lpq.c b/usr.sbin/lpr/lpq/lpq.c new file mode 100644 index 000000000000..6899b691ee3a --- /dev/null +++ b/usr.sbin/lpr/lpq/lpq.c @@ -0,0 +1,183 @@ +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1983, 1993 + *	The Regents of the University of California.  All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in the + *    documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "lp.cdefs.h"		/* A cross-platform version of <sys/cdefs.h> */ +/* + * Spool Queue examination program + * + * 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 + */ + +#include <sys/param.h> + +#include <ctype.h> +#include <dirent.h> +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <syslog.h> +#include <unistd.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 */ + +uid_t	uid, euid; + +static int	 ckqueue(const struct printer *_pp); +static void	 usage(void); +int 		 main(int _argc, char **_argv); + +int +main(int argc, char **argv) +{ +	int ch, aflag, lflag; +	const char *printer; +	struct printer myprinter, *pp = &myprinter; + +	printer = NULL; +	euid = geteuid(); +	uid = getuid(); +	PRIV_END +	progname = *argv; +	if (gethostname(local_host, sizeof(local_host))) +		err(1, "gethostname"); +	openlog("lpd", 0, LOG_LPR); + +	aflag = lflag = 0; +	while ((ch = getopt(argc, argv, "alP:")) != -1) +		switch((char)ch) { +		case 'a': +			++aflag; +			break; +		case 'l':			/* long output */ +			++lflag; +			break; +		case 'P':		/* printer name */ +			printer = optarg; +			break; +		case '?': +		default: +			usage(); +		} + +	if (!aflag && printer == NULL && (printer = getenv("PRINTER")) == NULL) +		printer = DEFLP; + +	for (argc -= optind, argv += optind; argc; --argc, ++argv) +		if (isdigit(argv[0][0])) { +			if (requests >= MAXREQUESTS) +				fatal(0, "too many requests"); +			requ[requests++] = atoi(*argv); +		} +		else { +			if (users >= MAXUSERS) +				fatal(0, "too many users"); +			user[users++] = *argv; +		} + +	if (aflag) { +		int more, status; + +		more = firstprinter(pp, &status); +		if (status) +			goto looperr; +		while (more) { +			if (ckqueue(pp) > 0) { +				printf("%s:\n", pp->printer); +				displayq(pp, lflag); +				printf("\n"); +			} +			do { +				more = nextprinter(pp, &status); +looperr: +				switch (status) { +				case PCAPERR_TCOPEN: +					printf("warning: %s: unresolved " +					       "tc= reference(s) ", +					       pp->printer); +				case PCAPERR_SUCCESS: +					break; +				default: +					fatal(pp, "%s", pcaperr(status)); +				} +			} while (more && status); +		} +	} else { +		int status; + +		init_printer(pp); +		status = getprintcap(printer, pp); +		if (status < 0) +			fatal(pp, "%s", pcaperr(status)); + +		displayq(pp, lflag); +	} +	exit(0); +} + +static int +ckqueue(const struct printer *pp) +{ +	register struct dirent *d; +	DIR *dirp; +	char *spooldir; + +	spooldir = pp->spool_dir; +	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); +} + +static void +usage(void) +{ +	fprintf(stderr, +	"usage: lpq [-a] [-l] [-Pprinter] [user ...] [job ...]\n"); +	exit(1); +} | 
