tsol_netstandard_foomatic revision f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen#
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# CDDL HEADER START
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# The contents of this file are subject to the terms of the
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# Common Development and Distribution License (the "License").
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# You may not use this file except in compliance with the License.
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# or http://www.opensolaris.org/os/licensing.
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# See the License for the specific language governing permissions
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# and limitations under the License.
ed157532dafb9dc25f98fda89bc1e324c3926898Timo Sirainen#
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# When distributing Covered Code, include this CDDL HEADER in each
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# If applicable, add the following below this CDDL HEADER, with the
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# fields enclosed by brackets "[]" replaced with your own identifying
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# information: Portions Copyright [yyyy] [name of copyright owner]
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# CDDL HEADER END
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#ident "%Z%%M% %I% %E% SMI"
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# Use is subject to license terms.
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen###########
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen##
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen## Network Standard printer interface program for foomatic.
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen##
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen###########
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#####
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# We can't do much except exit if spooler/scheduler
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# cancels us.
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#####
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainentrap 'eval exit_clean 15' 15
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen####
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# Send standard error messages to /dev/null rather than to
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# the spooler. Avoids "Terminated" messages that shell puts out
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# when gets SIGTERM. Save standard error so it can be used
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# when we need it
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen####
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenexec 5>&2 2>/dev/null 3>&1
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen####
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# set some global variables
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen####
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen: ${LPTMPDIR:=/tmp}
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen: ${SPOOLDIR:=/usr/spool/lp}
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen: ${LOCALPATH:=${SPOOLDIR}/bin}
9fd2181788a61500641c66aec0f8c746b19bf830Timo SirainenPATH="/bin:/usr/bin:${LOCALPATH}"
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenexit_code=0
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# ${LPTELL} is the name of a program that will send its
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# standard input to the Spooler. It is used to forward
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# the description of a printer fault to the Spooler,
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# which uses it in an alert to the administrator.
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#####
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenif [ ! -x "${LPTELL:=${LOCALPATH}/lp.tell}" ]
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenthen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen fake_lptell () {
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen header="no"
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen while read line
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen do
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen if [ "no" = "${header}" ]
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen then
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen errmsg ERROR ${E_IP_UNKNOWN} \
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen "unknown printer/interface failure" \
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen "consult your system administrator;
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen reasons for failure (if any) follow:"
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen header=yes
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen fi
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen echo "${line}" >&2
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen done
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen return 1
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen }
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen LPTELL=fake_lptell
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenfi
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#####
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# ${LPTSOLSEPARATOR} is the name of a program to put banner and trailer
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# pages around the job.
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#####
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenif [ -x ${LOCALPATH}/lp.tsol_separator ]
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenthen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen LPTSOLSEPARATOR=${LOCALPATH}/lp.tsol_separator
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenelse
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen echo "${LOCALPATH}/lp.tsol_separator not found." >&2
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen exit 1
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenfi
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#####
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# Error message formatter:
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# Invoke as
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# errmsg severity message-number problem help
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen#
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# where severity is "ERROR" or "WARNING", message-number is
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# a unique identifier, problem is a short description of the
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen# problem, and help is a short suggestion for fixing the problem.
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#####
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo SirainenLP_ERR_LABEL="UX:lp"
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo SirainenE_IP_ARGS=1
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo SirainenE_IP_OPTS=2
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#E_IP_FILTER=3
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo SirainenE_IP_UNKNOWN=5
9fd2181788a61500641c66aec0f8c746b19bf830Timo SirainenE_IP_BADFILE=6
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo SirainenE_IP_ERRORS=12 # (in slow.filter)
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenerrmsg () {
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen case $1 in
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen ERROR )
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen sev=" ERROR";
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen ;;
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen WARNING )
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen sev="WARNING";
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen ;;
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen esac
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen echo "${LP_ERR_LABEL}:$2 ${sev}: $3
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen TO FIX: $4" >&5
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen}
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen###########
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen##
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen## Check arguments
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen###########
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenparse () {
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen echo "`expr \"$1\" : \"^[^=]*=\(.*\)\"`"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen}
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#####
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen##
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen## Error Cleanup and Exit
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen##
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#####
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenexit_clean()
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen{
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen if [ -f "${LPTMPDIR}/pr_eexit_code.$$" ]
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen then
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen /bin/rm ${LPTMPDIR}/pr_eexit_code.$$
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen fi
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen if [ -f "${LPTMPDIR}/small_banner.$$" ]
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen then
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen /bin/rm ${LPTMPDIR}/small_banner.$$
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen fi
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen if [ -f "${LPTMPDIR}/banner.exit_code.$$" ]
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen then
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen /bin/rm ${LPTMPDIR}/banner.exit_code.$$
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen fi
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen if [ -f "${LPTMPDIR}/banner.errmsg.$$" ]
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen then
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen /bin/rm ${LPTMPDIR}/banner.errmsg.$$
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen fi
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen if [ -f "${tmpfile}" ]
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen then
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen /bin/rm "${tmpfile}"
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen fi
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen
6cc4cce2078aca138fbce19305e69e77edcee614Timo Sirainen exit $1
6cc4cce2078aca138fbce19305e69e77edcee614Timo Sirainen}
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#####
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen# This program is invoked as
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainen#
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen# ${SPOOLDIR}/.../printer request-id user title copies options files...
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen#
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen# The first three arguments are simply reprinted on the banner page,
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen# the fourth (copies) is used to control the number of copies to print,
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen# the fifth (options) is a blank separated list (in a single argument)
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen# of user or Spooler supplied options (without the -o prefix),
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen# and the last arguments are the files to print.
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#####
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainenif [ $# -lt 5 ]
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenthen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen errmsg ERROR ${E_IP_ARGS} \
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen "wrong number of arguments to interface program" \
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen "consult your system administrator"
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainen exit 1
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainenfi
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainen
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainenprinter=`basename $0`
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainenrequest_id=$1
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainenuser_name=$2
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainentitle=$3
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainencopies=$4
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainenoption_list=$5
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainenshift 5
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainenfiles="$*"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
41e51b972f02e8b16c19fab9160294ea0a07c343Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen#
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# debug sent to file if defined in /etc/syslog.conf
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen# syslog.conf entry:
9c32eb25e7b90e753e0cd7b30f7a70e8ca9121d9Timo Sirainen# lpr.debug /path/filename
9c32eb25e7b90e753e0cd7b30f7a70e8ca9121d9Timo Sirainen#
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenlogger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" " "
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenlogger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" "INPUT"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenlogger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen " printer : ${printer}"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenlogger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
9c32eb25e7b90e753e0cd7b30f7a70e8ca9121d9Timo Sirainen " request_id : ${request_id}"
9c32eb25e7b90e753e0cd7b30f7a70e8ca9121d9Timo Sirainenlogger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen " user_name : ${user_name}"
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainenlogger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen " title : ${title}"
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainenlogger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen " copies : ${copies}"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenlogger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen " option_list : ${option_list}"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenlogger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
9c32eb25e7b90e753e0cd7b30f7a70e8ca9121d9Timo Sirainen " files : ${files}"
9c32eb25e7b90e753e0cd7b30f7a70e8ca9121d9Timo Sirainenlogger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen " spooler_key ${SPOOLER_KEY}"
50c617761ee9653bd44646a95178773a3686d62eTimo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen####
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# default: do print a banner
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen####
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainennobanner=no
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainennolabels="no"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainennofilebreak="no"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Siraineninlist=
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainendata_file_flag=
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainenfor i in ${option_list}
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainendo
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen case "${inlist}${i}" in
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen nobanner )
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen nobanner="yes"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen ;;
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
ed157532dafb9dc25f98fda89bc1e324c3926898Timo Sirainen nofilebreak )
ed157532dafb9dc25f98fda89bc1e324c3926898Timo Sirainen nofilebreak="yes"
ed157532dafb9dc25f98fda89bc1e324c3926898Timo Sirainen ;;
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen nolabels )
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen nolabels="yes"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen ;;
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen #####
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen #
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen # If you want to add simple options (e.g. -o simple)
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen # identify them here.
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen #####
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# simple )
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# simple="yes"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen# ;;
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen cpi=pica )
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen cpi=10
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen ;;
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen cpi=elite )
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen cpi=12
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen ;;
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen cpi=* )
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen cpi=`parse ${i}`
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen ;;
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen lpi=* )
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen lpi=`parse ${i}`
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen ;;
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen length=* )
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen length=`parse ${i}`
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen ;;
ed157532dafb9dc25f98fda89bc1e324c3926898Timo Sirainen
ed157532dafb9dc25f98fda89bc1e324c3926898Timo Sirainen width=* )
ed157532dafb9dc25f98fda89bc1e324c3926898Timo Sirainen width=`parse ${i}`
ed157532dafb9dc25f98fda89bc1e324c3926898Timo Sirainen ;;
ed157532dafb9dc25f98fda89bc1e324c3926898Timo Sirainen dest=* )
ed157532dafb9dc25f98fda89bc1e324c3926898Timo Sirainen dest="-d `parse ${i}`"
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen ;;
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen protocol=* )
8bad545017a5c2b69cf6fa06a50763b3b68fb161Timo Sirainen protocol="-P `parse ${i}`"
;;
bsdctrl=* )
controlfile="-c `parse ${i}`"
;;
timeout=* )
timeout="-t `parse ${i}`"
;;
data-file-type=* )
data_file_flag="-f `parse ${i}`"
;;
#
# The IPP/PAPI attributes are handled by the foomatic-rip filter so
# all we need to do here is ignore them so that they don't invoke the
# "unrecognized option" message.
#
finishing=* | page-ranges=* | sides=* )
;;
number-up=* | orientation-requested=* | media=* )
;;
printer-resolution=* | print-quality=* )
;;
#####
#
# If you want to add simple-value options (e.g. -o value=a)
# identify them here.
#####
# value=* )
# value=`parse ${i}`
# ;;
#####
#
# If you want to add options that,
# take a list (e.g. -o lopt='a b c'), identif
# them here and below (look for LOPT).
#####
# flist=* | lpd=* | options=* )
flist=* | lpd=* )
#LOPT stty=* | flist=* | lpd=* | lopt=* )
inlist=`expr "${inlist}${i}" : "^\([^=]*=\)"`
case "${i}" in
${inlist}\'*\' )
item=`expr "${i}" : "^[^=]*='*\(.*\)'\$"`
;;
${inlist}\' )
continue
;;
${inlist}\'* )
item=`expr "${i}" : "^[^=]*='*\(.*\)\$"`
;;
${inlist}* )
item=`expr "${i}" : "^[^=]*=\(.*\)\$"`
;;
*\' )
item=`expr "${i}" : "^\(.*\)'\$"`
;;
* )
item="${i}"
;;
esac
#####
#
# We don't dare use "eval" because a clever user could
# put something in an option value that we'd end up
# exec'ing.
#####
case "${inlist}" in
flist= )
flist="${flist} ${item}"
;;
lpd= )
lpd="${lpd} ${item}"
;;
#LOPT lopt= )
#LOPT lopt="${lopt} ${item}"
#LOPT ;;
# options= )
# options="${options} ${item}"
# ;;
esac
case "${i}" in
${inlist}\'*\' )
inlist=
;;
${inlist}\'* )
;;
*\' | ${inlist}* )
inlist=
;;
esac
;;
* )
errmsg WARNING ${E_IP_OPTS} \
"unrecognized \"-o ${i}\" option" \
"check the option, resubmit if necessary
printing continues"
;;
esac
done
logger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
"term : ${TERM}"
if [ -z "${FILTER}" ]
then
#####
#
# If no filter is being used, we use netpr to push the
# file to the printer.
# (QUOTES ARE IMPORTANT!)
#####
case "$TERM" in
PS )
# make the "postscript" printers use cat
# (TSOL banners are added during filtering, so we have
# to use some filter.)
FILTER=/bin/cat
;;
PSR )
# make the "reverse postscript" printers reverse the
# output and the use postio to talk to the printer
#FILTER="/usr/lib/lp/postscript/postreverse "
#FILTER=
FILTER="/usr/lib/lp/postscript/postreverse "
;;
* )
# We don't know the type, so just assume that the
# input and output are the same. Use netpr.
#FILTER=/bin/cat
FILTER=
;;
esac
fi
####
# sets default value for ordering of data and control files with
# bsd protocol. Default: data files first. Administrator
# may set to control file first with lpadmin -o bsdctrl=first
####
banner_flag=""
case "${nobanner}" in
yes )
banner_flag="-b"
;;
esac
NETPR="/usr/lib/lp/bin/netpr ${banner_flag} ${data_file_flag} \
-I ${request_id} -U ${user_name} \
-p ${printer} ${dest} -T \"${title}\" \
${timeout} ${protocol} ${controlfile} "
LPTELL_OPTS="-l" # netpr sends LaserWriter style messages back
PPDFILTER=/usr/lib/lp/bin/foomatic-rip
PPDFILTERA="${PPDFILTER} ${request_id} ${user_name} \"${title}\" ${copies} \"${option_list}\""
logger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
"NETPR= ${NETPR}"
logger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
"filter : ${FILTER}"
logger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
"ppdfilter : ${PPDFILTERA}"
node=`uname -n`
pid=$$
tmpfile=${LPTMPDIR}/${node}.${pid}
tmpfilefoo=${LPTMPDIR}/${node}.${pid}.1
logger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
"tmpfile : ${tmpfile}"
#####
#
# Set up filter for banner page
#
#####
banner_filter=
case "${TERM}" in
PS | PSR )
banner_filter=" | /usr/lib/lp/postscript/postprint "
LPTELL_OPTS="-l"
;;
esac
#####
#
# Build temporary file that is the banner page
#
#####
PAD="#####${NL}"
CR="\r"
NL="${CR}\n"
FF=
small_banner() {
echo "${CR}\c"
echo "${PAD}\c"
echo "##### User: ${user_name}${NL}\c"
if [ -n "${title}" ]
then
echo "##### Title: ${title}${NL}\c"
fi
echo "##### Date: `LANG=C date '+%a %H:%M %h %d, %Y'`${NL}\c"
echo "##### Job: ${request_id}${NL}\c"
echo "${PAD}\c"
if [ -n "${FF}" ]
then
echo "${CR}${FF}\c"
fi
}
#####
#
# Doing small banner as we don't know what printer is out there
#
#####
banner=small_banner
## Skip this for PS/PSR printers, since lp.tsol_separator handles the banners
if [ "no" = "${nobanner}" -a "${TERM}" != "PSR" -a "${TERM}" != "PS" ]
then
eval "${banner} ${banner_filter}" 2>&1 1>${LPTMPDIR}/small_banner.$$
fi
###########
##
## Surround the job by PostScript code to produce banner
## and trailerpages and page headers and footers.
##
###########
BANNER_EXIT_CODE=${LPTMPDIR}/banner.exit_code.$$
echo 0 > ${BANNER_EXIT_CODE}
TSOLSEPARATOR_LOG=${LPTMPDIR}/banner.errmsg.$$
tsol_bannerize () {
TSOLSEPARATOR_OPTS="-e ${TSOLSEPARATOR_LOG}"
if [ "yes" = "${nolabels}" ]
then
TSOLSEPARATOR_OPTS="${TSOLSEPARATOR_OPTS} -l"
fi
if [ "yes" = "${nobanner}" ]
then
TSOLSEPARATOR_OPTS="${TSOLSEPARATOR_OPTS} -t /dev/null -b /dev/null"
fi
if [ "${TERM}" = "PSR" ]
then
TSOLSEPARATOR_OPTS="${TSOLSEPARATOR_OPTS} -r"
fi
# Get rid of the #, TAB and NL characters in the title
tsol_title=`echo $title`
tsol_title=`echo $tsol_title | sed 's/#//g'`
logger -p lpr.debug -t "tsol_netstandard: ${request_id}" \
"banner command: ${LPTSOLSEPARATOR} ${TSOLSEPARATOR_OPTS} \
${printer} ${request_id} ${user_name} \"${tsol_title}\" ${file}"
${LPTSOLSEPARATOR} ${TSOLSEPARATOR_OPTS} ${printer} \
${request_id} ${user_name} "${tsol_title}" ${file}
echo $? > ${BANNER_EXIT_CODE}
true
}
bannerize=tsol_bannerize
if [ "yes" = "${nobanner}" -a "yes" = "${nolabels}" ]
then
bannerize=cat
fi
if [ "${TERM}" != "PSR" -a "${TERM}" != "PS" ]
then
bannerize=cat
fi
#####
#
# Print banner page before job unless PSR or PS
#
#####
## Skip this for PS/PSR printers, since lp.tsol_separator handles the banners
if [ "no" = "${nobanner}" -a "${TERM}" != "PSR" -a "${TERM}" != "PS" ]
then
(
eval ${NETPR} ${LPTMPDIR}/small_banner.$$ 2>&1
echo $? > ${LPTMPDIR}/pr_eexit_code.$$
) | ${LPTELL} ${LPTELL_OPTS} ${printer}
exit_code=`cat ${LPTMPDIR}/pr_eexit_code.$$`
logger -p lpr.debug -t \
"tsol_netstandard_foomatic: ${request_id}" \
"banner page exit code : ${exit_code}"
fi
i=1
while [ $i -le $copies ]
do
for file in ${files}
do
if [ -r "${file}" ]
then
if [ ! -z "${FILTER}" ]
then
(
#####
# There is a filter, use it
#
# Put 0<${file} before the "eval" to keep
# clever users from giving a file name that
# evaluates as something to execute.
# Redirect stderr to stdout so LPTELL will
# get error messages from pipe.
#####
0<${file} $bannerize | eval ${FILTER} 2>&1 1>${tmpfile}
echo $? > ${LPTMPDIR}/pr_eexit_code.$$
) | ${LPTELL} ${LPTELL_OPTS} ${printer}
# if lp.tsol_separator had an error,
# send its logged error message to LPTELL.
banner_exit_code=`cat ${BANNER_EXIT_CODE}`
if [ -n "${banner_exit_code}" -a \
0 -ne "${banner_exit_code}" -a \
-n "${LPTELL}" -a \
-r "${TSOLSEPARATOR_LOG}" ]
then
cat ${TSOLSEPARATOR_LOG} | ${LPTELL} ${printer}
echo 77 > ${LPTMPDIR}/pr_eexit_code
fi
exit_code=`cat ${LPTMPDIR}/pr_eexit_code.$$`
logger -p lpr.debug -t \
"tsol_netstandard_foomatic: ${request_id}" \
"filter exit_code : ${exit_code}"
if [ -n "${exit_code}" ]
then
if [ "${exit_code}" -eq 0 ]
then
printfile=${tmpfile}
else
####
# The filter did not succeed, so don't try to print
####
printfile=
fi
fi
else
printfile=${file}
fi
logger -p lpr.debug -t \
"tsol_netstandard_foomatic: ${request_id}" \
"printfile : ${printfile}"
#####
# Print the file
#####
if [ -r "${printfile}" ]
then
(
logger -p lpr.debug -t \
"@1 tsol_netstandard_foomatic: printfile = ${printfile}" ""
logger -p lpr.debug -t \
"tsol_netstandard_foomatic: ${NETPR} ${printfile}" ""
#eval ${NETPR} ${printfile} 2>&1
cat ${printfile} | ${PPDFILTER} \
${request_id} ${user_name} "${title}" ${copies} "${option_list}" \
> ${tmpfilefoo} 2> /dev/null
eval ${NETPR} ${tmpfilefoo} 2>&1
echo $? > ${LPTMPDIR}/pr_eexit_code.$$
/bin/rm -f ${tmpfilefoo}
) | ${LPTELL} ${LPTELL_OPTS} ${printer}
exit_code=`cat ${LPTMPDIR}/pr_eexit_code.$$`
logger -p lpr.debug -t \
"@2 netstandard_foomatic: ${request_id}" \
"netpr exit_code : ${exit_code}"
# if [ -f "${tmpfile}" ]
# then
# /bin/rm "${tmpfile}"
# fi
if [ -n "${exit_code}" ]
then
if [ "${exit_code}" -eq 0 ]
then
printone=yes
else
if [ "${exit_code}" -lt 128 ]
then
noprint=yes
else
retry=yes
fi
fi
fi
else
errmsg WARNING ${E_IP_BADFILE} \
"cannot read temporary file \"${printfile}\""\
"see if file still exists,
or consult your system administrator;
printing continues"
fi
else
#####
#
# Don't complain about not being able to read
# a file on second and subsequent copies, unless
# we've not complained yet. This removes repeated
# messages about the same file yet reduces the
# chance that the user can remove a file and not
# know that we had trouble finding it.
#####
if [ "${i}" -le 1 -o -z "${badfileyet}" ]
then
errmsg WARNING ${E_IP_BADFILE} \
"cannot read file \"${file}\"" \
"see if the file still exists and is readable,
or consult your system administrator;
printing continues"
badfileyet=yes
fi
fi
# for file in ${files}
done
i=`expr $i + 1`
done
#####
#
# If printing in reverse order, print the banner page now
# Skip this for TSOL, since lp.tsol_separator handles the banners
#
#####
#if [ "no" = "${nobanner}" -a "${TERM}" = "PSR" ]
#then
#(
# eval ${NETPR} ${LPTMPDIR}/small_banner.$$ 2>&1
# echo $? > ${LPTMPDIR}/pr_eexit_code.$$
#) | ${LPTELL} ${LPTELL_OPTS} ${printer}
#fi
exit_code=`cat ${LPTMPDIR}/pr_eexit_code.$$`
logger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
"banner page exit code : ${exit_code}"
if [ -n "${printone}" -a -z "${retry}" -a -z "${noprint}" ]
then
exit_code=`expr 0`
else
if [ -n "${retry}" -a -z "${printone}" -a -z "${noprint}" ]
then
exit_code=`expr 129`
else
exit_code=`expr 1`
fi
fi
logger -p lpr.debug -t "tsol_netstandard_foomatic: ${request_id}" \
"FINAL exit_code : ${exit_code}"
exit_clean ${exit_code}