summaryrefslogtreecommitdiff
path: root/lib/unix-lpr.sh
blob: 4d3a4fbfc57a3b81517780173903945ef19169a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/bin/sh
#
# Unix lpr filter. The default setup sends output directly to a pipe,
# which requires the Ghostscript process to fork, and thus may cause 
# small systems to run out of memory/swap space. An alternative strategy,
# based on a suggestion by Andy Fyfe (andy@cs.caltech.edu), uses a named
# pipe for output, which avoids the fork and can thus save a lot of memory.
#
# Unfortunately this approach can cause problems when a print job is aborted, 
# as the abort can cause one of the processes to die, leaving the process 
# at the other end of the pipe hanging forever.
#
# Because of this, the named pipe method has not been made the default,
# but it may be restored by commenting out the lines referring to
# 'gsoutput' and uncommenting the lines referring to 'gspipe'.
#

# This definition is changed on install to match the
# executable name set in the makefile
GS_EXECUTABLE=gs

PBMPLUSPATH=/usr/local/bin
PSFILTERPATH=/usr/local/lib/ghostscript
LOCALPATH=/usr/local/bin
X11HOME=/usr/X11R6

PATH=/bin:/usr/bin:/usr/ucb:/usr/etc
PATH=${PATH}\:${LOCALPATH}\:${PBMPLUSPATH}\:${PSFILTERPATH}
LD_LIBRARY_PATH=${X11HOME}/lib

export PATH LD_LIBRARY_PATH acctfile host user

user= host= acctfile=/dev/null

#
# Redirect stdout to stderr (for the logfile) and open a new channel
# connected to stdout for the raw data. This enables us to keep the
# raw data separate from programmed postscript output and error messages.
#
exec 3>&1 1>&2

#
# Get username and hostname from filter parameters
#
while [ $# != 0 ]
do  case "$1" in
  -n)	user=$2 ; shift ;;
  -h)	host=$2 ; shift ;;
  -*)	;;
  *)	acctfile=$1 ;;
  esac
  shift
done

#
# Get the filter, printer device and queue type (direct/indirect)
#
filter=`basename $0`
device=`dirname $0`
type=`dirname ${device}`
device=`basename ${device}`
fdevname=$device
type=`basename ${type}`

#
# Find the bpp and number of colors, if specified
#

colorspec="`echo ${device} | sed 's/.*\.[0-9][0-9]*\.\([0-9][0-9]*\)$/\1/'`"
if test "$colorspec" = "${device}"
then
    colorspec=""
else
    device=`basename ${device} .$colorspec`
    colorspec="-dColors=$colorspec"
fi

bpp="`echo ${device} | sed 's/.*\.\([0-9][0-9]*\)$/\1/'`"
if test "$bpp" = "${device}"
then
    bpp=1
else
    device=`basename ${device} .$bpp`
fi

#
# Information for the logfile
#
lock=`dirname ${acctfile}`/lock
cf=`sed -n '$p' ${lock}`
job=`sed -n 's/^J//p' ${cf}`
 
echo "gsbanner: ${host}:${user}  Job: ${job}  Date: `date`"
echo "gsif: ${host}:${user} ${fdevname} start - `date`"

#
# Set the direct or indirect output destinations
#
#gspipe=/tmp/gspipe.$$
#mknod ${gspipe} p

case "${type}" in
  direct)
		gsoutput="cat 1>&3" ;;
#		cat ${gspipe} 1>&3 & ;;
  indirect)
		gsoutput="lpr -P${device}.raw" ;;
#		cat ${gspipe} | lpr -P${device}.raw & ;;
esac

(
#
# Any setup required may be done here (eg. setting gamma for colour printing)
#
#echo "{0.333 exp} dup dup currenttransfer setcolortransfer"

#
# The input data is filtered here, before being passed on to Ghostscript
#
case "${filter}" in
  gsif)	  cat ;;
  gsnf)	  psdit ;;
  gstf)	  pscat ;;
  gsgf)	  psplot ;;
  gsvf)	  rasttopnm | pnmtops ;;
  gsdf)	  dvi2ps -sqlw ;;
  gscf|gsrf) echo "${filter}: filter not available" 1>&2 ; exit 0 ;;
esac

#
# This is the postlude which does the accounting
#
echo "\
(acctfile) getenv
  { currentdevice /PageCount gsgetdeviceprop dup cvi 0 gt
    { exch (a) file /acctfile exch def
      /string 20 string def
      string cvs dup length dup
      4 lt
        { 4 exch sub
          { acctfile ( ) writestring } repeat
        } { pop } ifelse
      acctfile exch writestring
      acctfile (.00 ) writestring
      acctfile (host) getenv 
        { string cvs } { (NOHOST) } ifelse writestring
      acctfile (:) writestring
      acctfile (user) getenv
        { string cvs } { (NOUSER) } ifelse writestring
      acctfile (\n) writestring
      acctfile closefile
    } { pop } ifelse
  } if
quit"
) | $GS_EXECUTABLE -q -P- -dSAFER -dNOPAUSE -sDEVICE=${device} \
		-dBitsPerPixel=${bpp} $colorspec \
		-sOutputFile=\|"${gsoutput}" -
#		-sOutputFile=${gspipe} -

rm -f ${gspipe}
#
# End the logfile entry
#
echo "gsif: end - `date`"