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 * 4. Neither the name of the University nor the names of its contributors
15 *    may be used to endorse or promote products derived from this software
16 *    without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 */
30
31#ifndef lint
32static const char copyright[] =
33"@(#) Copyright (c) 1983, 1993\n\
34	The Regents of the University of California.  All rights reserved.\n";
35#endif /* not lint */
36
37#if 0
38#ifndef lint
39static char sccsid[] = "@(#)lprm.c	8.1 (Berkeley) 6/6/93";
40#endif /* not lint */
41#endif
42
43#include "lp.cdefs.h"		/* A cross-platform version of <sys/cdefs.h> */
44__FBSDID("$FreeBSD$");
45
46/*
47 * lprm - remove the current user's spool entry
48 *
49 * lprm [-] [[job #] [user] ...]
50 *
51 * Using information in the lock file, lprm will kill the
52 * currently active daemon (if necessary), remove the associated files,
53 * and startup a new daemon.  Priviledged users may remove anyone's spool
54 * entries, otherwise one can only remove their own.
55 */
56
57#include <sys/param.h>
58
59#include <syslog.h>
60#include <dirent.h>
61#include <err.h>
62#include <pwd.h>
63#include <unistd.h>
64#include <stdlib.h>
65#include <stdio.h>
66#include <string.h>
67#include <ctype.h>
68#include "lp.h"
69#include "lp.local.h"
70
71/*
72 * Stuff for handling job specifications
73 */
74char	*person;		/* name of person doing lprm */
75int	 requ[MAXREQUESTS];	/* job number of spool entries */
76int	 requests;		/* # of spool requests */
77char	*user[MAXUSERS];	/* users to process */
78int	 users;			/* # of users in user array */
79uid_t	 uid, euid;		/* real and effective user id's */
80
81static char	luser[16];	/* buffer for person */
82
83int		 main(int argc, char *_argv[]);
84static void	 usage(void);
85
86int
87main(int argc, char *argv[])
88{
89	char *arg;
90	const char *printer;
91	struct passwd *p;
92	static char root[] = "root";
93
94	printer = NULL;
95	uid = getuid();
96	euid = geteuid();
97	PRIV_END	/* be safe */
98	progname = argv[0];
99	gethostname(local_host, sizeof(local_host));
100	openlog("lpd", 0, LOG_LPR);
101
102	/*
103	 * Bogus code later checks for string equality between
104	 * `person' and "root", so if we are root, better make sure
105	 * that code will succeed.
106	 */
107	if (getuid() == 0) {
108		person = root;
109	} else if ((person = getlogin()) == NULL) {
110		if ((p = getpwuid(getuid())) == NULL)
111			fatal(0, "Who are you?");
112		if (strlen(p->pw_name) >= sizeof(luser))
113			fatal(0, "Your name is too long");
114		strcpy(luser, p->pw_name);
115		person = luser;
116	}
117	while (--argc) {
118		if ((arg = *++argv)[0] == '-')
119			switch (arg[1]) {
120			case 'P':
121				if (arg[2])
122					printer = &arg[2];
123				else if (argc > 1) {
124					argc--;
125					printer = *++argv;
126				}
127				break;
128			case '\0':
129				if (!users) {
130					users = -1;
131					break;
132				}
133			default:
134				usage();
135			}
136		else {
137			if (users < 0)
138				usage();
139			if (isdigit(arg[0])) {
140				if (requests >= MAXREQUESTS)
141					fatal(0, "Too many requests");
142				requ[requests++] = atoi(arg);
143			} else {
144				if (users >= MAXUSERS)
145					fatal(0, "Too many users");
146				user[users++] = arg;
147			}
148		}
149	}
150	if (printer == NULL && (printer = getenv("PRINTER")) == NULL)
151		printer = DEFLP;
152
153	rmjob(printer);
154	exit(0);
155}
156
157static void
158usage(void)
159{
160	fprintf(stderr, "usage: lprm [-] [-Pprinter] [[job #] [user] ...]\n");
161	exit(2);
162}
163