#include "dispatch.h"
#include <syslog.h>
static void r_H(),
r_HS();
static DISPATCH dispatch_table[] = {
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
s_alloc_files, 0,
0, D_BADMSG,
s_print_request, 0,
0, D_BADMSG,
s_start_change_request, 0,
0, D_BADMSG,
s_end_change_request, 0,
0, D_BADMSG,
s_cancel_request, 0,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
s_load_printer, D_ADMIN,
r_H, D_BADMSG,
s_unload_printer, D_ADMIN,
r_H, D_BADMSG,
s_inquire_printer_status, 0,
0, D_BADMSG,
s_load_class, D_ADMIN,
r_H, D_BADMSG,
s_unload_class, D_ADMIN,
r_H, D_BADMSG,
s_inquire_class, 0,
0, D_BADMSG,
s_mount, D_ADMIN,
r_H, D_BADMSG,
s_unmount, D_ADMIN,
r_H, D_BADMSG,
s_move_request, D_ADMIN,
r_H, D_BADMSG,
s_move_dest, D_ADMIN,
r_HS, D_BADMSG,
s_accept_dest, D_ADMIN,
r_H, D_BADMSG,
s_reject_dest, D_ADMIN,
r_H, D_BADMSG,
s_enable_dest, D_ADMIN,
r_H, D_BADMSG,
s_disable_dest, D_ADMIN,
r_HS, D_BADMSG,
s_load_filter_table, D_ADMIN,
r_H, D_BADMSG,
s_unload_filter_table, D_ADMIN,
r_H, D_BADMSG,
s_load_printwheel, D_ADMIN,
r_H, D_BADMSG,
s_unload_printwheel, D_ADMIN,
r_H, D_BADMSG,
s_load_user_file, D_ADMIN,
r_H, D_BADMSG,
s_unload_user_file, D_ADMIN,
r_H, D_BADMSG,
s_load_form, D_ADMIN,
r_H, D_BADMSG,
s_unload_form, D_ADMIN,
r_H, D_BADMSG,
0, D_ADMIN,
0, D_BADMSG,
s_quiet_alert, D_ADMIN,
r_H, D_BADMSG,
s_send_fault, 0,
0, D_BADMSG,
s_shutdown, D_ADMIN,
r_H, D_BADMSG,
0, D_BADMSG,
s_child_done, 0,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
s_inquire_request_rank, 0,
0, D_BADMSG,
s_cancel, 0,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
0, D_BADMSG,
s_clear_fault, 0,
0, D_BADMSG,
s_mount_tray, D_ADMIN,
r_H, D_BADMSG,
s_unmount_tray, D_ADMIN,
r_H, D_BADMSG,
s_max_trays, D_ADMIN,
r_H, D_BADMSG,
s_paper_changed, 0,
0, D_BADMSG,
s_paper_allowed, 0,
0, D_BADMSG,
s_pass_peer_connection, 0,
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",
};
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
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]);
}
void
dispatch(int type, char *m, MESG *md)
{
register DISPATCH *pd = &dispatch_table[type];
syslog(LOG_DEBUG, "dispatch(%s, %s, 0x%8.8x)",
dispatchName(type), m, md);
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);
}
static void
r_H(MESG *md, int type)
{
mputm(md, type, MNOPERM);
}
static void
r_HS(MESG *md, int type)
{
mputm(md, type, MNOPERM, "");
}