xref: /illumos-gate/usr/src/cmd/lp/cmd/lpadmin/do_mount.c (revision 3ce5372277f4657ad0e52d36c979527c4ca22de2)
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 
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 
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
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 
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