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