Home | History | Annotate | Download | only in lpsched
      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  3125  jacobs  * Common Development and Distribution License (the "License").
      6  3125  jacobs  * 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  3125  jacobs 
     22  3125  jacobs /*
     23  3125  jacobs  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
     24  3125  jacobs  * Use is subject to license terms.
     25  3125  jacobs  */
     26  3125  jacobs 
     27     0  stevel /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
     28     0  stevel /*	  All Rights Reserved  	*/
     29     0  stevel 
     30     0  stevel 
     31     0  stevel 
     32     0  stevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
     33     0  stevel /* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */
     34     0  stevel 
     35     0  stevel #include "lpsched.h"
     36     0  stevel #include <syslog.h>
     37     0  stevel 
     38     0  stevel static char *
     39     0  stevel shortenReason(char *reason)
     40     0  stevel {
     41     0  stevel 	register char	*ptr, *pe;
     42     0  stevel 	int		peLen;
     43     0  stevel 
     44     0  stevel 	if (strncmp(reason,"%%[",3) == 0)
     45     0  stevel 		reason += 3;
     46     0  stevel 
     47     0  stevel 	while (*reason == ' ')
     48     0  stevel 		reason++;
     49     0  stevel 
     50     0  stevel 	pe = "PrinterError:";
     51     0  stevel 	peLen = strlen(pe);
     52     0  stevel 	if (strncmp(reason,pe,peLen) == 0)
     53     0  stevel 		reason += peLen;
     54     0  stevel 
     55     0  stevel 	if (((ptr = strchr(reason,']')) != NULL) && (strncmp(ptr,"]%%",3) == 0))
     56     0  stevel 		*ptr = 0;
     57     0  stevel 
     58     0  stevel 	pe = reason + strlen(reason) -1;
     59     0  stevel 	pe = reason;
     60     0  stevel 	while (pe = strchr(pe,'\n'))
     61     0  stevel 		*pe = ' ';
     62     0  stevel 
     63     0  stevel 	pe = reason + strlen(reason) -1;
     64     0  stevel 	while ((pe > reason) && (*pe == ' ')) {
     65     0  stevel 		*pe = 0;
     66     0  stevel 		pe--;
     67     0  stevel 	}
     68     0  stevel 	return(reason);
     69     0  stevel }
     70     0  stevel 
     71     0  stevel /**
     72     0  stevel  ** printer_fault() - RECOGNIZE PRINTER FAULT
     73     0  stevel  **/
     74     0  stevel 
     75     0  stevel void
     76     0  stevel printer_fault(register PSTATUS *pps, register RSTATUS *prs, char *alert_text,
     77     0  stevel 	 int err)
     78     0  stevel {
     79     0  stevel 	register char		*why,*shortWhy;
     80     0  stevel 
     81     0  stevel 	pps->status |= PS_FAULTED;
     82     0  stevel 
     83     0  stevel 	/*  -F wait  */
     84     0  stevel 	if (STREQU(pps->printer->fault_rec, NAME_WAIT))
     85     0  stevel 		disable (pps, CUZ_FAULT, DISABLE_STOP);
     86     0  stevel 
     87     0  stevel 	/*  -F beginning  */
     88     0  stevel 	else if (STREQU(pps->printer->fault_rec, NAME_BEGINNING))
     89     0  stevel 		terminate (pps->exec);
     90     0  stevel 
     91     0  stevel 	/*  -F continue  AND  the interface program died  */
     92     0  stevel 	else if (!(pps->status & PS_LATER) && !pps->request) {
     93     0  stevel 		load_str (&pps->dis_reason, CUZ_STOPPED);
     94     0  stevel 		schedule (EV_LATER, WHEN_PRINTER, EV_ENABLE, pps);
     95     0  stevel 	}
     96     0  stevel 
     97     0  stevel 	if (err) {
     98     0  stevel 		errno = err;
     99     0  stevel 		why = makestr(alert_text, "(", PERROR, ")\n", (char *)0);
    100     0  stevel 	} else if (! alert_text)
    101     0  stevel 		why = makestr("exec exit fault", (char *) 0);
    102     0  stevel 	else
    103     0  stevel 		why = makestr(alert_text, (char *) 0);
    104     0  stevel 
    105     0  stevel 	if (!why)
    106     0  stevel 		why = alert_text;
    107     0  stevel 
    108     0  stevel 	shortWhy = (why != alert_text ? shortenReason(why) : why);
    109     0  stevel 
    110     0  stevel 	load_str (&pps->fault_reason, shortWhy);
    111     0  stevel 	dump_fault_status (pps);
    112     0  stevel 	if (STREQU(pps->printer->fault_alert.shcmd,"show fault"))
    113     0  stevel 		pps->status |= PS_SHOW_FAULT;
    114     0  stevel 	else
    115     0  stevel 		pps->status &= ~PS_SHOW_FAULT;
    116     0  stevel 
    117     0  stevel 	note("printer fault. type: %s, status: %x\nmsg: (%s)\n",
    118     0  stevel 		(pps->printer->fault_alert.shcmd ?
    119     0  stevel 		    pps->printer->fault_alert.shcmd : "??"),
    120     0  stevel 		pps->status, shortWhy);
    121     0  stevel 
    122     0  stevel 	if (pps->status & PS_SHOW_FAULT)
    123     0  stevel 		schedule (EV_MESSAGE, pps);
    124     0  stevel 	else {
    125     0  stevel 		alert(A_PRINTER, pps, prs, shortWhy);
    126     0  stevel 	}
    127     0  stevel 	if (why != alert_text)
    128     0  stevel 		Free (why);
    129     0  stevel }
    130     0  stevel 
    131     0  stevel /**
    132     0  stevel  ** clear_printer_fault() - RECOGNIZE PRINTER FAULT
    133     0  stevel  **/
    134     0  stevel 
    135     0  stevel void
    136     0  stevel clear_printer_fault(register PSTATUS *pps, char *alert_text)
    137     0  stevel {
    138     0  stevel 	register char	*why, *shortWhy;
    139     0  stevel 
    140     0  stevel 	pps->status &= ~PS_FAULTED;
    141     0  stevel 
    142     0  stevel 	why = makestr(alert_text, (char *) 0);
    143     0  stevel 
    144     0  stevel 	shortWhy = (why ? shortenReason(why) : alert_text);
    145     0  stevel 
    146     0  stevel 	load_str (&pps->fault_reason, shortWhy);
    147     0  stevel 	dump_fault_status (pps);
    148     0  stevel 	if (STREQU(pps->printer->fault_alert.shcmd,"show fault"))
    149     0  stevel 		pps->status |= PS_SHOW_FAULT;
    150     0  stevel 	else
    151     0  stevel 		pps->status &= ~PS_SHOW_FAULT;
    152     0  stevel 
    153     0  stevel 	if (pps->status & PS_SHOW_FAULT)
    154     0  stevel 		schedule (EV_MESSAGE, pps);
    155     0  stevel 	if (why != alert_text)
    156     0  stevel 		Free(why);
    157     0  stevel 	schedule(EV_ENABLE, pps);
    158     0  stevel }
    159     0  stevel 
    160     0  stevel /**
    161     0  stevel  ** dial_problem() - ADDRESS DIAL-OUT PROBLEM
    162     0  stevel  **/
    163     0  stevel 
    164     0  stevel void
    165     0  stevel dial_problem(register PSTATUS *pps, RSTATUS *prs, int rc)
    166     0  stevel {
    167     0  stevel 	static struct problem {
    168     0  stevel 		char			*reason;
    169     0  stevel 		int			retry_max,
    170     0  stevel 					dial_error;
    171     0  stevel 	}			problems[] = {
    172     0  stevel 		"DIAL FAILED",			10,	 2, /* D_HUNG  */
    173     0  stevel 		"CALLER SCRIPT FAILED",		10,	 3, /* NO_ANS  */
    174     0  stevel 		"CAN'T ACCESS DEVICE",		 0,	 6, /* L_PROB  */
    175     0  stevel 		"DEVICE LOCKED",		20,	 8, /* DV_NT_A */
    176     0  stevel 		"NO DEVICES AVAILABLE",		 0,	10, /* NO_BD_A */
    177     0  stevel 		"SYSTEM NOT IN Systems FILE",	 0,	13, /* BAD_SYS */
    178     0  stevel 		"UNKNOWN dial() FAILURE",	 0,	0
    179     0  stevel 	};
    180     0  stevel 
    181     0  stevel 	register struct problem	*p;
    182     0  stevel 
    183     0  stevel 	register char		*msg;
    184     0  stevel 
    185     0  stevel #define PREFIX	"Connect problem: "
    186     0  stevel #define SUFFIX	"This problem has occurred several times.\nPlease check the dialing instructions for this printer.\n"
    187     0  stevel 
    188     0  stevel 
    189     0  stevel 	for (p = problems; p->dial_error; p++)
    190     0  stevel 		if (p->dial_error == rc)
    191     0  stevel 			break;
    192     0  stevel 
    193     0  stevel 	if (!p->retry_max) {
    194     0  stevel 		msg = Malloc(strlen(PREFIX) + strlen(p->reason) + 2);
    195     0  stevel 		sprintf (msg, "%s%s\n", PREFIX, p->reason);
    196     0  stevel 		printer_fault (pps, prs, msg, 0);
    197     0  stevel 		Free (msg);
    198     0  stevel 
    199     0  stevel 	} else if (pps->last_dial_rc != rc) {
    200     0  stevel 		pps->nretry = 1;
    201     0  stevel 		pps->last_dial_rc = (short)rc;
    202     0  stevel 
    203     0  stevel 	} else if (pps->nretry++ > p->retry_max) {
    204     0  stevel 		pps->nretry = 0;
    205     0  stevel 		pps->last_dial_rc = (short)rc;
    206     0  stevel 		msg = Malloc(
    207     0  stevel 		strlen(PREFIX) + strlen(p->reason) + strlen(SUFFIX) + 2
    208     0  stevel 		);
    209     0  stevel 		sprintf (msg, "%s%s%s\n", PREFIX, p->reason, SUFFIX);
    210     0  stevel 		printer_fault (pps, prs, msg, 0);
    211     0  stevel 		Free (msg);
    212     0  stevel 	}
    213     0  stevel 
    214     0  stevel 	if (!(pps->status & PS_FAULTED)) {
    215     0  stevel 		load_str (&pps->dis_reason, p->reason);
    216     0  stevel 		schedule (EV_LATER, WHEN_PRINTER, EV_ENABLE, pps);
    217     0  stevel 	}
    218     0  stevel 
    219     0  stevel 	return;
    220     0  stevel }
    221