File:  [DragonFly] / src / usr.sbin / lpr / lpq / lpq.c
Revision 1.2: download - view: text, annotated - select for diffs
Tue Jun 17 04:29:56 2003 UTC (11 years, 5 months ago) by dillon
Branches: MAIN
CVS tags: HEAD
Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids.  Most
ids have been removed from !lint sections and moved into comment sections.

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