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, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright 1993 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30
31 #pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.9 */
32
33 #include "stdio.h"
34 #include "string.h"
35 #include "sys/types.h"
36
37 #include "lp.h"
38 #include "msgs.h"
39 #include "printers.h"
40 #include "form.h"
41 #include "access.h"
42
43 #define WHO_AM_I I_AM_LPADMIN
44 #include "oam.h"
45
46 #include "lpadmin.h"
47
48 extern FORM formbuf;
49
50 void mount_unmount();
51
52 short printer_status;
53
54 static char *cur_pwheel;
55 char *disable_reason,
56 *reject_reason;
57
58 static void inquire_printer_status();
59
60 /**
61 ** do_mount() - MOUNT/UNMOUNT A FORM/PRINT-WHEEL
62 **/
63
do_mount(printer,form,pwheel)64 void do_mount (printer, form, pwheel)
65 char *printer,
66 *form,
67 *pwheel;
68 {
69 /*
70 * Take care of unmounts, first.
71 */
72
73 if (form && STREQU(form, NAME_NONE))
74 form = "";
75 if (pwheel && (STREQU(pwheel, NAME_ANY) || STREQU(pwheel, NAME_NONE)))
76 pwheel = "";
77
78 if (form && !*form && a)
79 LP_ERRMSG (WARNING, E_ADM_UNALIGN);
80
81 if (form && !*form && pwheel && !*pwheel) {
82 mount_unmount (S_UNMOUNT, printer, NAME_NONE, NAME_ANY);
83 form = 0;
84 pwheel = 0;
85 } else if (form && !*form) {
86 mount_unmount (S_UNMOUNT, printer, NAME_NONE, "");
87 form = 0;
88 } else if (pwheel && !*pwheel) {
89 mount_unmount (S_UNMOUNT, printer, "", NAME_ANY);
90 pwheel = 0;
91 }
92
93 if (!form && !pwheel)
94 return;
95
96 /*
97 * See if the form will work on the printer. We do this even if
98 * the form has already been allowed, just in case the form has
99 * changed since then. Also, the check reads the form definition
100 * into a global that we can use for subsequent checks.
101 */
102 if (!s) { /* a local printer */
103
104 if (form && *form)
105 switch (verify_form(form)) {
106 case -1:
107 LP_ERRMSG (WARNING, E_ADM_BADMOUNT);
108 break;
109 case -2:
110 LP_ERRMSG1 (ERROR, E_ADM_MANDCHSET, formbuf.chset);
111 done (1);
112 }
113
114 /*
115 * Is the form allowed on the printer?
116 */
117 if (form && *form && !is_form_allowed_printer(form, printer))
118 LP_ERRMSG2 (WARNING, E_ADM_ICKFORM, form, printer);
119
120
121 /*
122 * Does the printer take print wheels?
123 * For us to be here, "daisy" must have been set.
124 * (-S requires knowing printer type (T), and knowing
125 * T caused call to "tidbit()" to set "daisy").
126 */
127 if (pwheel && *pwheel && !daisy) {
128 LP_ERRMSG (ERROR, E_ADM_NOPWHEEL);
129 done (1);
130 }
131
132 /*
133 * If the form requires a particular print wheel, make sure
134 * it is either mounted already, or is being mounted now.
135 */
136 if (form && *form) {
137 /*
138 * The printer status is also needed for "do_align()".
139 */
140 inquire_printer_status (printer);
141
142 /*
143 * The "!daisy" case was investigated in "verify_form()".
144 */
145 if (daisy && formbuf.mandatory && formbuf.chset)
146 if (!pwheel || !*pwheel) {
147 if (!STREQU(formbuf.chset, cur_pwheel))
148 LP_ERRMSG1 (
149 WARNING,
150 E_ADM_MANDPWHEEL1,
151 formbuf.chset
152 );
153 } else if (!STREQU(formbuf.chset, pwheel)) {
154 LP_ERRMSG1 (
155 WARNING,
156 E_ADM_MANDPWHEEL2,
157 formbuf.chset
158 );
159 }
160 }
161
162 /*
163 * Is the print wheel listed for this printer?
164 * The information that will tell us is either in the
165 * original info. we read in ("oldp->char_sets") if this
166 * is an existing printer, or--if this is a new printer--we
167 * don't have it (ambiguous -S options, mate!)
168 */
169 if (
170 pwheel
171 && *pwheel
172 && !(
173 oldp
174 && searchlist(pwheel, oldp->char_sets)
175 )
176 )
177 LP_ERRMSG2 (WARNING, E_ADM_ICKPWHEEL, pwheel, printer);
178
179 }
180
181 /*
182 * Do the mount with the printing of the alignment pattern,
183 * if required and possible. Otherwise, just mount the form
184 * (and print-wheel).
185 */
186 if (!a || !do_align(printer, form, pwheel))
187 mount_unmount (S_MOUNT, printer, NB(form), NB(pwheel));
188
189 return;
190 }
191
mount_unmount(type,printer,form,pwheel)192 void mount_unmount (type, printer, form, pwheel)
193 int type;
194 char *printer,
195 *form,
196 *pwheel;
197 {
198 int rc;
199
200 if (t) { /* tray specified */
201 type = (type == S_MOUNT ? S_MOUNT_TRAY : S_UNMOUNT_TRAY);
202 send_message(type, printer, form, pwheel, t);
203 } else
204 send_message(type, printer, form, pwheel);
205
206 rc = output(type + 1);
207
208 switch(rc) {
209
210 case MOK:
211 break;
212
213 case MNOMEDIA:
214 LP_ERRMSG (ERROR, E_ADM_NOMEDIA);
215 done (1);
216 /*NOTREACHED*/
217
218 case MNODEST:
219 LP_ERRMSG1 (ERROR, E_ADM_NODEST, printer);
220 done (1);
221 /*NOTREACHED*/
222
223 case MBUSY:
224 LP_ERRMSG (ERROR, E_ADM_MNTLATER);
225 done (1);
226 /*NOTREACHED*/
227
228 case MNOTRAY:
229 LP_ERRMSG (ERROR, E_ADM_BADTRAY);
230 done (1);
231 /*NOTREACHED*/
232
233 case MNOPERM: /* taken care of up front */
234 default:
235 LP_ERRMSG1 (ERROR, E_LP_BADSTATUS, rc);
236 done (1);
237 /*NOTREACHED*/
238
239 }
240 return;
241 }
242
243 void
do_max_trays(char * printer)244 do_max_trays(char *printer)
245 {
246 int rc;
247
248 if (t) /* tray specified */
249 send_message(S_MAX_TRAYS, printer, t);
250
251 rc = output(R_MAX_TRAYS);
252
253 switch(rc) {
254
255 case MOK:
256 break;
257
258 case MNOMEDIA:
259 LP_ERRMSG (ERROR, E_ADM_NOMEDIA);
260 done (1);
261 /*NOTREACHED*/
262
263 case MNODEST:
264 LP_ERRMSG1 (ERROR, E_ADM_NODEST, printer);
265 done (1);
266 /*NOTREACHED*/
267
268 case MBUSY:
269 LP_ERRMSG (ERROR, E_ADM_MNTLATER);
270 done (1);
271 /*NOTREACHED*/
272
273 case MNOTRAY:
274 LP_ERRMSG (ERROR, E_ADM_MAXTRAY);
275 done (1);
276 /*NOTREACHED*/
277
278 case MNOPERM: /* taken care of up front */
279 default:
280 LP_ERRMSG1 (ERROR, E_LP_BADSTATUS, rc);
281 done (1);
282 /*NOTREACHED*/
283
284 }
285 return;
286 }
287
288 /**
289 ** inquire_printer_status()
290 **/
291
inquire_printer_status(printer)292 static void inquire_printer_status (printer)
293 char *printer;
294 {
295 short status;
296
297 char *s_ignore,
298 buffer[MSGMAX];
299
300 long l_ignore;
301
302
303 send_message (S_INQUIRE_PRINTER_STATUS, printer);
304 if (mrecv(buffer, MSGMAX) != R_INQUIRE_PRINTER_STATUS) {
305 LP_ERRMSG (ERROR, E_LP_MRECV);
306 done (1);
307 }
308 (void)getmessage (
309 buffer,
310 R_INQUIRE_PRINTER_STATUS,
311 &status,
312 &s_ignore,
313 &s_ignore,
314 &cur_pwheel,
315 &disable_reason,
316 &reject_reason,
317 &printer_status,
318 &s_ignore,
319 &l_ignore,
320 &l_ignore
321 );
322
323 switch (status) {
324 case MOK:
325 disable_reason = strdup(disable_reason);
326 reject_reason = strdup(reject_reason);
327 cur_pwheel = strdup(cur_pwheel);
328 break;
329
330 case MNODEST:
331 LP_ERRMSG1 (ERROR, E_LP_PGONE, printer);
332 done (1);
333 }
334
335 return;
336 }
337