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 
     34     0  stevel static char		*N_Msg[] = {
     35     0  stevel 	"Subject: Status of lp request %s\n\nYour request %s destined for %s%s\n",
     36     0  stevel 	"has completed successfully on printer %s.\n",
     37     0  stevel 	"was canceled by the lpsched daemon%s\n", /* bugfix 1100252 */
     38     0  stevel 	"encountered an error during filtering.\n",
     39     0  stevel 	"encountered an error while printing on printer %s.\n",
     40     0  stevel 	"Filtering stopped with an exit code of %d.\n",
     41     0  stevel 	"Printing stopped with an exit code of %d.\n",
     42     0  stevel 	"Filtering was interrupted with a signal %d.\n",
     43     0  stevel 	"Printing was interrupted with a signal %d.\n",
     44     0  stevel 	"\nReason for failure:\n\n%s\n",
     45     0  stevel 	"\nReason for being canceled:\n\n%s\n",
     46     0  stevel };
     47     0  stevel 
     48     0  stevel static struct reason {
     49     0  stevel 	short			reason;
     50     0  stevel 	char			*msg;
     51     0  stevel }			N_Reason[] = {
     52     0  stevel     {
     53     0  stevel 	MNODEST,
     54     0  stevel 	"The requested print destination has been removed."
     55     0  stevel     }, {
     56     0  stevel 	MERRDEST,
     57     0  stevel 	"All candidate destinations are rejecting further requests."
     58     0  stevel     }, {
     59     0  stevel 	MDENYDEST,
     60     0  stevel 	"You are no longer allowed to use any printer suitable for\nthe request."
     61     0  stevel     }, {
     62     0  stevel 	MDENYDEST,
     63     0  stevel 	"No candidate printer can handle these characteristics:"
     64     0  stevel     }, {
     65     0  stevel 	MNOMEDIA,
     66     0  stevel 	"The form you requested no longer exists."
     67     0  stevel     }, {
     68     0  stevel 	MDENYMEDIA,
     69     0  stevel 	"You are no longer allowed to use the form you requested."
     70     0  stevel     }, {
     71     0  stevel 	MDENYMEDIA,
     72     0  stevel 	"The form you wanted now requires a different character set."
     73     0  stevel     }, {
     74     0  stevel 	MNOFILTER,
     75     0  stevel 	"There is no longer a filter that will convert your file for printing."
     76     0  stevel     }, {
     77     0  stevel 	MNOMOUNT,
     78     0  stevel 	"The form or print wheel you requested is not allowed on any\nprinter otherwise suitable for the request."
     79     0  stevel     }, {
     80     0  stevel 	MNOSPACE,
     81     0  stevel 	"Memory allocation problem."
     82     0  stevel     }, {
     83     0  stevel 	-1,
     84     0  stevel 	""
     85     0  stevel     }
     86     0  stevel };
     87     0  stevel 
     88     0  stevel 
     89     0  stevel static void print_reason(int, int);
     90     0  stevel 
     91     0  stevel 
     92     0  stevel /**
     93     0  stevel  ** notify() - NOTIFY USER OF FINISHED REQUEST
     94     0  stevel  **/
     95     0  stevel 
     96     0  stevel void
     97     0  stevel notify(register RSTATUS *prs, char *errbuf, int k, int e, int slow)
     98     0  stevel {
     99     0  stevel 	register char		*cp;
    100     0  stevel 	char			*file;
    101     0  stevel 	int			fd;
    102     0  stevel 
    103     0  stevel 
    104     0  stevel 	/*
    105     0  stevel 	 * Screen out cases where no notification is needed.
    106     0  stevel 	 */
    107     0  stevel 	if (!(prs->request->outcome & RS_NOTIFY))
    108     0  stevel 		return;
    109     0  stevel 	if (
    110     0  stevel 		!(prs->request->actions & (ACT_MAIL|ACT_WRITE|ACT_NOTIFY))
    111     0  stevel 	     && !prs->request->alert
    112     0  stevel 	     && !(prs->request->outcome & RS_CANCELLED)
    113     0  stevel 	     && !e && !k && !errbuf       /* exited normally */
    114     0  stevel 	)
    115     0  stevel 		return;
    116     0  stevel 
    117     0  stevel 	/*
    118     0  stevel 	 * Create the notification message to the user.
    119     0  stevel 	 */
    120     0  stevel 	file = makereqerr(prs);
    121     0  stevel 	if ((fd = open_locked(file, "w", MODE_NOREAD)) >= 0) {
    122     0  stevel 		fdprintf(fd, N_Msg[0], prs->secure->req_id, prs->secure->req_id,
    123     0  stevel 			prs->request->destination,
    124     0  stevel 			STREQU(prs->request->destination, NAME_ANY)? " printer"
    125     0  stevel 				: "");
    126     0  stevel 
    127     0  stevel 		if (prs->request) {
    128     0  stevel 			char file[BUFSIZ];
    129     0  stevel 
    130     0  stevel 			GetRequestFiles(prs->request, file, sizeof(file));
    131     0  stevel 			fdprintf(fd, "\nThe job title was:\t%s\n", file);
    132  3125  jacobs 			fdprintf(fd, "     submitted by:\t%s\n",
    133  3125  jacobs 				prs->request->user);
    134     0  stevel 			fdprintf(fd, "               at:\t%s\n",
    135     0  stevel 				ctime(&prs->secure->date));
    136     0  stevel 		}
    137     0  stevel 
    138     0  stevel 		if (prs->request->outcome & RS_PRINTED)
    139     0  stevel 			fdprintf(fd, N_Msg[1], prs->printer->printer->name);
    140     0  stevel 
    141     0  stevel 		if (prs->request->outcome & RS_CANCELLED)
    142     0  stevel 			fdprintf(fd, N_Msg[2],
    143     0  stevel 				(prs->request->outcome & RS_FAILED)? ", and"
    144     0  stevel 					: ".");
    145     0  stevel 
    146     0  stevel 
    147     0  stevel 		if (prs->request->outcome & RS_FAILED) {
    148     0  stevel 			if (slow)
    149     0  stevel 				fdprintf(fd, N_Msg[3]);
    150     0  stevel 			else
    151     0  stevel 				fdprintf(fd, N_Msg[4],
    152     0  stevel 					prs->printer->printer->name);
    153     0  stevel 
    154     0  stevel 			if (e > 0)
    155     0  stevel 				fdprintf(fd, N_Msg[slow? 5 : 6], e);
    156     0  stevel 			else if (k)
    157     0  stevel 				fdprintf(fd, N_Msg[slow? 7 : 8], k);
    158     0  stevel 		}
    159     0  stevel 
    160     0  stevel 		if (errbuf) {
    161     0  stevel 			for (cp = errbuf; *cp && *cp == '\n'; cp++)
    162     0  stevel 				;
    163     0  stevel 			fdprintf(fd, N_Msg[9], cp);
    164     0  stevel 			if (prs->request->outcome & RS_CANCELLED)
    165     0  stevel 				fdprintf(fd, "\n");
    166     0  stevel 		}
    167     0  stevel 
    168     0  stevel 		/* start fix for bugid 1100252	*/
    169     0  stevel 		if (prs->request->outcome & RS_CANCELLED) {
    170     0  stevel 			print_reason (fd, prs->reason);
    171     0  stevel 		}
    172     0  stevel 
    173     0  stevel 		close(fd);
    174     0  stevel 		schedule (EV_NOTIFY, prs);
    175     0  stevel 
    176     0  stevel 	}
    177     0  stevel 	if (file)
    178     0  stevel 		Free (file);
    179     0  stevel 
    180     0  stevel 	return;
    181     0  stevel }
    182     0  stevel 
    183     0  stevel /**
    184     0  stevel  ** print_reason() - PRINT REASON FOR AUTOMATIC CANCEL
    185     0  stevel  **/
    186     0  stevel 
    187     0  stevel static void
    188     0  stevel print_reason(int fd, int reason)
    189     0  stevel {
    190     0  stevel 	register int		i;
    191     0  stevel 
    192     0  stevel 
    193     0  stevel #define P(BIT,MSG)	if (chkprinter_result & BIT) fdprintf(fd, MSG)
    194     0  stevel 
    195     0  stevel 	for (i = 0; N_Reason[i].reason != -1; i++)
    196     0  stevel 		if (N_Reason[i].reason == reason) {
    197     0  stevel 			if (reason == MDENYDEST && chkprinter_result)
    198     0  stevel 				i++;
    199     0  stevel 			if (reason == MDENYMEDIA && chkprinter_result)
    200     0  stevel 				i++;
    201     0  stevel 			fdprintf(fd, N_Msg[10], N_Reason[i].msg);
    202     0  stevel 			if (reason == MDENYDEST && chkprinter_result) {
    203     0  stevel 				P (PCK_TYPE,	"\tprinter type\n");
    204     0  stevel 				P (PCK_CHARSET,	"\tcharacter set\n");
    205     0  stevel 				P (PCK_CPI,	"\tcharacter pitch\n");
    206     0  stevel 				P (PCK_LPI,	"\tline pitch\n");
    207     0  stevel 				P (PCK_WIDTH,	"\tpage width\n");
    208     0  stevel 				P (PCK_LENGTH,	"\tpage length\n");
    209     0  stevel 				P (PCK_BANNER,	"\tno banner\n");
    210     0  stevel 			}
    211     0  stevel 			break;
    212     0  stevel 		}
    213     0  stevel 
    214     0  stevel 	return;
    215     0  stevel }
    216