#include "dispatch.h"
#include <syslog.h>
void
remount_form(register PSTATUS *pps, FSTATUS *pfs, short trayNum)
{
trayNum--;
if (pps->forms && (pps->forms[trayNum].form == pfs)) {
pps->forms[trayNum].isAvailable = (pfs ? 1 : 0);
return;
} else if ((!pps->forms) && (!pfs)) {
return;
}
if (pps->forms && pps->forms[trayNum].form) {
register FSTATUS *Opfs = pps->forms[trayNum].form;
pps->forms[trayNum].form = 0;
pps->forms[trayNum].isAvailable = 1;
Opfs->mounted--;
form_in_question = Opfs;
(void)queue_repel (pps, 0, qchk_form);
check_form_alert (Opfs, (_FORM *)0);
}
if (pfs) {
syslog(LOG_DEBUG, "remount_form add %x(%s) to tray %d\n",
pfs, (pfs ? pfs->form->name : "NULL"), trayNum);
if (pps && !pps->forms) {
pps->forms = (PFSTATUS *)calloc((trayNum +1),
sizeof(PFSTATUS));
pps->numForms = trayNum + 1;
}
if (pps && pps->forms && (pps->numForms > trayNum)) {
pps->forms[trayNum].form = pfs;
pps->forms[trayNum].isAvailable = 1;
pfs->mounted++;
} else {
return;
}
if (pfs->requests) {
form_in_question = pfs;
queue_attract (pps, qchk_form, 0);
check_form_alert (pfs, (_FORM *)0);
}
} else {
form_in_question = 0;
queue_attract (pps, qchk_form, 1);
}
dump_pstatus ();
return;
}
static void
remount_pwheel(register PSTATUS *pps, char *pwheel_name)
{
PWSTATUS *ppws;
if (SAME(pps->pwheel_name, pwheel_name))
return;
if (pps->pwheel_name) {
register PWSTATUS *Oppws = pps->pwheel;
pps->pwheel = 0;
if (Oppws)
Oppws->mounted--;
pwheel_in_question = pps->pwheel_name;
(void)queue_repel (pps, 0, qchk_pwheel);
unload_str (&pps->pwheel_name);
if (Oppws)
check_pwheel_alert (Oppws, (PWHEEL *)0);
}
if (pwheel_name) {
load_str (&pps->pwheel_name, pwheel_name);
if (ppws = search_pwstatus(pwheel_name)) {
pps->pwheel = ppws;
ppws->mounted++;
if (ppws->requests) {
pwheel_in_question = pwheel_name;
queue_attract (pps, qchk_pwheel, 0);
check_pwheel_alert (ppws, (PWHEEL *)0);
}
} else {
pwheel_in_question = pwheel_name;
queue_attract (pps, qchk_pwheel, 1);
}
} else {
pwheel_in_question = 0;
queue_attract (pps, qchk_pwheel, 1);
}
dump_pstatus ();
return;
}
#define MAX_TRAYS 100
void
s_max_trays(char *m, MESG *md)
{
char *printer;
ushort status;
short numTrays;
register PSTATUS *pps;
register PFSTATUS *ppfs;
(void) getmessage(m, S_MAX_TRAYS, &printer, &numTrays);
syslog(LOG_DEBUG, "s_max_trays(%s, %d)", (printer ? printer : "NULL"),
numTrays);
if (!*printer || !(pps = search_pstatus(printer)))
status = MNODEST;
else if ((numTrays <=0) || (numTrays > MAX_TRAYS))
status = MNOTRAY;
else if (pps->request)
status = MBUSY;
else if (pps->forms) {
if (!(ppfs = Realloc(pps->forms,numTrays * sizeof(PFSTATUS))))
status = MNOMEM;
else {
int i;
for (i = pps->numForms; i < numTrays; i++) {
ppfs[i].form = NULL;
ppfs[i].isAvailable = 1;
}
pps->forms = ppfs;
pps->numForms = numTrays;
status = MOK;
}
} else if (!(ppfs = Calloc(numTrays,sizeof(PFSTATUS)))) {
status = MNOMEM;
} else {
pps->forms = ppfs;
pps->numForms = numTrays;
status = MOK;
}
dump_pstatus();
mputm(md, R_MAX_TRAYS, status);
}
void
s_mount(char *m, MESG *md)
{
char *printer, *form, *pwheel_name;
ushort status;
register PSTATUS *pps;
register FSTATUS *pfs;
(void) getmessage(m, S_MOUNT, &printer, &form, &pwheel_name);
syslog(LOG_DEBUG, "s_mount(%s, %s, %s)", (printer ? printer : "NULL"),
(form ? form : "NULL"), (pwheel_name ? pwheel_name : "NULL"));
if (!*form && !*pwheel_name)
status = MNOMEDIA;
else if (!*printer || !(pps = search_pstatus(printer)))
status = MNODEST;
else if (*form && !(pfs = search_fstatus(form)))
status = MNOMEDIA;
else if (pps->request)
status = MBUSY;
else {
if (*form)
remount_form (pps, pfs,1);
if (*pwheel_name)
remount_pwheel(pps, pwheel_name);
status = MOK;
}
mputm(md, R_MOUNT, status);
}
void
s_mount_tray(char *m, MESG *md)
{
char *printer, *form, *pwheel_name;
ushort status;
short trayNum;
register PSTATUS *pps;
register FSTATUS *pfs;
(void) getmessage(m, S_MOUNT_TRAY, &printer, &form, &pwheel_name,
&trayNum);
syslog(LOG_DEBUG, "s_mount_tray(%s, %s, %s, %d)",
(printer ? printer : "NULL"), (form ? form : "NULL"),
(pwheel_name ? pwheel_name : "NULL"), trayNum);
if (!*form && !*pwheel_name)
status = MNOMEDIA;
else if (!*printer || !(pps = search_pstatus(printer)))
status = MNODEST;
else if (*form && !(pfs = search_fstatus(form)))
status = MNOMEDIA;
else if ((trayNum <=0) || (trayNum > pps->numForms))
status = MNOTRAY;
else if (pps->request)
status = MBUSY;
else {
if (*form)
remount_form(pps, pfs,trayNum);
if (*pwheel_name)
remount_pwheel(pps, pwheel_name);
status = MOK;
}
mputm (md, R_MOUNT_TRAY, status);
}
void
s_unmount(char *m, MESG *md)
{
char *printer,
*form,
*pwheel_name;
ushort status;
register PSTATUS *pps;
(void)getmessage (m, S_UNMOUNT, &printer, &form, &pwheel_name);
syslog(LOG_DEBUG, "s_unmount(%s, %s, %s)",
(printer ? printer : "NULL"), (form ? form : "NULL"),
(pwheel_name ? pwheel_name : "NULL"));
if (!*form && !*pwheel_name)
status = MNOMEDIA;
else if (!*printer || !(pps = search_pstatus(printer)))
status = MNODEST;
else if (pps->request)
status = MBUSY;
else {
if (*form)
remount_form (pps, (FSTATUS *)0,1);
if (*pwheel_name)
remount_pwheel (pps, (char *)0);
status = MOK;
}
mputm (md, R_UNMOUNT, status);
return;
}
void
s_unmount_tray(char *m, MESG *md)
{
char *printer,
*form,
*pwheel_name;
ushort status;
short trayNum;
register PSTATUS *pps;
(void)getmessage (m, S_UNMOUNT_TRAY, &printer, &form, &pwheel_name,
&trayNum);
syslog(LOG_DEBUG, "s_unmount_tray(%s, %s, %s, %d)",
(printer ? printer : "NULL"), (form ? form : "NULL"),
(pwheel_name ? pwheel_name : "NULL"), trayNum);
if (!*form && !*pwheel_name)
status = MNOMEDIA;
else if (!*printer || !(pps = search_pstatus(printer)))
status = MNODEST;
else if ((trayNum <=0) || (trayNum > pps->numForms))
status = MNOTRAY;
else if (pps->request)
status = MBUSY;
else {
if (*form)
remount_form (pps, (FSTATUS *)0,trayNum);
if (*pwheel_name)
remount_pwheel (pps, (char *)0);
status = MOK;
}
mputm (md, R_UNMOUNT_TRAY, status);
return;
}
void
s_load_form(char *m, MESG *md)
{
char *form;
ushort status;
register _FORM *pf;
register FSTATUS *pfs;
(void)getmessage (m, S_LOAD_FORM, &form);
syslog(LOG_DEBUG, "s_load_form(%s)", (form ? form : "NULL"));
if (!*form)
status = MNODEST;
else if (!(pf = Getform(form))) {
switch (errno) {
case EBADF:
status = MERRDEST;
break;
case ENOENT:
default:
status = MNODEST;
break;
}
} else if ((pfs = search_fstatus(form))) {
unload_list (&pfs->users_allowed);
unload_list (&pfs->users_denied);
load_userform_access (
pf->name,
&pfs->users_allowed,
&pfs->users_denied
);
load_sdn (&pfs->cpi, pf->cpi);
load_sdn (&pfs->lpi, pf->lpi);
load_sdn (&pfs->plen, pf->plen);
load_sdn (&pfs->pwid, pf->pwid);
form_in_question = pfs;
queue_check (qchk_form);
check_form_alert (pfs, pf);
status = MOK;
} else if ((pfs = new_fstatus(pf))) {
check_form_alert (pfs, pf);
status = MOK;
} else {
free_form (pf);
status = MNOSPACE;
}
mputm (md, R_LOAD_FORM, status);
return;
}
static void
_unload_form(register FSTATUS *pfs)
{
int i;
short numForms;
PFSTATUS *ppfs;
for (i = 0; PStatus != NULL && PStatus[i] != NULL; i++)
if (((ppfs = PStatus[i]->forms) != NULL) &&
((numForms = PStatus[i]->numForms) > 0)) {
int j;
for ( j = 0 ; j < numForms ; j++ )
if (ppfs[j].form == pfs) ppfs[j].form= NULL;
}
return;
}
void
s_unload_form(char *m, MESG *md)
{
char *form;
ushort status;
RSTATUS *prs;
register FSTATUS *pfs;
(void)getmessage (m, S_UNLOAD_FORM, &form);
syslog(LOG_DEBUG, "s_unload_form(%s)", (form ? form : "NULL"));
if (!*form || STREQU(form, NAME_ALL)) {
int i;
status = MOK;
for (i = 0; FStatus != NULL && FStatus[i] != NULL &&
status == MOK; i++) {
for (prs = Request_List; prs != NULL; prs = prs->next)
if (prs->form == FStatus[i]) {
status = MBUSY;
break;
}
}
if (status == MOK) {
for (i = 0; FStatus != NULL && FStatus[i] != NULL; i++)
_unload_form (FStatus[i]);
free(FStatus);
FStatus = NULL;
}
} else if (!*form || !(pfs = search_fstatus(form)))
status = MNODEST;
else {
status = MOK;
for (prs = Request_List; prs != NULL; prs = prs->next)
if (prs->form == pfs) {
status = MBUSY;
break;
}
if (status == MOK) {
_unload_form (pfs);
list_remove((void ***)&FStatus, (void *)pfs);
}
}
mputm (md, R_UNLOAD_FORM, status);
return;
}
void
s_load_printwheel(char *m, MESG *md)
{
char *pwheel_name;
ushort status;
register PWHEEL *ppw;
register PWSTATUS *ppws;
(void)getmessage (m, S_LOAD_PRINTWHEEL, &pwheel_name);
syslog(LOG_DEBUG, "s_load_printwheel(%s)",
(pwheel_name ? pwheel_name : "NULL"));
if (!*pwheel_name)
status = MNODEST;
else if (!(ppw = Getpwheel(pwheel_name))) {
switch (errno) {
case EBADF:
status = MERRDEST;
break;
case ENOENT:
default:
status = MNODEST;
break;
}
} else if ((ppws = search_pwstatus(pwheel_name))) {
check_pwheel_alert (ppws, ppw);
status = MOK;
} else if ((ppws = new_pwstatus(ppw))) {
register RSTATUS *prs;
for (prs = Request_List; prs != NULL; prs = prs->next)
if ((prs->pwheel_name == pwheel_name) &&
(!one_printer_with_charsets(prs))) {
prs->pwheel = ppws;
ppws->requests++;
}
check_pwheel_alert (ppws, ppw);
status = MOK;
} else {
freepwheel (ppw);
status = MNOSPACE;
}
mputm (md, R_LOAD_PRINTWHEEL, status);
return;
}
static void
_unload_pwheel(register PWSTATUS *ppws)
{
register PSTATUS *pps;
register RSTATUS *prs;
int i;
for (i = 0; PStatus != NULL && PStatus[i] != NULL; i++)
if (PStatus[i]->pwheel == ppws)
PStatus[i]->pwheel = 0;
for (prs = Request_List; prs; prs = prs->next)
if (prs->pwheel == ppws)
prs->pwheel = 0;
if (ppws->alert->active)
cancel_alert (A_PWHEEL, ppws);
free_pwstatus(ppws);
return;
}
void
s_unload_printwheel(char *m, MESG *md)
{
char *pwheel_name;
ushort status;
register PWSTATUS *ppws;
(void)getmessage (m, S_UNLOAD_PRINTWHEEL, &pwheel_name);
syslog(LOG_DEBUG, "s_unload_printwheel(%s)",
(pwheel_name ? pwheel_name : "NULL"));
if (!*pwheel_name || STREQU(pwheel_name, NAME_ALL)) {
int i;
for (i = 0; PWStatus != NULL && PWStatus[i] != NULL; i++)
_unload_pwheel (PWStatus[i]);
free(PWStatus);
PWStatus = NULL;
status = MOK;
} else if (!(ppws = search_pwstatus(pwheel_name)))
status = MNODEST;
else {
_unload_pwheel (ppws);
list_remove((void ***)&PWStatus, (void *)ppws);
status = MOK;
}
mputm (md, R_UNLOAD_PRINTWHEEL, status);
return;
}