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