17dd7cddfSDavid du Colombier#!/bin/sh 2*593dc095SDavid du Colombier# $Id: unix-lpr.sh,v 1.5 2004/08/04 00:55:46 giles Exp $ 37dd7cddfSDavid du Colombier# 47dd7cddfSDavid du Colombier# Unix lpr filter. The default setup sends output directly to a pipe, 57dd7cddfSDavid du Colombier# which requires the Ghostscript process to fork, and thus may cause 67dd7cddfSDavid du Colombier# small systems to run out of memory/swap space. An alternative strategy, 77dd7cddfSDavid du Colombier# based on a suggestion by Andy Fyfe (andy@cs.caltech.edu), uses a named 87dd7cddfSDavid du Colombier# pipe for output, which avoids the fork and can thus save a lot of memory. 97dd7cddfSDavid du Colombier# 107dd7cddfSDavid du Colombier# Unfortunately this approach can cause problems when a print job is aborted, 117dd7cddfSDavid du Colombier# as the abort can cause one of the processes to die, leaving the process 127dd7cddfSDavid du Colombier# at the other end of the pipe hanging forever. 137dd7cddfSDavid du Colombier# 147dd7cddfSDavid du Colombier# Because of this, the named pipe method has not been made the default, 157dd7cddfSDavid du Colombier# but it may be restored by commenting out the lines referring to 167dd7cddfSDavid du Colombier# 'gsoutput' and uncommenting the lines referring to 'gspipe'. 177dd7cddfSDavid du Colombier# 187dd7cddfSDavid du Colombier 19*593dc095SDavid du Colombier# This definition is changed on install to match the 20*593dc095SDavid du Colombier# executable name set in the makefile 21*593dc095SDavid du ColombierGS_EXECUTABLE=gs 22*593dc095SDavid du Colombier 237dd7cddfSDavid du ColombierPBMPLUSPATH=/usr/local/bin 247dd7cddfSDavid du ColombierPSFILTERPATH=/usr/local/lib/ghostscript 257dd7cddfSDavid du ColombierLOCALPATH=/usr/local/bin 267dd7cddfSDavid du ColombierX11HOME=/usr/X11R6 277dd7cddfSDavid du Colombier 287dd7cddfSDavid du ColombierPATH=/bin:/usr/bin:/usr/ucb:/usr/etc 297dd7cddfSDavid du ColombierPATH=${PATH}\:${LOCALPATH}\:${PBMPLUSPATH}\:${PSFILTERPATH} 307dd7cddfSDavid du ColombierLD_LIBRARY_PATH=${X11HOME}/lib 317dd7cddfSDavid du Colombier 327dd7cddfSDavid du Colombierexport PATH LD_LIBRARY_PATH acctfile host user 337dd7cddfSDavid du Colombier 347dd7cddfSDavid du Colombieruser= host= acctfile=/dev/null 357dd7cddfSDavid du Colombier 367dd7cddfSDavid du Colombier# 377dd7cddfSDavid du Colombier# Redirect stdout to stderr (for the logfile) and open a new channel 387dd7cddfSDavid du Colombier# connected to stdout for the raw data. This enables us to keep the 397dd7cddfSDavid du Colombier# raw data separate from programmed postscript output and error messages. 407dd7cddfSDavid du Colombier# 417dd7cddfSDavid du Colombierexec 3>&1 1>&2 427dd7cddfSDavid du Colombier 437dd7cddfSDavid du Colombier# 447dd7cddfSDavid du Colombier# Get username and hostname from filter parameters 457dd7cddfSDavid du Colombier# 467dd7cddfSDavid du Colombierwhile [ $# != 0 ] 477dd7cddfSDavid du Colombierdo case "$1" in 487dd7cddfSDavid du Colombier -n) user=$2 ; shift ;; 497dd7cddfSDavid du Colombier -h) host=$2 ; shift ;; 507dd7cddfSDavid du Colombier -*) ;; 517dd7cddfSDavid du Colombier *) acctfile=$1 ;; 527dd7cddfSDavid du Colombier esac 537dd7cddfSDavid du Colombier shift 547dd7cddfSDavid du Colombierdone 557dd7cddfSDavid du Colombier 567dd7cddfSDavid du Colombier# 577dd7cddfSDavid du Colombier# Get the filter, printer device and queue type (direct/indirect) 587dd7cddfSDavid du Colombier# 597dd7cddfSDavid du Colombierfilter=`basename $0` 607dd7cddfSDavid du Colombierdevice=`dirname $0` 617dd7cddfSDavid du Colombiertype=`dirname ${device}` 627dd7cddfSDavid du Colombierdevice=`basename ${device}` 637dd7cddfSDavid du Colombierfdevname=$device 647dd7cddfSDavid du Colombiertype=`basename ${type}` 657dd7cddfSDavid du Colombier 667dd7cddfSDavid du Colombier# 677dd7cddfSDavid du Colombier# Find the bpp and number of colors, if specified 687dd7cddfSDavid du Colombier# 697dd7cddfSDavid du Colombier 707dd7cddfSDavid du Colombiercolorspec="`echo ${device} | sed 's/.*\.[0-9][0-9]*\.\([0-9][0-9]*\)$/\1/'`" 717dd7cddfSDavid du Colombierif test "$colorspec" = "${device}" 727dd7cddfSDavid du Colombierthen 737dd7cddfSDavid du Colombier colorspec="" 747dd7cddfSDavid du Colombierelse 757dd7cddfSDavid du Colombier device=`basename ${device} .$colorspec` 767dd7cddfSDavid du Colombier colorspec="-dColors=$colorspec" 777dd7cddfSDavid du Colombierfi 787dd7cddfSDavid du Colombier 797dd7cddfSDavid du Colombierbpp="`echo ${device} | sed 's/.*\.\([0-9][0-9]*\)$/\1/'`" 807dd7cddfSDavid du Colombierif test "$bpp" = "${device}" 817dd7cddfSDavid du Colombierthen 827dd7cddfSDavid du Colombier bpp=1 837dd7cddfSDavid du Colombierelse 847dd7cddfSDavid du Colombier device=`basename ${device} .$bpp` 857dd7cddfSDavid du Colombierfi 867dd7cddfSDavid du Colombier 877dd7cddfSDavid du Colombier# 887dd7cddfSDavid du Colombier# Information for the logfile 897dd7cddfSDavid du Colombier# 907dd7cddfSDavid du Colombierlock=`dirname ${acctfile}`/lock 91*593dc095SDavid du Colombiercf=`sed -n '$p' ${lock}` 92*593dc095SDavid du Colombierjob=`sed -n 's/^J//p' ${cf}` 937dd7cddfSDavid du Colombier 947dd7cddfSDavid du Colombierecho "gsbanner: ${host}:${user} Job: ${job} Date: `date`" 957dd7cddfSDavid du Colombierecho "gsif: ${host}:${user} ${fdevname} start - `date`" 967dd7cddfSDavid du Colombier 977dd7cddfSDavid du Colombier# 987dd7cddfSDavid du Colombier# Set the direct or indirect output destinations 997dd7cddfSDavid du Colombier# 1007dd7cddfSDavid du Colombier#gspipe=/tmp/gspipe.$$ 1017dd7cddfSDavid du Colombier#mknod ${gspipe} p 1027dd7cddfSDavid du Colombier 1037dd7cddfSDavid du Colombiercase "${type}" in 1047dd7cddfSDavid du Colombier direct) 1057dd7cddfSDavid du Colombier gsoutput="cat 1>&3" ;; 1067dd7cddfSDavid du Colombier# cat ${gspipe} 1>&3 & ;; 1077dd7cddfSDavid du Colombier indirect) 1087dd7cddfSDavid du Colombier gsoutput="lpr -P${device}.raw" ;; 1097dd7cddfSDavid du Colombier# cat ${gspipe} | lpr -P${device}.raw & ;; 1107dd7cddfSDavid du Colombieresac 1117dd7cddfSDavid du Colombier 1127dd7cddfSDavid du Colombier( 1137dd7cddfSDavid du Colombier# 1147dd7cddfSDavid du Colombier# Any setup required may be done here (eg. setting gamma for colour printing) 1157dd7cddfSDavid du Colombier# 1167dd7cddfSDavid du Colombier#echo "{0.333 exp} dup dup currenttransfer setcolortransfer" 1177dd7cddfSDavid du Colombier 1187dd7cddfSDavid du Colombier# 1197dd7cddfSDavid du Colombier# The input data is filtered here, before being passed on to Ghostscript 1207dd7cddfSDavid du Colombier# 1217dd7cddfSDavid du Colombiercase "${filter}" in 1227dd7cddfSDavid du Colombier gsif) cat ;; 1237dd7cddfSDavid du Colombier gsnf) psdit ;; 1247dd7cddfSDavid du Colombier gstf) pscat ;; 1257dd7cddfSDavid du Colombier gsgf) psplot ;; 1267dd7cddfSDavid du Colombier gsvf) rasttopnm | pnmtops ;; 1277dd7cddfSDavid du Colombier gsdf) dvi2ps -sqlw ;; 1287dd7cddfSDavid du Colombier gscf|gsrf) echo "${filter}: filter not available" 1>&2 ; exit 0 ;; 1297dd7cddfSDavid du Colombieresac 1307dd7cddfSDavid du Colombier 1317dd7cddfSDavid du Colombier# 1327dd7cddfSDavid du Colombier# This is the postlude which does the accounting 1337dd7cddfSDavid du Colombier# 1347dd7cddfSDavid du Colombierecho "\ 1357dd7cddfSDavid du Colombier(acctfile) getenv 1367dd7cddfSDavid du Colombier { currentdevice /PageCount gsgetdeviceprop dup cvi 0 gt 1377dd7cddfSDavid du Colombier { exch (a) file /acctfile exch def 1387dd7cddfSDavid du Colombier /string 20 string def 1397dd7cddfSDavid du Colombier string cvs dup length dup 1407dd7cddfSDavid du Colombier 4 lt 1417dd7cddfSDavid du Colombier { 4 exch sub 1427dd7cddfSDavid du Colombier { acctfile ( ) writestring } repeat 1437dd7cddfSDavid du Colombier } { pop } ifelse 1447dd7cddfSDavid du Colombier acctfile exch writestring 1457dd7cddfSDavid du Colombier acctfile (.00 ) writestring 1467dd7cddfSDavid du Colombier acctfile (host) getenv 1477dd7cddfSDavid du Colombier { string cvs } { (NOHOST) } ifelse writestring 1487dd7cddfSDavid du Colombier acctfile (:) writestring 1497dd7cddfSDavid du Colombier acctfile (user) getenv 1507dd7cddfSDavid du Colombier { string cvs } { (NOUSER) } ifelse writestring 1517dd7cddfSDavid du Colombier acctfile (\n) writestring 1527dd7cddfSDavid du Colombier acctfile closefile 1537dd7cddfSDavid du Colombier } { pop } ifelse 1547dd7cddfSDavid du Colombier } if 1557dd7cddfSDavid du Colombierquit" 156*593dc095SDavid du Colombier) | $GS_EXECUTABLE -q -dNOPAUSE -sDEVICE=${device} \ 157*593dc095SDavid du Colombier -dBitsPerPixel=${bpp} $colorspec \ 1587dd7cddfSDavid du Colombier -sOutputFile=\|"${gsoutput}" - 1597dd7cddfSDavid du Colombier# -sOutputFile=${gspipe} - 1607dd7cddfSDavid du Colombier 1617dd7cddfSDavid du Colombierrm -f ${gspipe} 1627dd7cddfSDavid du Colombier# 1637dd7cddfSDavid du Colombier# End the logfile entry 1647dd7cddfSDavid du Colombier# 1657dd7cddfSDavid du Colombierecho "gsif: end - `date`" 1667dd7cddfSDavid du Colombier 167