| /* |
| * CDDL HEADER START |
| * |
| * The contents of this file are subject to the terms of the |
| * Common Development and Distribution License (the "License"). |
| * You may not use this file except in compliance with the License. |
| * |
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
| * or http://www.opensolaris.org/os/licensing. |
| * See the License for the specific language governing permissions |
| * and limitations under the License. |
| * |
| * When distributing Covered Code, include this CDDL HEADER in each |
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
| * If applicable, add the following below this CDDL HEADER, with the |
| * fields enclosed by brackets "[]" replaced with your own identifying |
| * information: Portions Copyright [yyyy] [name of copyright owner] |
| * |
| * CDDL HEADER END |
| */ |
| /* |
| * Copyright 2006 Sun Microsystems, Inc. All rights reserved. |
| * Use is subject to license terms. |
| */ |
| |
| /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ |
| /* All Rights Reserved */ |
| |
| |
| #pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.5.1.4 */ |
| |
| # include "dispatch.h" |
| #include <syslog.h> |
| |
| static void r_H(), |
| r_HS(); |
| |
| static DISPATCH dispatch_table[] = { |
| /* R_BAD_MESSAGE */ 0, D_BADMSG, |
| /* S_NEW_QUEUE */ 0, D_BADMSG, |
| /* R_NEW_QUEUE */ 0, D_BADMSG, |
| /* S_ALLOC_FILES */ s_alloc_files, 0, |
| /* R_ALLOC_FILES */ 0, D_BADMSG, |
| /* S_PRINT_REQUEST */ s_print_request, 0, |
| /* R_PRINT_REQUEST */ 0, D_BADMSG, |
| /* S_START_CHANGE_REQUEST */ s_start_change_request, 0, |
| /* R_START_CHANGE_REQUEST */ 0, D_BADMSG, |
| /* S_END_CHANGE_REQUEST */ s_end_change_request, 0, |
| /* R_END_CHANGE_REQUEST */ 0, D_BADMSG, |
| /* S_CANCEL_REQUEST */ s_cancel_request, 0, |
| /* R_CANCEL_REQUEST */ 0, D_BADMSG, |
| /* S_INQUIRE_REQUEST */ s_inquire_request, 0, |
| /* R_INQUIRE_REQUEST */ 0, D_BADMSG, |
| /* S_LOAD_PRINTER */ s_load_printer, D_ADMIN, |
| /* R_LOAD_PRINTER */ r_H, D_BADMSG, |
| /* S_UNLOAD_PRINTER */ s_unload_printer, D_ADMIN, |
| /* R_UNLOAD_PRINTER */ r_H, D_BADMSG, |
| /* S_INQUIRE_PRINTER_STATUS */ s_inquire_printer_status, 0, |
| /* R_INQUIRE_PRINTER_STATUS */ 0, D_BADMSG, |
| /* S_LOAD_CLASS */ s_load_class, D_ADMIN, |
| /* R_LOAD_CLASS */ r_H, D_BADMSG, |
| /* S_UNLOAD_CLASS */ s_unload_class, D_ADMIN, |
| /* R_UNLOAD_CLASS */ r_H, D_BADMSG, |
| /* S_INQUIRE_CLASS */ s_inquire_class, 0, |
| /* R_INQUIRE_CLASS */ 0, D_BADMSG, |
| /* S_MOUNT */ s_mount, D_ADMIN, |
| /* R_MOUNT */ r_H, D_BADMSG, |
| /* S_UNMOUNT */ s_unmount, D_ADMIN, |
| /* R_UNMOUNT */ r_H, D_BADMSG, |
| /* S_MOVE_REQUEST */ s_move_request, D_ADMIN, |
| /* R_MOVE_REQUEST */ r_H, D_BADMSG, |
| /* S_MOVE_DEST */ s_move_dest, D_ADMIN, |
| /* R_MOVE_DEST */ r_HS, D_BADMSG, |
| /* S_ACCEPT_DEST */ s_accept_dest, D_ADMIN, |
| /* R_ACCEPT_DEST */ r_H, D_BADMSG, |
| /* S_REJECT_DEST */ s_reject_dest, D_ADMIN, |
| /* R_REJECT_DEST */ r_H, D_BADMSG, |
| /* S_ENABLE_DEST */ s_enable_dest, D_ADMIN, |
| /* R_ENABLE_DEST */ r_H, D_BADMSG, |
| /* S_DISABLE_DEST */ s_disable_dest, D_ADMIN, |
| /* R_DISABLE_DEST */ r_HS, D_BADMSG, |
| /* S_LOAD_FILTER_TABLE */ s_load_filter_table, D_ADMIN, |
| /* R_LOAD_FILTER_TABLE */ r_H, D_BADMSG, |
| /* S_UNLOAD_FILTER_TABLE */ s_unload_filter_table, D_ADMIN, |
| /* R_UNLOAD_FILTER_TABLE */ r_H, D_BADMSG, |
| /* S_LOAD_PRINTWHEEL */ s_load_printwheel, D_ADMIN, |
| /* R_LOAD_PRINTWHEEL */ r_H, D_BADMSG, |
| /* S_UNLOAD_PRINTWHEEL */ s_unload_printwheel, D_ADMIN, |
| /* R_UNLOAD_PRINTWHEEL */ r_H, D_BADMSG, |
| /* S_LOAD_USER_FILE */ s_load_user_file, D_ADMIN, |
| /* R_LOAD_USER_FILE */ r_H, D_BADMSG, |
| /* S_UNLOAD_USER_FILE */ s_unload_user_file, D_ADMIN, |
| /* R_UNLOAD_USER_FILE */ r_H, D_BADMSG, |
| /* S_LOAD_FORM */ s_load_form, D_ADMIN, |
| /* R_LOAD_FORM */ r_H, D_BADMSG, |
| /* S_UNLOAD_FORM */ s_unload_form, D_ADMIN, |
| /* R_UNLOAD_FORM */ r_H, D_BADMSG, |
| /* S_GETSTATUS */ 0, D_ADMIN, |
| /* R_GETSTATUS */ 0, D_BADMSG, |
| /* S_QUIET_ALERT */ s_quiet_alert, D_ADMIN, |
| /* R_QUIET_ALERT */ r_H, D_BADMSG, |
| /* S_SEND_FAULT */ s_send_fault, 0, |
| /* R_SEND_FAULT */ 0, D_BADMSG, |
| /* S_SHUTDOWN */ s_shutdown, D_ADMIN, |
| /* R_SHUTDOWN */ r_H, D_BADMSG, |
| /* S_GOODBYE */ 0, D_BADMSG, |
| /* S_CHILD_DONE */ s_child_done, 0, |
| /* I_GET_TYPE */ 0, D_BADMSG, |
| /* I_QUEUE_CHK */ 0, D_BADMSG, |
| /* R_CONNECT */ 0, D_BADMSG, |
| /* S_GET_STATUS */ 0, D_BADMSG, |
| /* R_GET_STATUS */ 0, D_BADMSG, |
| /* S_INQUIRE_REQUEST_RANK */ s_inquire_request_rank, 0, |
| /* R_INQUIRE_REQUEST_RANK */ 0, D_BADMSG, |
| /* S_CANCEL */ s_cancel, 0, |
| /* R_CANCEL */ 0, D_BADMSG, |
| /* S_NEW_CHILD */ 0, D_BADMSG, |
| /* R_NEW_CHILD */ 0, D_BADMSG, |
| /* S_SEND_JOB */ 0, D_BADMSG, |
| /* R_SEND_JOB */ 0, D_BADMSG, |
| /* S_JOB_COMPLETED */ 0, D_BADMSG, |
| /* R_JOB_COMPLETED */ 0, D_BADMSG, |
| /* S_INQUIRE_REMOTE_PRINTER */ 0, D_BADMSG, |
| /* R_INQUIRE_REMOTE_PRINTER */ 0, D_BADMSG, |
| /* S_LOAD_SYSTEM */ 0, D_BADMSG, |
| /* R_LOAD_SYSTEM */ 0, D_BADMSG, |
| /* S_UNLOAD_SYSTEM */ 0, D_BADMSG, |
| /* R_UNLOAD_SYSTEM */ 0, D_BADMSG, |
| /* S_CLEAR_FAULT */ s_clear_fault, 0, |
| /* R_CLEAR_FAULT */ 0, D_BADMSG, |
| /* S_MOUNT_TRAY */ s_mount_tray, D_ADMIN, |
| /* R_MOUNT_TRAY */ r_H, D_BADMSG, |
| /* S_UNMOUNT_TRAY */ s_unmount_tray, D_ADMIN, |
| /* R_UNMOUNT_TRAY */ r_H, D_BADMSG, |
| /* S_MAX_TRAYS */ s_max_trays, D_ADMIN, |
| /* R_MAX_TRAYS */ r_H, D_BADMSG, |
| /* S_PAPER_CHANGED */ s_paper_changed, 0, |
| /* R_PAPER_CHANGED */ 0, D_BADMSG, |
| /* S_PAPER_ALLOWED */ s_paper_allowed, 0, |
| /* R_PAPER_ALLOWED */ 0, D_BADMSG, |
| /* S_PASS_PEER_CONNECTION */ s_pass_peer_connection, 0, |
| /* R_PASS_PEER_CONNECTION */ 0, D_BADMSG, |
| }; |
| |
| static char * dispatch_names[] = { |
| "R_BAD_MESSAGE", |
| "S_NEW_QUEUE", |
| "R_NEW_QUEUE", |
| "S_ALLOC_FILES", |
| "R_ALLOC_FILES", |
| "S_PRINT_REQUEST", |
| "R_PRINT_REQUEST", |
| "S_START_CHANGE_REQUEST", |
| "R_START_CHANGE_REQUEST", |
| "S_END_CHANGE_REQUEST", |
| "R_END_CHANGE_REQUEST", |
| "S_CANCEL_REQUEST", |
| "R_CANCEL_REQUEST", |
| "S_INQUIRE_REQUEST", |
| "R_INQUIRE_REQUEST", |
| "S_LOAD_PRINTER", |
| "R_LOAD_PRINTER", |
| "S_UNLOAD_PRINTER", |
| "R_UNLOAD_PRINTER", |
| "S_INQUIRE_PRINTER_STATUS", |
| "R_INQUIRE_PRINTER_STATUS", |
| "S_LOAD_CLASS", |
| "R_LOAD_CLASS", |
| "S_UNLOAD_CLASS", |
| "R_UNLOAD_CLASS", |
| "S_INQUIRE_CLASS", |
| "R_INQUIRE_CLASS", |
| "S_MOUNT", |
| "R_MOUNT", |
| "S_UNMOUNT", |
| "R_UNMOUNT", |
| "S_MOVE_REQUEST", |
| "R_MOVE_REQUEST", |
| "S_MOVE_DEST", |
| "R_MOVE_DEST", |
| "S_ACCEPT_DEST", |
| "R_ACCEPT_DEST", |
| "S_REJECT_DEST", |
| "R_REJECT_DEST", |
| "S_ENABLE_DEST", |
| "R_ENABLE_DEST", |
| "S_DISABLE_DEST", |
| "R_DISABLE_DEST", |
| "S_LOAD_FILTER_TABLE", |
| "R_LOAD_FILTER_TABLE", |
| "S_UNLOAD_FILTER_TABLE", |
| "R_UNLOAD_FILTER_TABLE", |
| "S_LOAD_PRINTWHEEL", |
| "R_LOAD_PRINTWHEEL", |
| "S_UNLOAD_PRINTWHEEL", |
| "R_UNLOAD_PRINTWHEEL", |
| "S_LOAD_USER_FILE", |
| "R_LOAD_USER_FILE", |
| "S_UNLOAD_USER_FILE", |
| "R_UNLOAD_USER_FILE", |
| "S_LOAD_FORM", |
| "R_LOAD_FORM", |
| "S_UNLOAD_FORM", |
| "R_UNLOAD_FORM", |
| "S_GETSTATUS", |
| "R_GETSTATUS", |
| "S_QUIET_ALERT", |
| "R_QUIET_ALERT", |
| "S_SEND_FAULT", |
| "R_SEND_FAULT", |
| "S_SHUTDOWN", |
| "R_SHUTDOWN", |
| "S_GOODBYE", |
| "S_CHILD_DONE", |
| "I_GET_TYPE", |
| "I_QUEUE_CHK", |
| "R_CONNECT", |
| "S_GET_STATUS", |
| "R_GET_STATUS", |
| "S_INQUIRE_REQUEST_RANK", |
| "R_INQUIRE_REQUEST_RANK", |
| "S_CANCEL", |
| "R_CANCEL", |
| "S_NEW_CHILD", |
| "R_NEW_CHILD", |
| "S_SEND_JOB", |
| "R_SEND_JOB", |
| "S_JOB_COMPLETED", |
| "R_JOB_COMPLETED", |
| "S_INQUIRE_REMOTE_PRINTER", |
| "R_INQUIRE_REMOTE_PRINTER", |
| "S_LOAD_SYSTEM", |
| "R_LOAD_SYSTEM", |
| "S_UNLOAD_SYSTEM", |
| "R_UNLOAD_SYSTEM", |
| "S_CLEAR_FAULT", |
| "R_CLEAR_FAULT", |
| "S_MOUNT_TRAY", |
| "R_MOUNT_TRAY", |
| "S_UNMOUNT_TRAY", |
| "R_UNMOUNT_TRAY", |
| "S_MAX_TRAYS", |
| "R_MAX_TRAYS", |
| "S_PAPER_CHANGED", |
| "R_PAPER_CHANGED", |
| "S_PAPER_ALLOWED", |
| "R_PAPER_ALLOWED", |
| "S_PASS_PEER_CONNECTION", |
| "R_PASS_PEER_CONNECTION", |
| }; |
| |
| /* see include/msgs.h */ |
| static char * status_names[] = { |
| "MOK", |
| "MOKMORE", |
| "MOKREMOTE", |
| "MMORERR", |
| "MNODEST", |
| "MERRDEST", |
| "MDENYDEST", |
| "MNOMEDIA", |
| "MDENYMEDIA", |
| "MNOFILTER", |
| "MNOINFO", |
| "MNOMEM", |
| "MNOMOUNT", |
| "MNOOPEN", |
| "MNOPERM", |
| "MNOSTART", |
| "MUNKNOWN", |
| "M2LATE", |
| "MNOSPACE", |
| "MBUSY", |
| "MTRANSMITERR", |
| "MNOMORE", |
| "MGONEREMOTE", |
| "MNOTRAY" |
| }; |
| |
| #define LAST_STATUS 23 |
| |
| /** |
| ** dispatchName() - ROUTINE TO GIVE ASCII DISPATCH NAME |
| **/ |
| |
| char * |
| dispatchName(int type) |
| { |
| if (type <= 0 || type > LAST_MESSAGE) |
| type = 0; |
| return (dispatch_names[type]); |
| } |
| |
| char * |
| statusName(int status) |
| { |
| if (status < 0 || status > LAST_STATUS) |
| return ("unknown"); |
| return (status_names[status]); |
| } |
| |
| /** |
| ** dispatch() - DISPATCH A ROUTINE TO HANDLE A MESSAGE |
| **/ |
| |
| void |
| dispatch(int type, char *m, MESG *md) |
| { |
| register DISPATCH *pd = &dispatch_table[type]; |
| |
| syslog(LOG_DEBUG, "dispatch %s\n", dispatchName(type)); |
| |
| if (type <= 0 || type > LAST_MESSAGE || pd->fncp == NULL) |
| mputm (md, R_BAD_MESSAGE); |
| |
| else if (!pd->fncp || pd->flags & D_BADMSG) |
| mputm (md, R_BAD_MESSAGE); |
| |
| else if (pd->flags & D_ADMIN && !md->admin) |
| if ((++pd)->fncp) |
| (*pd->fncp) (md, type+1); |
| else |
| mputm (md, R_BAD_MESSAGE); |
| |
| else if (pd->flags & D_SYSTEM && md->type != MD_CHILD && |
| md->type != MD_BOUND) |
| if ((++pd)->fncp) |
| (*pd->fncp) (md, type+1); |
| else |
| mputm (md, R_BAD_MESSAGE); |
| |
| else |
| (*pd->fncp) (m, md); |
| } |
| |
| /** |
| ** r_H() - SEND MNOPERM RESPONSE MESSAGE |
| ** r_HS() - SEND MNOPERM RESPONSE MESSAGE |
| **/ |
| |
| static void |
| r_H(MESG *md, int type) |
| { |
| mputm (md, type, MNOPERM); |
| return; |
| } |
| |
| static void |
| r_HS(MESG *md, int type) |
| { |
| mputm (md, type, MNOPERM, ""); |
| return; |
| } |