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