xref: /illumos-gate/usr/src/cmd/lp/cmd/lpsched/disptab.c (revision 4abb96737d15cd2d6530b0aa7b8404ec911ad940)
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 #pragma ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.5.1.4	*/
31 
32 # include	"dispatch.h"
33 #include <syslog.h>
34 
35 static void		r_H(),
36 			r_HS();
37 
38 static DISPATCH			dispatch_table[] = {
39 /* R_BAD_MESSAGE            */  0,			D_BADMSG,
40 /* S_NEW_QUEUE              */  0,			D_BADMSG,
41 /* R_NEW_QUEUE              */  0,			D_BADMSG,
42 /* S_ALLOC_FILES            */  s_alloc_files,		0,
43 /* R_ALLOC_FILES            */  0,			D_BADMSG,
44 /* S_PRINT_REQUEST          */  s_print_request,	0,
45 /* R_PRINT_REQUEST          */  0,			D_BADMSG,
46 /* S_START_CHANGE_REQUEST   */  s_start_change_request,	0,
47 /* R_START_CHANGE_REQUEST   */  0,			D_BADMSG,
48 /* S_END_CHANGE_REQUEST     */  s_end_change_request,	0,
49 /* R_END_CHANGE_REQUEST     */  0,			D_BADMSG,
50 /* S_CANCEL_REQUEST         */  s_cancel_request,	0,
51 /* R_CANCEL_REQUEST         */  0,			D_BADMSG,
52 /* S_INQUIRE_REQUEST        */  s_inquire_request,	0,
53 /* R_INQUIRE_REQUEST        */  0,                      D_BADMSG,
54 /* S_LOAD_PRINTER           */  s_load_printer,		D_ADMIN,
55 /* R_LOAD_PRINTER           */  r_H,                    D_BADMSG,
56 /* S_UNLOAD_PRINTER         */  s_unload_printer,	D_ADMIN,
57 /* R_UNLOAD_PRINTER         */  r_H,                    D_BADMSG,
58 /* S_INQUIRE_PRINTER_STATUS */  s_inquire_printer_status, 0,
59 /* R_INQUIRE_PRINTER_STATUS */  0,                      D_BADMSG,
60 /* S_LOAD_CLASS             */  s_load_class,		D_ADMIN,
61 /* R_LOAD_CLASS             */  r_H,                    D_BADMSG,
62 /* S_UNLOAD_CLASS           */  s_unload_class,		D_ADMIN,
63 /* R_UNLOAD_CLASS           */  r_H,                    D_BADMSG,
64 /* S_INQUIRE_CLASS          */  s_inquire_class,	0,
65 /* R_INQUIRE_CLASS          */  0,                      D_BADMSG,
66 /* S_MOUNT                  */  s_mount,		D_ADMIN,
67 /* R_MOUNT                  */  r_H,                    D_BADMSG,
68 /* S_UNMOUNT                */  s_unmount,		D_ADMIN,
69 /* R_UNMOUNT                */  r_H,                    D_BADMSG,
70 /* S_MOVE_REQUEST           */  s_move_request,		D_ADMIN,
71 /* R_MOVE_REQUEST           */  r_H,                    D_BADMSG,
72 /* S_MOVE_DEST              */  s_move_dest,		D_ADMIN,
73 /* R_MOVE_DEST              */  r_HS,                   D_BADMSG,
74 /* S_ACCEPT_DEST            */  s_accept_dest,		D_ADMIN,
75 /* R_ACCEPT_DEST            */  r_H,                    D_BADMSG,
76 /* S_REJECT_DEST            */  s_reject_dest,		D_ADMIN,
77 /* R_REJECT_DEST            */  r_H,                    D_BADMSG,
78 /* S_ENABLE_DEST            */  s_enable_dest,		D_ADMIN,
79 /* R_ENABLE_DEST            */  r_H,                    D_BADMSG,
80 /* S_DISABLE_DEST           */  s_disable_dest,		D_ADMIN,
81 /* R_DISABLE_DEST           */  r_HS,                   D_BADMSG,
82 /* S_LOAD_FILTER_TABLE      */  s_load_filter_table,	D_ADMIN,
83 /* R_LOAD_FILTER_TABLE      */  r_H,                    D_BADMSG,
84 /* S_UNLOAD_FILTER_TABLE    */  s_unload_filter_table,	D_ADMIN,
85 /* R_UNLOAD_FILTER_TABLE    */  r_H,                    D_BADMSG,
86 /* S_LOAD_PRINTWHEEL        */  s_load_printwheel,	D_ADMIN,
87 /* R_LOAD_PRINTWHEEL        */  r_H,                    D_BADMSG,
88 /* S_UNLOAD_PRINTWHEEL      */  s_unload_printwheel,	D_ADMIN,
89 /* R_UNLOAD_PRINTWHEEL      */  r_H,                    D_BADMSG,
90 /* S_LOAD_USER_FILE         */  s_load_user_file,	D_ADMIN,
91 /* R_LOAD_USER_FILE         */  r_H,                    D_BADMSG,
92 /* S_UNLOAD_USER_FILE       */  s_unload_user_file,	D_ADMIN,
93 /* R_UNLOAD_USER_FILE       */  r_H,                    D_BADMSG,
94 /* S_LOAD_FORM              */  s_load_form,		D_ADMIN,
95 /* R_LOAD_FORM              */  r_H,                    D_BADMSG,
96 /* S_UNLOAD_FORM            */  s_unload_form,		D_ADMIN,
97 /* R_UNLOAD_FORM            */  r_H,                    D_BADMSG,
98 /* S_GETSTATUS              */  0,			D_ADMIN,
99 /* R_GETSTATUS              */  0,                      D_BADMSG,
100 /* S_QUIET_ALERT            */  s_quiet_alert,		D_ADMIN,
101 /* R_QUIET_ALERT            */  r_H,                    D_BADMSG,
102 /* S_SEND_FAULT             */  s_send_fault,		0,
103 /* R_SEND_FAULT             */  0,                      D_BADMSG,
104 /* S_SHUTDOWN               */  s_shutdown,		D_ADMIN,
105 /* R_SHUTDOWN               */  r_H,                    D_BADMSG,
106 /* S_GOODBYE		    */	0,			D_BADMSG,
107 /* S_CHILD_DONE		    */	s_child_done,		0,
108 /* I_GET_TYPE		    */	0,			D_BADMSG,
109 /* I_QUEUE_CHK		    */	0,			D_BADMSG,
110 /* R_CONNECT		    */	0,			D_BADMSG,
111 /* S_GET_STATUS		    */	0,			D_BADMSG,
112 /* R_GET_STATUS		    */	0,			D_BADMSG,
113 /* S_INQUIRE_REQUEST_RANK   */	s_inquire_request_rank,	0,
114 /* R_INQUIRE_REQUEST_RANK   */	0,			D_BADMSG,
115 /* S_CANCEL		    */	s_cancel,		0,
116 /* R_CANCEL		    */	0,			D_BADMSG,
117 /* S_NEW_CHILD		    */	0,			D_BADMSG,
118 /* R_NEW_CHILD		    */	0,			D_BADMSG,
119 /* S_SEND_JOB		    */	0,			D_BADMSG,
120 /* R_SEND_JOB		    */	0,			D_BADMSG,
121 /* S_JOB_COMPLETED	    */	0,			D_BADMSG,
122 /* R_JOB_COMPLETED	    */	0,			D_BADMSG,
123 /* S_INQUIRE_REMOTE_PRINTER */	0,			D_BADMSG,
124 /* R_INQUIRE_REMOTE_PRINTER */	0,			D_BADMSG,
125 /* S_LOAD_SYSTEM            */  0,			D_BADMSG,
126 /* R_LOAD_SYSTEM            */  0,	                D_BADMSG,
127 /* S_UNLOAD_SYSTEM          */  0,			D_BADMSG,
128 /* R_UNLOAD_SYSTEM          */  0,	                D_BADMSG,
129 /* S_CLEAR_FAULT            */  s_clear_fault,		0,
130 /* R_CLEAR_FAULT            */  0,                      D_BADMSG,
131 /* S_MOUNT_TRAY             */  s_mount_tray,		D_ADMIN,
132 /* R_MOUNT_TRAY             */  r_H,                    D_BADMSG,
133 /* S_UNMOUNT_TRAY           */  s_unmount_tray,		D_ADMIN,
134 /* R_UNMOUNT_TRAY           */  r_H,                    D_BADMSG,
135 /* S_MAX_TRAYS              */  s_max_trays,		D_ADMIN,
136 /* R_MAX_TRAYS              */  r_H,                    D_BADMSG,
137 /* S_PAPER_CHANGED          */  s_paper_changed,	0,
138 /* R_PAPER_CHANGED          */  0,			D_BADMSG,
139 /* S_PAPER_ALLOWED          */  s_paper_allowed,	0,
140 /* R_PAPER_ALLOWED          */  0,			D_BADMSG,
141 /* S_PASS_PEER_CONNECTION   */  s_pass_peer_connection,	0,
142 /* R_PASS_PEER_CONNECTION   */  0,			D_BADMSG,
143 };
144 
145 static char *			dispatch_names[] = {
146 "R_BAD_MESSAGE",
147 "S_NEW_QUEUE",
148 "R_NEW_QUEUE",
149 "S_ALLOC_FILES",
150 "R_ALLOC_FILES",
151 "S_PRINT_REQUEST",
152 "R_PRINT_REQUEST",
153 "S_START_CHANGE_REQUEST",
154 "R_START_CHANGE_REQUEST",
155 "S_END_CHANGE_REQUEST",
156 "R_END_CHANGE_REQUEST",
157 "S_CANCEL_REQUEST",
158 "R_CANCEL_REQUEST",
159 "S_INQUIRE_REQUEST",
160 "R_INQUIRE_REQUEST",
161 "S_LOAD_PRINTER",
162 "R_LOAD_PRINTER",
163 "S_UNLOAD_PRINTER",
164 "R_UNLOAD_PRINTER",
165 "S_INQUIRE_PRINTER_STATUS",
166 "R_INQUIRE_PRINTER_STATUS",
167 "S_LOAD_CLASS",
168 "R_LOAD_CLASS",
169 "S_UNLOAD_CLASS",
170 "R_UNLOAD_CLASS",
171 "S_INQUIRE_CLASS",
172 "R_INQUIRE_CLASS",
173 "S_MOUNT",
174 "R_MOUNT",
175 "S_UNMOUNT",
176 "R_UNMOUNT",
177 "S_MOVE_REQUEST",
178 "R_MOVE_REQUEST",
179 "S_MOVE_DEST",
180 "R_MOVE_DEST",
181 "S_ACCEPT_DEST",
182 "R_ACCEPT_DEST",
183 "S_REJECT_DEST",
184 "R_REJECT_DEST",
185 "S_ENABLE_DEST",
186 "R_ENABLE_DEST",
187 "S_DISABLE_DEST",
188 "R_DISABLE_DEST",
189 "S_LOAD_FILTER_TABLE",
190 "R_LOAD_FILTER_TABLE",
191 "S_UNLOAD_FILTER_TABLE",
192 "R_UNLOAD_FILTER_TABLE",
193 "S_LOAD_PRINTWHEEL",
194 "R_LOAD_PRINTWHEEL",
195 "S_UNLOAD_PRINTWHEEL",
196 "R_UNLOAD_PRINTWHEEL",
197 "S_LOAD_USER_FILE",
198 "R_LOAD_USER_FILE",
199 "S_UNLOAD_USER_FILE",
200 "R_UNLOAD_USER_FILE",
201 "S_LOAD_FORM",
202 "R_LOAD_FORM",
203 "S_UNLOAD_FORM",
204 "R_UNLOAD_FORM",
205 "S_GETSTATUS",
206 "R_GETSTATUS",
207 "S_QUIET_ALERT",
208 "R_QUIET_ALERT",
209 "S_SEND_FAULT",
210 "R_SEND_FAULT",
211 "S_SHUTDOWN",
212 "R_SHUTDOWN",
213 "S_GOODBYE",
214 "S_CHILD_DONE",
215 "I_GET_TYPE",
216 "I_QUEUE_CHK",
217 "R_CONNECT",
218 "S_GET_STATUS",
219 "R_GET_STATUS",
220 "S_INQUIRE_REQUEST_RANK",
221 "R_INQUIRE_REQUEST_RANK",
222 "S_CANCEL",
223 "R_CANCEL",
224 "S_NEW_CHILD",
225 "R_NEW_CHILD",
226 "S_SEND_JOB",
227 "R_SEND_JOB",
228 "S_JOB_COMPLETED",
229 "R_JOB_COMPLETED",
230 "S_INQUIRE_REMOTE_PRINTER",
231 "R_INQUIRE_REMOTE_PRINTER",
232 "S_LOAD_SYSTEM",
233 "R_LOAD_SYSTEM",
234 "S_UNLOAD_SYSTEM",
235 "R_UNLOAD_SYSTEM",
236 "S_CLEAR_FAULT",
237 "R_CLEAR_FAULT",
238 "S_MOUNT_TRAY",
239 "R_MOUNT_TRAY",
240 "S_UNMOUNT_TRAY",
241 "R_UNMOUNT_TRAY",
242 "S_MAX_TRAYS",
243 "R_MAX_TRAYS",
244 "S_PAPER_CHANGED",
245 "R_PAPER_CHANGED",
246 "S_PAPER_ALLOWED",
247 "R_PAPER_ALLOWED",
248 "S_PASS_PEER_CONNECTION",
249 "R_PASS_PEER_CONNECTION",
250 };
251 
252 /* see include/msgs.h */
253 static char *			status_names[] = {
254 "MOK",
255 "MOKMORE",
256 "MOKREMOTE",
257 "MMORERR",
258 "MNODEST",
259 "MERRDEST",
260 "MDENYDEST",
261 "MNOMEDIA",
262 "MDENYMEDIA",
263 "MNOFILTER",
264 "MNOINFO",
265 "MNOMEM",
266 "MNOMOUNT",
267 "MNOOPEN",
268 "MNOPERM",
269 "MNOSTART",
270 "MUNKNOWN",
271 "M2LATE",
272 "MNOSPACE",
273 "MBUSY",
274 "MTRANSMITERR",
275 "MNOMORE",
276 "MGONEREMOTE",
277 "MNOTRAY"
278 };
279 
280 #define LAST_STATUS 23
281 
282 /**
283  ** dispatchName() - ROUTINE TO GIVE ASCII DISPATCH NAME
284  **/
285 
286 char *
287 dispatchName(int type)
288 {
289 	if (type <= 0 || type > LAST_MESSAGE)
290 		type = 0;
291 	return (dispatch_names[type]);
292 }
293 
294 char *
295 statusName(int status)
296 {
297 	if (status < 0 || status > LAST_STATUS)
298 		return ("unknown");
299 	return (status_names[status]);
300 }
301 
302 /**
303  ** dispatch() - DISPATCH A ROUTINE TO HANDLE A MESSAGE
304  **/
305 
306 void
307 dispatch(int type, char *m, MESG *md)
308 {
309 	register DISPATCH	*pd	= &dispatch_table[type];
310 
311 	syslog(LOG_DEBUG, "dispatch %s\n", dispatchName(type));
312 
313 	if (type <= 0 || type > LAST_MESSAGE || pd->fncp == NULL)
314 		mputm (md, R_BAD_MESSAGE);
315 
316 	else if (!pd->fncp || pd->flags & D_BADMSG)
317 		mputm (md, R_BAD_MESSAGE);
318 
319 	else if (pd->flags & D_ADMIN && !md->admin)
320 		if ((++pd)->fncp)
321 			(*pd->fncp) (md, type+1);
322 		else
323 			mputm (md, R_BAD_MESSAGE);
324 
325 	else if (pd->flags & D_SYSTEM && md->type != MD_CHILD &&
326 		md->type != MD_BOUND)
327 		if ((++pd)->fncp)
328 			(*pd->fncp) (md, type+1);
329 		else
330 			mputm (md, R_BAD_MESSAGE);
331 
332 	else
333 		(*pd->fncp) (m, md);
334 }
335 
336 /**
337  ** r_H() - SEND MNOPERM RESPONSE MESSAGE
338  ** r_HS() - SEND MNOPERM RESPONSE MESSAGE
339  **/
340 
341 static void
342 r_H(MESG *md, int type)
343 {
344 	mputm (md, type, MNOPERM);
345 	return;
346 }
347 
348 static void
349 r_HS(MESG *md, int type)
350 {
351 	mputm (md, type, MNOPERM, "");
352 	return;
353 }
354