xref: /illumos-gate/usr/src/cmd/lp/model/tsol_netstandard (revision 2a8bcb4efb45d99ac41c94a75c396b362c414f7f)
1*f875b4ebSrica#
2*f875b4ebSrica# CDDL HEADER START
3*f875b4ebSrica#
4*f875b4ebSrica# The contents of this file are subject to the terms of the
5*f875b4ebSrica# Common Development and Distribution License (the "License").
6*f875b4ebSrica# You may not use this file except in compliance with the License.
7*f875b4ebSrica#
8*f875b4ebSrica# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*f875b4ebSrica# or http://www.opensolaris.org/os/licensing.
10*f875b4ebSrica# See the License for the specific language governing permissions
11*f875b4ebSrica# and limitations under the License.
12*f875b4ebSrica#
13*f875b4ebSrica# When distributing Covered Code, include this CDDL HEADER in each
14*f875b4ebSrica# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*f875b4ebSrica# If applicable, add the following below this CDDL HEADER, with the
16*f875b4ebSrica# fields enclosed by brackets "[]" replaced with your own identifying
17*f875b4ebSrica# information: Portions Copyright [yyyy] [name of copyright owner]
18*f875b4ebSrica#
19*f875b4ebSrica# CDDL HEADER END
20*f875b4ebSrica#
21*f875b4ebSrica#
22*f875b4ebSrica# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23*f875b4ebSrica# Use is subject to license terms.
24*f875b4ebSrica#
25*f875b4ebSrica
26*f875b4ebSrica###########
27*f875b4ebSrica##
28*f875b4ebSrica## Network Standard printer interface program.
29*f875b4ebSrica##
30*f875b4ebSrica###########
31*f875b4ebSrica
32*f875b4ebSrica#####
33*f875b4ebSrica# We can't do much except exit if spooler/scheduler
34*f875b4ebSrica# cancels us.
35*f875b4ebSrica#####
36*f875b4ebSricatrap 'eval exit_clean 15' 15
37*f875b4ebSrica
38*f875b4ebSrica####
39*f875b4ebSrica#
40*f875b4ebSrica# Send standard error messages to /dev/null rather than to
41*f875b4ebSrica# the spooler. Avoids "Terminated" messages that shell puts out
42*f875b4ebSrica# when gets SIGTERM. Save standard error so it can be used
43*f875b4ebSrica# when we need it
44*f875b4ebSrica####
45*f875b4ebSricaexec 5>&2 2>/dev/null 3>&1
46*f875b4ebSrica
47*f875b4ebSrica####
48*f875b4ebSrica# set some global variables
49*f875b4ebSrica####
50*f875b4ebSrica
51*f875b4ebSrica: ${LPTMPDIR:=/tmp}
52*f875b4ebSrica: ${SPOOLDIR:=/usr/spool/lp}
53*f875b4ebSrica: ${LOCALPATH:=${SPOOLDIR}/bin}
54*f875b4ebSricaPATH="/bin:/usr/bin:${LOCALPATH}"
55*f875b4ebSricaexit_code=0
56*f875b4ebSrica
57*f875b4ebSrica
58*f875b4ebSrica# ${LPTELL} is the name of a program that will send its
59*f875b4ebSrica# standard input to the Spooler. It is used to forward
60*f875b4ebSrica# the description of a printer fault to the Spooler,
61*f875b4ebSrica# which uses it in an alert to the administrator.
62*f875b4ebSrica#####
63*f875b4ebSricaif [ ! -x "${LPTELL:=${LOCALPATH}/lp.tell}" ]
64*f875b4ebSricathen
65*f875b4ebSrica        fake_lptell () {
66*f875b4ebSrica                header="no"
67*f875b4ebSrica                while read line
68*f875b4ebSrica                do
69*f875b4ebSrica                        if [ "no" = "${header}" ]
70*f875b4ebSrica                        then
71*f875b4ebSrica                                errmsg ERROR ${E_IP_UNKNOWN} \
72*f875b4ebSrica                "unknown printer/interface failure" \
73*f875b4ebSrica                "consult your system administrator;
74*f875b4ebSrica                reasons for failure (if any) follow:"
75*f875b4ebSrica                                header=yes
76*f875b4ebSrica                        fi
77*f875b4ebSrica                        echo "${line}" >&2
78*f875b4ebSrica                done
79*f875b4ebSrica                return 1
80*f875b4ebSrica        }
81*f875b4ebSrica        LPTELL=fake_lptell
82*f875b4ebSricafi
83*f875b4ebSrica
84*f875b4ebSrica#####
85*f875b4ebSrica# ${LPTSOLSEPARATOR} is the name of a program to put banner and trailer
86*f875b4ebSrica# pages around the job.
87*f875b4ebSrica#####
88*f875b4ebSricaif [ -x ${LOCALPATH}/lp.tsol_separator ]
89*f875b4ebSricathen
90*f875b4ebSrica	LPTSOLSEPARATOR=${LOCALPATH}/lp.tsol_separator
91*f875b4ebSricaelse
92*f875b4ebSrica	echo "${LOCALPATH}/lp.tsol_separator not found." >&2
93*f875b4ebSrica	exit 1
94*f875b4ebSricafi
95*f875b4ebSrica
96*f875b4ebSrica#####
97*f875b4ebSrica# Error message formatter:
98*f875b4ebSrica#
99*f875b4ebSrica# Invoke as
100*f875b4ebSrica#
101*f875b4ebSrica#       errmsg severity message-number problem help
102*f875b4ebSrica#
103*f875b4ebSrica# where severity is "ERROR" or "WARNING", message-number is
104*f875b4ebSrica# a unique identifier, problem is a short description of the
105*f875b4ebSrica# problem, and help is a short suggestion for fixing the problem.
106*f875b4ebSrica#####
107*f875b4ebSrica
108*f875b4ebSricaLP_ERR_LABEL="UX:lp"
109*f875b4ebSricaE_IP_ARGS=1
110*f875b4ebSricaE_IP_OPTS=2
111*f875b4ebSrica#E_IP_FILTER=3
112*f875b4ebSricaE_IP_UNKNOWN=5
113*f875b4ebSricaE_IP_BADFILE=6
114*f875b4ebSricaE_IP_ERRORS=12 	# (in slow.filter)
115*f875b4ebSrica
116*f875b4ebSricaerrmsg () {
117*f875b4ebSrica
118*f875b4ebSrica        case $1 in
119*f875b4ebSrica        ERROR )
120*f875b4ebSrica                sev="  ERROR";
121*f875b4ebSrica                ;;
122*f875b4ebSrica        WARNING )
123*f875b4ebSrica                sev="WARNING";
124*f875b4ebSrica                ;;
125*f875b4ebSrica        esac
126*f875b4ebSrica
127*f875b4ebSrica        echo "${LP_ERR_LABEL}:$2 ${sev}: $3
128*f875b4ebSrica        TO FIX: $4" >&5
129*f875b4ebSrica}
130*f875b4ebSrica
131*f875b4ebSrica###########
132*f875b4ebSrica##
133*f875b4ebSrica## Check arguments
134*f875b4ebSrica###########
135*f875b4ebSrica
136*f875b4ebSricaparse () {
137*f875b4ebSrica        echo "`expr \"$1\" : \"^[^=]*=\(.*\)\"`"
138*f875b4ebSrica}
139*f875b4ebSrica
140*f875b4ebSrica#####
141*f875b4ebSrica##
142*f875b4ebSrica## Error Cleanup and Exit
143*f875b4ebSrica##
144*f875b4ebSrica#####
145*f875b4ebSrica
146*f875b4ebSricaexit_clean()
147*f875b4ebSrica{
148*f875b4ebSrica
149*f875b4ebSrica	if [ -f "${LPTMPDIR}/pr_eexit_code.$$" ]
150*f875b4ebSrica	then
151*f875b4ebSrica		/bin/rm ${LPTMPDIR}/pr_eexit_code.$$
152*f875b4ebSrica	fi
153*f875b4ebSrica
154*f875b4ebSrica	if [ -f "${LPTMPDIR}/small_banner.$$" ]
155*f875b4ebSrica	then
156*f875b4ebSrica		/bin/rm ${LPTMPDIR}/small_banner.$$
157*f875b4ebSrica	fi
158*f875b4ebSrica
159*f875b4ebSrica	if [ -f "${LPTMPDIR}/banner.exit_code.$$" ]
160*f875b4ebSrica	then
161*f875b4ebSrica		/bin/rm ${LPTMPDIR}/banner.exit_code.$$
162*f875b4ebSrica	fi
163*f875b4ebSrica
164*f875b4ebSrica	if [ -f "${LPTMPDIR}/banner.errmsg.$$" ]
165*f875b4ebSrica	then
166*f875b4ebSrica		/bin/rm ${LPTMPDIR}/banner.errmsg.$$
167*f875b4ebSrica	fi
168*f875b4ebSrica
169*f875b4ebSrica	if [ -f "${tmpfile}" ]
170*f875b4ebSrica	then
171*f875b4ebSrica		/bin/rm "${tmpfile}"
172*f875b4ebSrica	fi
173*f875b4ebSrica
174*f875b4ebSrica	exit $1
175*f875b4ebSrica}
176*f875b4ebSrica
177*f875b4ebSrica#####
178*f875b4ebSrica#
179*f875b4ebSrica# This program is invoked as
180*f875b4ebSrica#
181*f875b4ebSrica# ${SPOOLDIR}/.../printer request-id user title copies options files...
182*f875b4ebSrica#
183*f875b4ebSrica# The first three arguments are simply reprinted on the banner page,
184*f875b4ebSrica# the fourth (copies) is used to control the number of copies to print,
185*f875b4ebSrica# the fifth (options) is a blank separated list (in a single argument)
186*f875b4ebSrica# of user or Spooler supplied options (without the -o prefix),
187*f875b4ebSrica# and the last arguments are the files to print.
188*f875b4ebSrica#####
189*f875b4ebSrica
190*f875b4ebSricaif [ $# -lt 5 ]
191*f875b4ebSricathen
192*f875b4ebSrica
193*f875b4ebSrica        errmsg ERROR ${E_IP_ARGS} \
194*f875b4ebSrica                "wrong number of arguments to interface program" \
195*f875b4ebSrica                "consult your system administrator"
196*f875b4ebSrica        exit 1
197*f875b4ebSricafi
198*f875b4ebSrica
199*f875b4ebSricaprinter=`basename $0`
200*f875b4ebSricarequest_id=$1
201*f875b4ebSricauser_name=$2
202*f875b4ebSricatitle=$3
203*f875b4ebSricacopies=$4
204*f875b4ebSricaoption_list=$5
205*f875b4ebSrica
206*f875b4ebSricashift 5
207*f875b4ebSricafiles="$*"
208*f875b4ebSrica
209*f875b4ebSrica
210*f875b4ebSrica#
211*f875b4ebSrica# debug sent to file if defined in /etc/syslog.conf
212*f875b4ebSrica# syslog.conf entry:
213*f875b4ebSrica#	lpr.debug	/path/filename
214*f875b4ebSrica#
215*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" " "
216*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "INPUT"
217*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "    \
218*f875b4ebSrica    printer : ${printer}"
219*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "    \
220*f875b4ebSrica    request_id : ${request_id}"
221*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "    \
222*f875b4ebSrica    user_name : ${user_name}"
223*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "    title : ${title}"
224*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "    \
225*f875b4ebSrica    copies : ${copies}"
226*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "    \
227*f875b4ebSrica    option_list : ${option_list}"
228*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "    files : ${files}"
229*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "	 \
230*f875b4ebSrica    spooler_key ${SPOOLER_KEY}"
231*f875b4ebSrica
232*f875b4ebSrica####
233*f875b4ebSrica# default: do print a banner
234*f875b4ebSrica####
235*f875b4ebSricanobanner=no
236*f875b4ebSricanolabels="no"
237*f875b4ebSricanofilebreak="no"
238*f875b4ebSricainlist=
239*f875b4ebSricadata_file_flag=
240*f875b4ebSrica
241*f875b4ebSricafor i in ${option_list}
242*f875b4ebSricado
243*f875b4ebSrica        case "${inlist}${i}" in
244*f875b4ebSrica
245*f875b4ebSrica        nobanner )
246*f875b4ebSrica                nobanner="yes"
247*f875b4ebSrica                ;;
248*f875b4ebSrica
249*f875b4ebSrica        nofilebreak )
250*f875b4ebSrica                nofilebreak="yes"
251*f875b4ebSrica                ;;
252*f875b4ebSrica
253*f875b4ebSrica	nolabels )
254*f875b4ebSrica		nolabels="yes"
255*f875b4ebSrica		;;
256*f875b4ebSrica
257*f875b4ebSrica        #####
258*f875b4ebSrica        #
259*f875b4ebSrica        # If you want to add simple options (e.g. -o simple)
260*f875b4ebSrica        # identify them here.
261*f875b4ebSrica        #####
262*f875b4ebSrica#       simple )
263*f875b4ebSrica#               simple="yes"
264*f875b4ebSrica# 		;;
265*f875b4ebSrica
266*f875b4ebSrica        cpi=pica )
267*f875b4ebSrica                cpi=10
268*f875b4ebSrica                ;;
269*f875b4ebSrica        cpi=elite )
270*f875b4ebSrica                cpi=12
271*f875b4ebSrica                ;;
272*f875b4ebSrica        cpi=* )
273*f875b4ebSrica                cpi=`parse ${i}`
274*f875b4ebSrica                ;;
275*f875b4ebSrica
276*f875b4ebSrica        lpi=* )
277*f875b4ebSrica                lpi=`parse ${i}`
278*f875b4ebSrica                ;;
279*f875b4ebSrica
280*f875b4ebSrica        length=* )
281*f875b4ebSrica                length=`parse ${i}`
282*f875b4ebSrica                ;;
283*f875b4ebSrica
284*f875b4ebSrica        width=* )
285*f875b4ebSrica                width=`parse ${i}`
286*f875b4ebSrica                ;;
287*f875b4ebSrica        dest=* )
288*f875b4ebSrica                dest="-d `parse ${i}`"
289*f875b4ebSrica                ;;
290*f875b4ebSrica
291*f875b4ebSrica        protocol=* )
292*f875b4ebSrica                protocol="-P `parse ${i}`"
293*f875b4ebSrica                ;;
294*f875b4ebSrica        bsdctrl=* )
295*f875b4ebSrica		controlfile="-c `parse ${i}`"
296*f875b4ebSrica                ;;
297*f875b4ebSrica        timeout=* )
298*f875b4ebSrica                timeout="-t `parse ${i}`"
299*f875b4ebSrica                ;;
300*f875b4ebSrica
301*f875b4ebSrica        data-file-type=* )
302*f875b4ebSrica                data_file_flag="-f `parse ${i}`"
303*f875b4ebSrica                ;;
304*f875b4ebSrica
305*f875b4ebSrica        #####
306*f875b4ebSrica        #
307*f875b4ebSrica        # If you want to add simple-value options (e.g. -o value=a)
308*f875b4ebSrica        # identify them here.
309*f875b4ebSrica        #####
310*f875b4ebSrica#       value=* )
311*f875b4ebSrica#		value=`parse ${i}`
312*f875b4ebSrica#		;;
313*f875b4ebSrica
314*f875b4ebSrica        #####
315*f875b4ebSrica        #
316*f875b4ebSrica        # If you want to add options that,
317*f875b4ebSrica        # take a list (e.g. -o lopt='a b c'), identif
318*f875b4ebSrica        # them here and below (look for LOPT).
319*f875b4ebSrica        #####
320*f875b4ebSrica
321*f875b4ebSrica#	flist=* | lpd=* | options=* )
322*f875b4ebSrica        flist=* | lpd=* )
323*f875b4ebSrica#LOPT   stty=* | flist=* | lpd=* | lopt=* )
324*f875b4ebSrica
325*f875b4ebSrica                inlist=`expr "${inlist}${i}" : "^\([^=]*=\)"`
326*f875b4ebSrica                case "${i}" in
327*f875b4ebSrica                ${inlist}\'*\' )
328*f875b4ebSrica                        item=`expr "${i}" : "^[^=]*='*\(.*\)'\$"`
329*f875b4ebSrica                        ;;
330*f875b4ebSrica                ${inlist}\' )
331*f875b4ebSrica                        continue
332*f875b4ebSrica                        ;;
333*f875b4ebSrica                ${inlist}\'* )
334*f875b4ebSrica                        item=`expr "${i}" : "^[^=]*='*\(.*\)\$"`
335*f875b4ebSrica                        ;;
336*f875b4ebSrica                ${inlist}* )
337*f875b4ebSrica                        item=`expr "${i}" : "^[^=]*=\(.*\)\$"`
338*f875b4ebSrica                        ;;
339*f875b4ebSrica                *\' )
340*f875b4ebSrica                        item=`expr "${i}" : "^\(.*\)'\$"`
341*f875b4ebSrica                        ;;
342*f875b4ebSrica                * )
343*f875b4ebSrica                        item="${i}"
344*f875b4ebSrica                        ;;
345*f875b4ebSrica                esac
346*f875b4ebSrica
347*f875b4ebSrica                #####
348*f875b4ebSrica                #
349*f875b4ebSrica                # We don't dare use "eval" because a clever user could
350*f875b4ebSrica                # put something in an option value that we'd end up
351*f875b4ebSrica                # exec'ing.
352*f875b4ebSrica                #####
353*f875b4ebSrica                case "${inlist}" in
354*f875b4ebSrica                flist= )
355*f875b4ebSrica                        flist="${flist} ${item}"
356*f875b4ebSrica                        ;;
357*f875b4ebSrica                lpd= )
358*f875b4ebSrica                        lpd="${lpd} ${item}"
359*f875b4ebSrica                        ;;
360*f875b4ebSrica#LOPT		lopt= )
361*f875b4ebSrica#LOPT                   lopt="${lopt} ${item}"
362*f875b4ebSrica#LOPT			;;
363*f875b4ebSrica#		options= )
364*f875b4ebSrica#			options="${options} ${item}"
365*f875b4ebSrica#			;;
366*f875b4ebSrica                esac
367*f875b4ebSrica
368*f875b4ebSrica                case "${i}" in
369*f875b4ebSrica                ${inlist}\'*\' )
370*f875b4ebSrica                        inlist=
371*f875b4ebSrica                        ;;
372*f875b4ebSrica                ${inlist}\'* )
373*f875b4ebSrica                        ;;
374*f875b4ebSrica                *\' | ${inlist}* )
375*f875b4ebSrica                        inlist=
376*f875b4ebSrica                        ;;
377*f875b4ebSrica                esac
378*f875b4ebSrica                ;;
379*f875b4ebSrica
380*f875b4ebSrica        * )
381*f875b4ebSrica                errmsg WARNING ${E_IP_OPTS} \
382*f875b4ebSrica                        "unrecognized \"-o ${i}\" option" \
383*f875b4ebSrica                        "check the option, resubmit if necessary
384*f875b4ebSrica                printing continues"
385*f875b4ebSrica                ;;
386*f875b4ebSrica        esac
387*f875b4ebSricadone
388*f875b4ebSrica
389*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}"  "term : ${TERM}"
390*f875b4ebSrica
391*f875b4ebSricaif [ -z "${FILTER}" ]
392*f875b4ebSricathen
393*f875b4ebSrica        #####
394*f875b4ebSrica        #
395*f875b4ebSrica        # If no filter is being used, we use netpr to push the
396*f875b4ebSrica	# file to the printer.
397*f875b4ebSrica        # (QUOTES ARE IMPORTANT!)
398*f875b4ebSrica        #####
399*f875b4ebSrica
400*f875b4ebSrica        case "$TERM" in
401*f875b4ebSrica                PS )
402*f875b4ebSrica                        # make the "postscript" printers use cat
403*f875b4ebSrica			# (TSOL banners are added during filtering, so we have
404*f875b4ebSrica			# to use some filter.)
405*f875b4ebSrica                        FILTER=/bin/cat
406*f875b4ebSrica                ;;
407*f875b4ebSrica                PSR )
408*f875b4ebSrica                        # make the "reverse postscript" printers reverse the
409*f875b4ebSrica                        # output and the use postio to talk to the printer
410*f875b4ebSrica                        #FILTER="/usr/lib/lp/postscript/postreverse "
411*f875b4ebSrica                        #FILTER=
412*f875b4ebSrica                        FILTER="/usr/lib/lp/postscript/postreverse "
413*f875b4ebSrica                ;;
414*f875b4ebSrica                * )
415*f875b4ebSrica                        # We don't know the type, so just assume that the
416*f875b4ebSrica                        # input and output are the same. Use netpr.
417*f875b4ebSrica                        #FILTER=/bin/cat
418*f875b4ebSrica			FILTER=
419*f875b4ebSrica                ;;
420*f875b4ebSrica        esac
421*f875b4ebSricafi
422*f875b4ebSrica
423*f875b4ebSrica####
424*f875b4ebSrica# sets default value for ordering of data and control files with
425*f875b4ebSrica# bsd protocol. Default: data files first. Administrator
426*f875b4ebSrica# may set to control file first with lpadmin -o bsdctrl=first
427*f875b4ebSrica####
428*f875b4ebSrica
429*f875b4ebSricabanner_flag=""
430*f875b4ebSricacase "${nobanner}" in
431*f875b4ebSrica	yes )
432*f875b4ebSrica		banner_flag="-b"
433*f875b4ebSrica	;;
434*f875b4ebSricaesac
435*f875b4ebSrica
436*f875b4ebSricaNETPR="/usr/lib/lp/bin/netpr ${banner_flag} ${data_file_flag} \
437*f875b4ebSrica	-I ${request_id} -U ${user_name} \
438*f875b4ebSrica	-p ${printer} ${dest} -T \"${title}\"  \
439*f875b4ebSrica	${timeout}  ${protocol} ${controlfile} "
440*f875b4ebSricaLPTELL_OPTS="-l"        # netpr sends LaserWriter style messages back
441*f875b4ebSrica
442*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "NETPR= ${NETPR}"
443*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "filter : ${FILTER}"
444*f875b4ebSrica
445*f875b4ebSricanode=`uname -n`
446*f875b4ebSricapid=$$
447*f875b4ebSricatmpfile=${LPTMPDIR}/${node}.${pid}
448*f875b4ebSrica
449*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" "tmpfile : ${tmpfile}"
450*f875b4ebSrica
451*f875b4ebSrica#####
452*f875b4ebSrica#
453*f875b4ebSrica# Set up filter for banner page
454*f875b4ebSrica#
455*f875b4ebSrica#####
456*f875b4ebSricabanner_filter=
457*f875b4ebSricacase "${TERM}" in
458*f875b4ebSricaPS | PSR )
459*f875b4ebSrica	banner_filter=" | /usr/lib/lp/postscript/postprint "
460*f875b4ebSrica	LPTELL_OPTS="-l"
461*f875b4ebSrica	;;
462*f875b4ebSricaesac
463*f875b4ebSrica
464*f875b4ebSrica#####
465*f875b4ebSrica#
466*f875b4ebSrica# Build temporary file that is the banner page
467*f875b4ebSrica#
468*f875b4ebSrica#####
469*f875b4ebSricaPAD="#####${NL}"
470*f875b4ebSricaCR="\r"
471*f875b4ebSricaNL="${CR}\n"
472*f875b4ebSricaFF=
473*f875b4ebSrica
474*f875b4ebSricasmall_banner() {
475*f875b4ebSrica        echo "${CR}\c"
476*f875b4ebSrica        echo "${PAD}\c"
477*f875b4ebSrica        echo "#####  User: ${user_name}${NL}\c"
478*f875b4ebSrica        if [ -n "${title}" ]
479*f875b4ebSrica        then
480*f875b4ebSrica                echo "##### Title: ${title}${NL}\c"
481*f875b4ebSrica        fi
482*f875b4ebSrica        echo "#####  Date: `LANG=C date '+%a %H:%M %h %d, %Y'`${NL}\c"
483*f875b4ebSrica        echo "#####   Job: ${request_id}${NL}\c"
484*f875b4ebSrica        echo "${PAD}\c"
485*f875b4ebSrica        if [ -n "${FF}" ]
486*f875b4ebSrica        then
487*f875b4ebSrica                echo "${CR}${FF}\c"
488*f875b4ebSrica        fi
489*f875b4ebSrica}
490*f875b4ebSrica
491*f875b4ebSrica#####
492*f875b4ebSrica#
493*f875b4ebSrica# Doing small banner as we don't know what printer is out there
494*f875b4ebSrica#
495*f875b4ebSrica#####
496*f875b4ebSricabanner=small_banner
497*f875b4ebSrica
498*f875b4ebSrica## Skip this for PS/PSR printers, since lp.tsol_separator handles the banners
499*f875b4ebSricaif [ "no" = "${nobanner}" -a "${TERM}" != "PSR" -a "${TERM}" != "PS" ]
500*f875b4ebSricathen
501*f875b4ebSrica	eval "${banner} ${banner_filter}" 2>&1 1>${LPTMPDIR}/small_banner.$$
502*f875b4ebSricafi
503*f875b4ebSrica
504*f875b4ebSrica###########
505*f875b4ebSrica##
506*f875b4ebSrica## Surround the job by PostScript code to produce banner
507*f875b4ebSrica## and trailerpages and page headers and footers.
508*f875b4ebSrica##
509*f875b4ebSrica###########
510*f875b4ebSrica
511*f875b4ebSricaBANNER_EXIT_CODE=${LPTMPDIR}/banner.exit_code.$$
512*f875b4ebSricaecho 0 > ${BANNER_EXIT_CODE}
513*f875b4ebSricaTSOLSEPARATOR_LOG=${LPTMPDIR}/banner.errmsg.$$
514*f875b4ebSrica
515*f875b4ebSricatsol_bannerize () {
516*f875b4ebSrica	TSOLSEPARATOR_OPTS="-e ${TSOLSEPARATOR_LOG}"
517*f875b4ebSrica
518*f875b4ebSrica	if [ "yes" = "${nolabels}" ]
519*f875b4ebSrica	then
520*f875b4ebSrica		TSOLSEPARATOR_OPTS="${TSOLSEPARATOR_OPTS} -l"
521*f875b4ebSrica	fi
522*f875b4ebSrica
523*f875b4ebSrica	if [ "yes" = "${nobanner}" ]
524*f875b4ebSrica	then
525*f875b4ebSrica		TSOLSEPARATOR_OPTS="${TSOLSEPARATOR_OPTS} -t /dev/null -b /dev/null"
526*f875b4ebSrica	fi
527*f875b4ebSrica
528*f875b4ebSrica	if [ "${TERM}" = "PSR" ]
529*f875b4ebSrica	then
530*f875b4ebSrica		TSOLSEPARATOR_OPTS="${TSOLSEPARATOR_OPTS} -r"
531*f875b4ebSrica	fi
532*f875b4ebSrica
533*f875b4ebSrica	# Get rid of the #, TAB and NL characters in the title
534*f875b4ebSrica	tsol_title=`echo $title`
535*f875b4ebSrica	tsol_title=`echo $tsol_title | sed 's/#//g'`
536*f875b4ebSrica
537*f875b4ebSrica	logger -p lpr.debug -t "tsol_netstandard: ${request_id}" \
538*f875b4ebSrica	    "banner command: ${LPTSOLSEPARATOR} ${TSOLSEPARATOR_OPTS} \
539*f875b4ebSrica	    ${printer} ${request_id} ${user_name} \"${tsol_title}\" ${file}"
540*f875b4ebSrica	${LPTSOLSEPARATOR} ${TSOLSEPARATOR_OPTS} ${printer} \
541*f875b4ebSrica	    ${request_id} ${user_name} "${tsol_title}" ${file}
542*f875b4ebSrica
543*f875b4ebSrica	echo $? > ${BANNER_EXIT_CODE}
544*f875b4ebSrica	true
545*f875b4ebSrica}
546*f875b4ebSrica
547*f875b4ebSricabannerize=tsol_bannerize
548*f875b4ebSrica
549*f875b4ebSricaif [ "yes" = "${nobanner}" -a  "yes" = "${nolabels}" ]
550*f875b4ebSricathen
551*f875b4ebSrica	bannerize=cat
552*f875b4ebSricafi
553*f875b4ebSrica
554*f875b4ebSricaif [ "${TERM}" != "PSR" -a "${TERM}" != "PS" ]
555*f875b4ebSricathen
556*f875b4ebSrica	bannerize=cat
557*f875b4ebSricafi
558*f875b4ebSrica
559*f875b4ebSrica#####
560*f875b4ebSrica#
561*f875b4ebSrica# Print banner page before job unless PS or PSR.
562*f875b4ebSrica#
563*f875b4ebSrica#####
564*f875b4ebSrica
565*f875b4ebSricaif [ "no" = "${nobanner}" -a "${TERM}" != "PSR" -a "${TERM}" != "PS" ]
566*f875b4ebSricathen
567*f875b4ebSrica	(
568*f875b4ebSrica		eval ${NETPR} ${LPTMPDIR}/small_banner.$$ 2>&1
569*f875b4ebSrica		echo $? > ${LPTMPDIR}/pr_eexit_code.$$
570*f875b4ebSrica	) | ${LPTELL} ${LPTELL_OPTS} ${printer}
571*f875b4ebSrica
572*f875b4ebSrica	exit_code=`cat ${LPTMPDIR}/pr_eexit_code.$$`
573*f875b4ebSrica	logger -p lpr.debug -t "tsol_netstandard: ${request_id}"	\
574*f875b4ebSrica		"banner page exit code : ${exit_code}"
575*f875b4ebSrica
576*f875b4ebSricafi
577*f875b4ebSrica
578*f875b4ebSricai=1
579*f875b4ebSricawhile [ $i -le $copies ]
580*f875b4ebSricado
581*f875b4ebSrica        for file in ${files}
582*f875b4ebSrica        do
583*f875b4ebSrica                if [ -r "${file}" ]
584*f875b4ebSrica                then
585*f875b4ebSrica
586*f875b4ebSrica			if [ ! -z "${FILTER}" ]
587*f875b4ebSrica			then
588*f875b4ebSrica 				(
589*f875b4ebSrica					#####
590*f875b4ebSrica					# There is a filter, use it
591*f875b4ebSrica					#
592*f875b4ebSrica					# Put 0<${file} before the "eval" to keep
593*f875b4ebSrica					# clever users from giving a file name that
594*f875b4ebSrica					# evaluates as something to execute.
595*f875b4ebSrica					# Redirect stderr to stdout so LPTELL will
596*f875b4ebSrica					# get error messages from pipe.
597*f875b4ebSrica					#####
598*f875b4ebSrica					0<${file} $bannerize | eval ${FILTER} 2>&1 1>${tmpfile}
599*f875b4ebSrica					echo $? > ${LPTMPDIR}/pr_eexit_code.$$
600*f875b4ebSrica				) | ${LPTELL} ${LPTELL_OPTS} ${printer}
601*f875b4ebSrica
602*f875b4ebSrica				# if lp.tsol_separator had an error, send its logged
603*f875b4ebSrica				# error message to LPTELL.
604*f875b4ebSrica				banner_exit_code=`cat ${BANNER_EXIT_CODE}`
605*f875b4ebSrica				if [ -n "${banner_exit_code}" -a \
606*f875b4ebSrica					0 -ne "${banner_exit_code}" -a \
607*f875b4ebSrica					 -n "${LPTELL}" -a \
608*f875b4ebSrica					-r "${TSOLSEPARATOR_LOG}" ]
609*f875b4ebSrica				then
610*f875b4ebSrica					cat ${TSOLSEPARATOR_LOG} | ${LPTELL} ${printer}
611*f875b4ebSrica					echo 77 > ${LPTMPDIR}/pr_eexit_code
612*f875b4ebSrica				fi
613*f875b4ebSrica
614*f875b4ebSrica				exit_code=`cat ${LPTMPDIR}/pr_eexit_code.$$`
615*f875b4ebSrica				logger -p lpr.debug \
616*f875b4ebSrica				    -t "tsol_netstandard: ${request_id}" \
617*f875b4ebSrica					"filter exit_code : ${exit_code}"
618*f875b4ebSrica
619*f875b4ebSrica 			 	if [ -n "${exit_code}" ]
620*f875b4ebSrica 				then
621*f875b4ebSrica					if [ "${exit_code}" -eq 0 ]
622*f875b4ebSrica					then
623*f875b4ebSrica						printfile=${tmpfile}
624*f875b4ebSrica					else
625*f875b4ebSrica						####
626*f875b4ebSrica						# The filter did not succeed, so don't try to print
627*f875b4ebSrica						####
628*f875b4ebSrica							printfile=
629*f875b4ebSrica					fi
630*f875b4ebSrica				fi
631*f875b4ebSrica
632*f875b4ebSrica			else
633*f875b4ebSrica				printfile=${file}
634*f875b4ebSrica			fi
635*f875b4ebSrica
636*f875b4ebSrica			logger -p lpr.debug \
637*f875b4ebSrica			    -t "tsol_netstandard: ${request_id}" \
638*f875b4ebSrica				"printfile : ${printfile}"
639*f875b4ebSrica
640*f875b4ebSrica			#####
641*f875b4ebSrica			# Print the file
642*f875b4ebSrica			#####
643*f875b4ebSrica
644*f875b4ebSrica			if [ -r "${printfile}" ]
645*f875b4ebSrica			then
646*f875b4ebSrica				(
647*f875b4ebSrica					eval ${NETPR} ${printfile} 2>&1
648*f875b4ebSrica					echo $? > ${LPTMPDIR}/pr_eexit_code.$$
649*f875b4ebSrica				) | ${LPTELL} ${LPTELL_OPTS} ${printer}
650*f875b4ebSrica
651*f875b4ebSrica				exit_code=`cat ${LPTMPDIR}/pr_eexit_code.$$`
652*f875b4ebSrica				logger -p lpr.debug \
653*f875b4ebSrica				    -t "tsol_netstandard: ${request_id}" \
654*f875b4ebSrica					"netpr exit_code : ${exit_code}"
655*f875b4ebSrica
656*f875b4ebSrica#				if [ -f "${tmpfile}" ]
657*f875b4ebSrica#				then
658*f875b4ebSrica#					/bin/rm "${tmpfile}"
659*f875b4ebSrica#				fi
660*f875b4ebSrica
661*f875b4ebSrica				if [ -n "${exit_code}" ]
662*f875b4ebSrica				then
663*f875b4ebSrica					if [ "${exit_code}" -eq 0 ]
664*f875b4ebSrica					then
665*f875b4ebSrica						printone=yes
666*f875b4ebSrica					else
667*f875b4ebSrica						if [ "${exit_code}" -lt 128 ]
668*f875b4ebSrica						then
669*f875b4ebSrica							noprint=yes
670*f875b4ebSrica						else
671*f875b4ebSrica							retry=yes
672*f875b4ebSrica						fi
673*f875b4ebSrica					fi
674*f875b4ebSrica				fi
675*f875b4ebSrica
676*f875b4ebSrica
677*f875b4ebSrica			else
678*f875b4ebSrica
679*f875b4ebSrica				errmsg WARNING ${E_IP_BADFILE} \
680*f875b4ebSrica				"cannot read temporary file \"${printfile}\""\
681*f875b4ebSrica					"see if file still exists,
682*f875b4ebSrica			or consult your system administrator;
683*f875b4ebSrica			printing continues"
684*f875b4ebSrica
685*f875b4ebSrica			fi
686*f875b4ebSrica		else
687*f875b4ebSrica
688*f875b4ebSrica                        #####
689*f875b4ebSrica                        #
690*f875b4ebSrica                        # Don't complain about not being able to read
691*f875b4ebSrica                        # a file on second and subsequent copies, unless
692*f875b4ebSrica                        # we've not complained yet. This removes repeated
693*f875b4ebSrica                        # messages about the same file yet reduces the
694*f875b4ebSrica                        # chance that the user can remove a file and not
695*f875b4ebSrica                        # know that we had trouble finding it.
696*f875b4ebSrica                        #####
697*f875b4ebSrica
698*f875b4ebSrica                        if [ "${i}" -le 1 -o -z "${badfileyet}" ]
699*f875b4ebSrica                        then
700*f875b4ebSrica                                errmsg WARNING ${E_IP_BADFILE} \
701*f875b4ebSrica                                        "cannot read file \"${file}\"" \
702*f875b4ebSrica                                        "see if the file still exists and is readable,
703*f875b4ebSrica                or consult your system administrator;
704*f875b4ebSrica                printing continues"
705*f875b4ebSrica                                badfileyet=yes
706*f875b4ebSrica                        fi
707*f875b4ebSrica
708*f875b4ebSrica		fi
709*f875b4ebSrica
710*f875b4ebSrica# for file in ${files}
711*f875b4ebSrica	done
712*f875b4ebSrica	i=`expr $i + 1`
713*f875b4ebSricadone
714*f875b4ebSrica
715*f875b4ebSrica#####
716*f875b4ebSrica#
717*f875b4ebSrica# If printing in reverse order, print the banner page now
718*f875b4ebSrica# Skip this for TSOL, since lp.tsol_separator handles the banners
719*f875b4ebSrica#
720*f875b4ebSrica#####
721*f875b4ebSrica
722*f875b4ebSrica#
723*f875b4ebSrica# if [ "no" = "${nobanner}" -a "${TERM}" = "PSR" ]
724*f875b4ebSrica# then
725*f875b4ebSrica# (
726*f875b4ebSrica# 	eval ${NETPR} ${LPTMPDIR}/small_banner.$$ 2>&1
727*f875b4ebSrica#	echo $? > ${LPTMPDIR}/pr_eexit_code.$$
728*f875b4ebSrica# ) | ${LPTELL} ${LPTELL_OPTS} ${printer}
729*f875b4ebSrica# fi
730*f875b4ebSrica
731*f875b4ebSricaexit_code=`cat ${LPTMPDIR}/pr_eexit_code.$$`
732*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}"     \
733*f875b4ebSrica                "banner page exit code : ${exit_code}"
734*f875b4ebSrica
735*f875b4ebSricaif [ -n "${printone}" -a -z "${retry}" -a -z "${noprint}" ]
736*f875b4ebSricathen
737*f875b4ebSrica       	exit_code=`expr 0`
738*f875b4ebSricaelse
739*f875b4ebSrica        if [ -n "${retry}" -a -z "${printone}" -a -z "${noprint}" ]
740*f875b4ebSrica        then
741*f875b4ebSrica                exit_code=`expr 129`
742*f875b4ebSrica        else
743*f875b4ebSrica		exit_code=`expr 1`
744*f875b4ebSrica	fi
745*f875b4ebSricafi
746*f875b4ebSrica
747*f875b4ebSricalogger -p lpr.debug -t "tsol_netstandard: ${request_id}" \
748*f875b4ebSrica	"FINAL exit_code : ${exit_code}"
749*f875b4ebSrica
750*f875b4ebSricaexit_clean ${exit_code}
751