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