1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 27 /* All Rights Reserved */ 28 29 30 #include "lpsched.h" 31 #include "stdarg.h" 32 33 static char *Fa_msg[] = 34 { 35 "Subject: Mount form %s\n\nThe form %s needs to be mounted\non the printer(s):\n", 36 " %-14s (%d requests)\n", 37 "Total print requests queued for this form: %d\n", 38 "Use the %s ribbon.\n", 39 "Use any ribbon.\n", 40 "Use the %s print wheel, if appropriate.\n", 41 "Use any print wheel, if appropriate.\n", 42 }; 43 44 static char *Fa_New_msg[] = 45 { 46 "The form `%s' needs to be mounted\non the printer(s):\n", 47 "The form `%s' (paper size: `%s') needs\nto be mounted on the printer(s):\n", 48 }; 49 50 static char *Pa_msg[] = 51 { 52 "Subject: Mount print-wheel %s\n\nThe print-wheel %s needs to be mounted\non the printer(s):\n", 53 " %-14s (%d request(s))\n", 54 "Total print requests queued for this print-wheel: %d\n", 55 }; 56 57 static char *Pf_msg[] = 58 { 59 "Subject: Problem with printer %s\n\nThe printer %s has stopped printing for the reason given below.\n", 60 "Fix the problem and bring the printer back on line\nto resume printing.\n", 61 "Fix the problem and bring the printer back on line, and issue\nan enable command when you want to resume or restart printing.\n", 62 "Fix the problem and bring the printer back on line.\nPrinting has stopped, but will be restarted in a few minutes;\nissue an enable command if you want to restart sooner.\nUnless someone issues a change request\n\n\tlp -i %s -P ...\n\nto change the page list to print, the current request will be reprinted from\nthe beginning.\n", 63 "\nThe reason(s) it stopped (multiple reasons indicate repeated attempts):\n\n" 64 }; 65 66 static void pformat(), 67 pwformat(), 68 fformat(); 69 70 static int f_count(), 71 p_count(); 72 73 /*VARARGS1*/ 74 void 75 alert (int type, ...) 76 { 77 va_list args; 78 79 va_start (args, type); 80 81 switch (type) { 82 case A_PRINTER: { 83 PSTATUS *pr = va_arg(args, PSTATUS *); 84 RSTATUS *rp = va_arg(args, RSTATUS *); 85 char *text = va_arg(args, char *); 86 pformat(pr->alert->msgfile, text, pr, rp); 87 if (!pr->alert->active) 88 { 89 if (exec(EX_ALERT, pr) == 0) 90 pr->alert->active = 1; 91 else 92 { 93 if (errno == EBUSY) 94 pr->alert->exec->flags |= EXF_RESTART; 95 else 96 Unlink(pr->alert->msgfile); 97 } 98 } 99 break; 100 } 101 case A_PWHEEL: { 102 PWSTATUS *pp = va_arg(args, PWSTATUS *); 103 pwformat(pp->alert->msgfile, pp); 104 if (!pp->alert->active) { 105 if (exec(EX_PALERT, pp) == 0) 106 pp->alert->active = 1; 107 else { 108 if (errno == EBUSY) 109 pp->alert->exec->flags |= EXF_RESTART; 110 else 111 Unlink(pp->alert->msgfile); 112 } 113 } 114 break; 115 } 116 case A_FORM: { 117 int isFormMessage; 118 char *formPath; 119 FSTATUS *fp = va_arg(args, FSTATUS *); 120 121 isFormMessage = (STREQU(fp->form->alert.shcmd, "showfault")); 122 if (isFormMessage) 123 formPath = makepath(Lp_A_Forms, fp->form->name, 124 FORMMESSAGEFILE, (char * )NULL); 125 else 126 formPath = fp->alert->msgfile; 127 128 fformat(formPath, fp,isFormMessage); 129 130 if (isFormMessage) { 131 Free(formPath); 132 schedule (EV_FORM_MESSAGE, fp); 133 } else if (!fp->alert->active) { 134 if (exec(EX_FALERT, fp) == 0) 135 fp->alert->active = 1; 136 else { 137 if (errno == EBUSY) 138 fp->alert->exec->flags |= EXF_RESTART; 139 else 140 Unlink(fp->alert->msgfile); 141 } 142 } 143 break; 144 } 145 } 146 va_end(args); 147 } 148 149 static void 150 pformat(char *file, char *text, PSTATUS *pr, RSTATUS *rp) 151 { 152 int fd; 153 154 if (Access(pr->alert->msgfile, 0) == 0) { 155 if ((fd = open_locked(file, "a", MODE_READ)) < 0) 156 return; 157 if (text) 158 fdprintf(fd, text); 159 close(fd); 160 } else { 161 if ((fd = open_locked(file, "w", MODE_READ)) < 0) 162 return; 163 fdprintf(fd, Pf_msg[0], NB(pr->printer->name), NB(pr->printer->name)); 164 if (STREQU(pr->printer->fault_rec, NAME_WAIT)) 165 fdprintf(fd, Pf_msg[2]); 166 else { 167 if (pr->exec->pid > 0) 168 fdprintf(fd, Pf_msg[1]); 169 else if (rp) 170 fdprintf(fd, Pf_msg[3], rp->secure->req_id); 171 } 172 fdprintf(fd, Pf_msg[4]); 173 if (text) { 174 while (*text == '\n' || *text == '\r') 175 text++; 176 fdprintf(fd, "%s", text); 177 } 178 close(fd); 179 } 180 } 181 182 static void 183 pwformat(char *file, PWSTATUS *pp) 184 { 185 int fd, i; 186 187 if ((fd = open_locked(file, "w", MODE_READ)) < 0) 188 return; 189 fdprintf(fd, Pa_msg[0], NB(pp->pwheel->name), NB(pp->pwheel->name)); 190 for (i = 0; PStatus != NULL && PStatus[i] != NULL; i++) { 191 PSTATUS *p = PStatus[i]; 192 193 if (p->printer->daisy && !SAME(p->pwheel_name, pp->pwheel->name) && 194 searchlist(pp->pwheel->name, p->printer->char_sets)) { 195 int n = p_count(pp, p->printer->name); 196 197 if (n) 198 fdprintf(fd, Pa_msg[1], p->printer->name, n); 199 } 200 } 201 fdprintf(fd, Pa_msg[2], pp->requests); 202 close(fd); 203 pp->requests_last = pp->requests; 204 } 205 206 static void 207 fformat(char *file, FSTATUS *fp, int isFormMessage) 208 { 209 int fd, i; 210 int numLines=0; 211 212 if ((fd = open_locked(file, "w", MODE_READ)) < 0) 213 return; 214 215 if (isFormMessage) 216 if (fp->form->paper) 217 fdprintf(fd, Fa_New_msg[1], NB(fp->form->name), 218 fp->form->paper); 219 else 220 fdprintf(fd, Fa_New_msg[0], NB(fp->form->name)); 221 else 222 fdprintf(fd, Fa_msg[0], NB(fp->form->name), NB(fp->form->name)); 223 224 for (i = 0; PStatus != NULL && PStatus[i] != NULL; i++) { 225 PSTATUS *p = PStatus[i]; 226 227 if ((! isFormMountedOnPrinter(p,fp)) && 228 allowed(fp->form->name, p->forms_allowed, 229 p->forms_denied)) { 230 231 int n = f_count(fp, p->printer->name); 232 233 if (n) { 234 fdprintf(fd, Fa_msg[1], p->printer->name, n); 235 numLines++; 236 } 237 } 238 } 239 240 if (numLines != 1) fdprintf(fd, Fa_msg[2], fp->requests); 241 if (!isFormMessage) { 242 if (fp->form->rcolor && !STREQU(fp->form->rcolor, NAME_ANY)) 243 fdprintf(fd, Fa_msg[3], NB(fp->form->rcolor)); 244 else 245 fdprintf(fd, Fa_msg[4]); 246 247 if (fp->form->chset && !STREQU(fp->form->chset, NAME_ANY)) 248 fdprintf(fd, Fa_msg[5], NB(fp->form->chset)); 249 else 250 fdprintf(fd, Fa_msg[6]); 251 } 252 253 close(fd); 254 fp->requests_last = fp->requests; 255 } 256 257 258 /* VARARGS1 */ 259 void 260 cancel_alert(int type, ...) 261 { 262 ALERT *ap; 263 va_list args; 264 265 va_start (args, type); 266 267 switch (type) 268 { 269 case A_PRINTER: 270 ap = va_arg(args, PSTATUS *)->alert; 271 break; 272 273 case A_PWHEEL: 274 ap = va_arg(args, PWSTATUS *)->alert; 275 break; 276 277 case A_FORM: 278 ap = va_arg(args, FSTATUS *)->alert; 279 break; 280 281 default: 282 return; 283 } 284 va_end(args); 285 286 ap->active = 0; 287 terminate(ap->exec); 288 Unlink(ap->msgfile); 289 return; 290 } 291 292 static int 293 dest_equivalent_printer(char *dest, char *printer) 294 { 295 CLSTATUS * pc; 296 297 return ( 298 STREQU(dest, printer) 299 || STREQU(dest, NAME_ANY) 300 || ( 301 ((pc = search_cstatus(dest)) != NULL) 302 && searchlist(printer, pc->class->members) 303 ) 304 ); 305 } 306 307 static int 308 f_count(FSTATUS *fp, char *name) 309 { 310 int count = 0; 311 RSTATUS *rp; 312 313 for (rp = Request_List; rp != NULL; rp = rp->next) 314 if ((rp->form == fp ) && 315 (dest_equivalent_printer(rp->request->destination, name))) 316 count++; 317 318 if ( 319 NewRequest 320 && NewRequest->form == fp 321 && dest_equivalent_printer(NewRequest->request->destination, name) 322 ) 323 count++; 324 325 return(count); 326 } 327 328 static int 329 p_count(PWSTATUS *pp, char *name) 330 { 331 int count = 0; 332 RSTATUS *rp; 333 334 for (rp = Request_List; rp != NULL; rp = rp->next) 335 if ((rp->pwheel == pp) && 336 (dest_equivalent_printer(rp->request->destination, name))) 337 count++; 338 339 if ( 340 NewRequest 341 && NewRequest->pwheel == pp 342 && dest_equivalent_printer(NewRequest->request->destination, name) 343 ) 344 count++; 345 346 return(count); 347 } 348