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     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