xref: /plan9/sys/src/cmd/gs/lib/unix-lpr.sh (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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