void check_pwheel_alert(PWSTATUS *ppws, PWHEEL *ppw) { short trigger, fire_off_alert = 0; int requests_waiting; /* * Call this routine whenever a request has been queued * or dequeued for a print-wheel, and whenever the print-wheel * changes. If a pointer to a new PWHEEL is passed, the * PWSTATUS structure is updated with the changes. Use a * second argument of 0 if no change. * * WARNING: It is valid to call this routine when adding * a NEW print wheel (not just changing it). Thus the members * of the structure "ppws->pwheel" may not be set. * In this case, though, "ppw" MUST be set, and there can * be NO alert active. */ if (ppw) { if ((trigger = ppw->alert.Q) <= 0) trigger = 1; } else trigger = ppws->trigger; if (Starting) goto Return; #define OALERT ppws->pwheel->alert #define NALERT ppw->alert requests_waiting = max_requests_needing_pwheel_mounted(ppws->pwheel->name); /* * Cancel an active alert if the number of requests queued * has dropped below the threshold (or the threshold has been * raised), or if the alert command or period has changed. * In the latter case we'll reactive the alert later. */ if (ppws->alert->active) if (!requests_waiting || requests_waiting < trigger) cancel_alert (A_PWHEEL, ppws); else if ( ppw && ( !SAME(NALERT.shcmd, OALERT.shcmd) || NALERT.W != OALERT.W || NALERT.Q != OALERT.Q ) ) cancel_alert (A_PWHEEL, ppws); /* * If we still have the condition for an alert, we'll fire * one off. It is possible the alert is still running, but * that's okay. First, we may want to change the alert message; * second, the "alert()" routine doesn't execute an alert * if it is already running. */ if (trigger > 0 && requests_waiting >= trigger) if ((ppw && NALERT.shcmd) || OALERT.shcmd) fire_off_alert = 1; #undef OALERT #undef NALERT Return: if (ppw) { ppws->pwheel = ppw; ppws->trigger = trigger; } /* * Have to do this after updating the changes. */ if (fire_off_alert) alert (A_PWHEEL, ppws); return; }
void s_quiet_alert(char *m, MESG *md) { char *name; ushort type, status; register FSTATUS *pfs; register PSTATUS *pps; register PWSTATUS *ppws; /* * We quiet an alert by cancelling it with "cancel_alert()" * and then resetting the active flag. This effectively just * terminates the process running the alert but tricks the * rest of the Spooler into thinking it is still active. * The alert will be reactivated only AFTER "cancel_alert()" * has been called (to clear the active flag) and then "alert()" * is called again. Thus: * * For printer faults the alert will be reactivated when: * - a fault is found after the current fault has been * cleared (i.e. after successful print or after manually * enabled). * * For forms/print-wheels the alert will be reactivated when: * - the form/print-wheel becomes mounted and then unmounted * again, with too many requests still pending; * - the number of requests falls below the threshold and * then rises above it again. */ (void)getmessage (m, S_QUIET_ALERT, &name, &type); syslog(LOG_DEBUG, "s_quiet_alert(%s, %d)", (name ? name : "NULL"), type); if (!*name) status = MNODEST; else switch (type) { case QA_FORM: if (!(pfs = search_ftable(name))) status = MNODEST; else if (!pfs->alert->active) status = MERRDEST; else { cancel_alert (A_FORM, pfs); pfs->alert->active = 1; status = MOK; } break; case QA_PRINTER: if (!(pps = search_ptable(name))) status = MNODEST; else if (!pps->alert->active) status = MERRDEST; else { cancel_alert (A_PRINTER, pps); pps->alert->active = 1; status = MOK; } break; case QA_PRINTWHEEL: if (!(ppws = search_pwtable(name))) status = MNODEST; else if (!ppws->alert->active) status = MERRDEST; else { cancel_alert (A_PWHEEL, ppws); ppws->alert->active = 1; status = MOK; } break; } mputm (md, R_QUIET_ALERT, status); return; }
void check_form_alert(FSTATUS *pfs, _FORM *pf) { short trigger, fire_off_alert = 0; int requests_waiting; /* * Call this routine whenever a requests has been queued * or dequeued for a form, and whenever the form changes. * If a pointer to a new _FORM is passed, the FSTATUS * structure is updated with the changes. Use a second * argument of 0 if no change. * * WARNING: It is valid to call this routine when adding * a NEW form (not just changing it). Thus the members of * the structure "pfs->form" may not be set. * In this case, though, "pf" MUST be set, and there can * be NO alert active. */ syslog(LOG_DEBUG, "check_form_alert:\n"); if (pfs) syslog(LOG_DEBUG, "check_form_alert: pfs->name <%s>\n", (pfs->form->name != NULL) ? pfs->form->name : "null"); if (pf) syslog(LOG_DEBUG, "check_form_alert: pf->name <%s>\n", (pf->name != NULL) ? pf->name : "null"); if (pf) { if ((trigger = pf->alert.Q) <= 0) trigger = 1; } else trigger = pfs->trigger; if (Starting) goto Return; #define OALERT pfs->form->alert #define NALERT pf->alert requests_waiting = max_requests_needing_form_mounted(pfs); /* * Cancel an active alert if the number of requests queued * has dropped below the threshold (or the threshold has been * raised), or if the alert command or period has changed. * In the latter case we'll reactive the alert later. */ if (pfs->alert->active) if (!requests_waiting || requests_waiting < trigger) cancel_alert (A_FORM, pfs); else if ( pf && ( !SAME(NALERT.shcmd, OALERT.shcmd) || NALERT.W != OALERT.W || NALERT.Q != OALERT.Q ) ) cancel_alert (A_FORM, pfs); /* * If we still have the condition for an alert, we'll fire * one off. It is possible the alert is still running, but * that's okay. First, we may want to change the alert message; * second, the "alert()" routine doesn't execute an alert * if it is already running. */ if (trigger > 0 && requests_waiting >= trigger) if ((pf && NALERT.shcmd) || OALERT.shcmd) fire_off_alert = 1; #undef OALERT #undef NALERT Return: if (pf) { pfs->form = pf; pfs->trigger = trigger; } /* * Have to do this after updating the changes. */ if (fire_off_alert) alert (A_FORM, pfs); return; }