1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
27/*	  All Rights Reserved  	*/
28
29
30/*
31 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
32 * Use is subject to license terms.
33 */
34
35#pragma ident	"%Z%%M%	%I%	%E% SMI"
36
37#include "stdio.h"
38#include "ctype.h"
39#include "errno.h"
40#include "sys/types.h"
41#include "sys/utsname.h"
42#include "string.h"
43
44#include "lp.h"
45#include "msgs.h"
46#include "access.h"
47#include "class.h"
48#include "printers.h"
49
50#define	WHO_AM_I	I_AM_LPADMIN
51#include "oam.h"
52
53#include "lpadmin.h"
54
55#include <locale.h>
56
57extern void		chkopts(),
58			chkopts2(),
59			chkopts3(),
60			exit();
61
62int			system_labeled = 0;
63
64int			scheduler_active = 0;
65
66char			*label = 0;
67
68PRINTER			*printer_pointer = 0;
69
70static CLASS		*class_pointer = 0;
71
72PWHEEL			*pwheel_pointer	= 0;
73char			*Local_System = 0;
74
75/**
76 ** main()
77 **/
78
79int
80main(int argc, char *argv[])
81{
82	struct utsname	un;
83
84	(void) setlocale (LC_ALL, "");
85
86#if !defined(TEXT_DOMAIN)
87#define TEXT_DOMAIN "SYS_TEST"
88#endif
89	(void) textdomain(TEXT_DOMAIN);
90
91	if (!is_user_admin()) {
92		LP_ERRMSG (ERROR, E_LP_NOTADM);
93		done (1);
94		/*NOTREACHED*/
95	}
96
97	system_labeled = is_system_labeled();
98
99	uname(&un);
100	Local_System = strdup(un.nodename);
101
102	options (argc, argv);	/* process command line options */
103
104	chkopts ();		/* check for legality of options */
105
106	startup ();		/* open path to Spooler */
107
108	if (d)
109		newdflt (d);	/* -d */
110
111	else if (x) {
112
113		/* allow "any" or "all" to do all destinations */
114		if (STREQU(NAME_ALL, x) || STREQU(NAME_ANY, x)) {
115
116			/*
117			 * Just deleting all the printers should get
118			 * rid of all the classes, too, but removing
119			 * the classes first should make things go a bit
120			 * faster.
121			 */
122
123			while ((class_pointer = getclass(NAME_ALL)))
124				rmdest (1, class_pointer->name);
125
126			if (errno != ENOENT) {
127				LP_ERRMSG1 (
128					ERROR,
129					E_ADM_GETCLASSES,
130					PERROR
131				);
132				done (1);
133				/*NOTREACHED*/
134			}
135
136			while ((printer_pointer = getprinter(NAME_ALL)))
137				rmdest (0, printer_pointer->name);
138
139			if (errno != ENOENT) {
140				LP_ERRMSG1 (
141					ERROR,
142					E_ADM_GETPRINTERS,
143					PERROR
144				);
145				done (1);
146				/*NOTREACHED*/
147			}
148
149		} else
150			rmdest (isclass(x), x);
151
152	} else if (!p && S) {
153		if (STREQU(*S, NAME_ALL) || STREQU(*S, NAME_ANY)) {
154			while ((pwheel_pointer = getpwheel(NAME_ALL))) {
155				*S = pwheel_pointer->name;
156				chkopts3 (0);
157				label = *S;
158				do_pwheel ();
159			}
160		} else {
161			label = 0;
162			do_pwheel ();
163		}
164
165#if	defined(J_OPTION)
166	} else if (j) {
167		do_fault ();	/* -j */
168#endif
169
170	} else {
171		/* allow "any" or "all" to do all printers */
172		if (STREQU(NAME_ALL, p) || STREQU(NAME_ANY, p)) {
173			int called=0;
174			while ((printer_pointer = getprinter(NAME_ALL)) != NULL) {
175				/*
176				 * "chkopts2()" will clobber "s".
177				 */
178				char *		save_s = s;
179
180				called++;
181				p = printer_pointer->name;
182				chkopts2 (0);
183
184				if (s)
185					if (
186						A || a || e || F || H
187					     || h || i || l || m || M
188					     || o || U || v
189					     || Q != -1 || W != -1
190					)
191						LP_ERRMSG1 (
192							WARNING,
193							E_ADM_SIGNORE,
194							p
195						);
196				label = p;
197				do_printer ();
198
199				s = save_s;
200			}
201			if (called == 0 )
202				LP_ERRMSG (ERROR, E_ADM_PLONELY);
203
204			if (errno != ENOENT) {
205				LP_ERRMSG2 (
206					ERROR,
207					E_LP_GETPRINTER,
208					NAME_ALL,
209					PERROR
210				);
211				done (1);
212				/*NOTREACHED*/
213			}
214		} else {
215			label = 0;
216			do_printer ();	/* -p etc. */
217		}
218	}
219	done (0);
220	/*NOTREACHED*/
221	return (0);
222}
223
224/**
225 ** putp() - FAKE ROUTINES TO AVOID REAL ONES
226 **/
227
228int			putp ()
229{
230	return (0);
231}
232