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