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