Home | History | Annotate | Download | only in lpadmin
      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 
     57 extern void		chkopts(),
     58 			chkopts2(),
     59 			chkopts3(),
     60 			exit();
     61 
     62 int			system_labeled = 0;
     63 
     64 int			scheduler_active = 0;
     65 
     66 char			*label = 0;
     67 
     68 PRINTER			*printer_pointer = 0;
     69 
     70 static CLASS		*class_pointer = 0;
     71 
     72 PWHEEL			*pwheel_pointer	= 0;
     73 char			*Local_System = 0;
     74 
     75 /**
     76  ** main()
     77  **/
     78 
     79 int
     80 main(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 
    228 int			putp ()
    229 {
    230 	return (0);
    231 }
    232