1 262ecfed 2005-08-31 devnull #!/usr/local/plan9/bin/rc
2 262ecfed 2005-08-31 devnull # This program enqueues the file to be printed and starts the daemon, when necessary.
3 262ecfed 2005-08-31 devnull # Make changes to /sys/src/cmd/lp/lp.rc. Changes made directly to /rc/bin/lp will be lost.
5 262ecfed 2005-08-31 devnull # rfork en # so that environment and name space are not polluted
7 262ecfed 2005-08-31 devnull # put 'fn sigexit { rm /tmp/lpcrap; exit interrupted }' into processes that create /tmp/lpcrap.
10 262ecfed 2005-08-31 devnull ' # set ifs in case it is munged in user's environment
12 262ecfed 2005-08-31 devnull LPLIB=$PLAN9/lp # lp scripts directories and configuration file are here
13 262ecfed 2005-08-31 devnull LPBIN=$PLAN9/bin/lpbin # lp specific binaries are here
14 262ecfed 2005-08-31 devnull LPSPOOL=$LPLIB/queue # lp queues
15 262ecfed 2005-08-31 devnull LPLOGDIR=$LPLIB/log # lp logs
17 262ecfed 2005-08-31 devnull # $LPLIB/bin/lpscratch || exit $status
18 262ecfed 2005-08-31 devnull LPTMP=/var/tmp
20 262ecfed 2005-08-31 devnull path=($PLAN9/bin /usr/local/bin /usr/bin /bin $LPLIB/bin $LPBIN)
22 262ecfed 2005-08-31 devnull USAGE='usage: lp [-d printer] [-p process] [options] [files]
23 262ecfed 2005-08-31 devnull lp [-d printer] -q
24 262ecfed 2005-08-31 devnull lp [-d printer] -k jobnos
26 262ecfed 2005-08-31 devnull options include:
27 262ecfed 2005-08-31 devnull -H no header
28 262ecfed 2005-08-31 devnull -L landscape mode
29 262ecfed 2005-08-31 devnull -c<n> make <n> copies
30 262ecfed 2005-08-31 devnull -f<font.size> specify font and size
31 262ecfed 2005-08-31 devnull -i<src> take media from <src> input bin
32 262ecfed 2005-08-31 devnull -l<n> print <n> lines per logical page
33 262ecfed 2005-08-31 devnull -m<n> magnify <n> times
34 262ecfed 2005-08-31 devnull -n<n> print <n> logical pages per physical page
35 262ecfed 2005-08-31 devnull -o<i-j,k> print only pages i-j and k
36 262ecfed 2005-08-31 devnull -r reverse pages
37 262ecfed 2005-08-31 devnull -x<n> x page offset in inches
38 262ecfed 2005-08-31 devnull -y<n> y page offset in inches'
40 262ecfed 2005-08-31 devnull umask 000 # this doesn't work in plan 9
41 262ecfed 2005-08-31 devnull THIS_HOST=$sysname
42 262ecfed 2005-08-31 devnull if(~ $#THIS_HOST 0)
43 262ecfed 2005-08-31 devnull THIS_HOST=`{hostname | sed 's/\..*//'}
44 262ecfed 2005-08-31 devnull if(~ $#THIS_HOST 0)
45 262ecfed 2005-08-31 devnull THIS_HOST=gnot
47 262ecfed 2005-08-31 devnull # Helpers for scripts
49 262ecfed 2005-08-31 devnull # Run a program from a /sys/lib/lp subdirectory.
50 262ecfed 2005-08-31 devnull fn lpsub {
51 262ecfed 2005-08-31 devnull _LPSUB=$1
53 262ecfed 2005-08-31 devnull _LPCMD=$1
55 262ecfed 2005-08-31 devnull @{path=($LPLIB/$_LPSUB $path); $LPLIB/$_LPSUB/$_LPCMD $*}
58 262ecfed 2005-08-31 devnull # Run a command with standard input from file $1.
59 262ecfed 2005-08-31 devnull # If $1 is '', use the current standard input.
60 262ecfed 2005-08-31 devnull fn lpinput {
61 262ecfed 2005-08-31 devnull _LPFILE=$1
63 262ecfed 2005-08-31 devnull if(~ $_LPFILE '') $*
64 262ecfed 2005-08-31 devnull if not $* < $_LPFILE
67 262ecfed 2005-08-31 devnull LPMACHID=$THIS_HOST
68 262ecfed 2005-08-31 devnull THIS_USERID=$user
69 262ecfed 2005-08-31 devnull LPUSERID=$THIS_USERID
72 262ecfed 2005-08-31 devnull # Set default printer to be output device
73 262ecfed 2005-08-31 devnull if (~ $#LPDEST 0 && test -f $LPLIB/default)
74 262ecfed 2005-08-31 devnull LPDEST=`{cat $LPLIB/default}
76 262ecfed 2005-08-31 devnull # Parse option parameters
84 262ecfed 2005-08-31 devnull COPIES=''
89 262ecfed 2005-08-31 devnull REVERSE=''
90 262ecfed 2005-08-31 devnull NOHEAD=''
92 262ecfed 2005-08-31 devnull # remove FLAGS from environment
93 262ecfed 2005-08-31 devnull FLAGD=();FLAGH=();FLAGL=();FLAGM=();FLAGQ=();FLAGc=();FLAGd=();FLAGf=()
94 262ecfed 2005-08-31 devnull FLAGi=();FLAGk=();FLAGl=();FLAGm=();FLAGn=();FLAGo=();FLAGp=();FLAGq=()
95 262ecfed 2005-08-31 devnull FLAGr=();FLAGt=();FLAGu=();FLAGx=();FLAGy=()
96 262ecfed 2005-08-31 devnull # Process options
97 262ecfed 2005-08-31 devnull eval `{getflags DHLM:1QRc:1d:1f:1i:1kl:1m:1n:1o:1p:1qrt:1u:1x:1y:1 $*}
98 262ecfed 2005-08-31 devnull if (! ~ $status '') exit $status
99 262ecfed 2005-08-31 devnull if (! ~ $#FLAGD 0) { DEBUG=1; flag x + }; if not { DEBUG=''; flag x - }
100 262ecfed 2005-08-31 devnull if (! ~ $#FLAGH 0) NOHEAD=1; if not NOHEAD=''
101 262ecfed 2005-08-31 devnull if (! ~ $#FLAGL 0) LAND=1; if not LAND=''
102 262ecfed 2005-08-31 devnull # originating machine id (for information only)
103 262ecfed 2005-08-31 devnull if (! ~ $#FLAGM 0 && ~ $LPUSERID daemon) LPMACHID=$FLAGM
104 262ecfed 2005-08-31 devnull if (! ~ $#FLAGQ 0) QONLY=1; if not QONLY=''
105 262ecfed 2005-08-31 devnull if (! ~ $#FLAGR 0) RESET=1; if not RESET=''
106 262ecfed 2005-08-31 devnull if (! ~ $#FLAGc 0) COPIES=$FLAGc; if not COPIES=1
107 262ecfed 2005-08-31 devnull if (! ~ $#FLAGd 0) {
108 262ecfed 2005-08-31 devnull switch ($FLAGd) {
109 262ecfed 2005-08-31 devnull case '?'; exec awk 'BEGIN{printf "device location host class\n"}
110 262ecfed 2005-08-31 devnull /^[^#]/ {printf "%-12s %-9s %-20s %s\n", $1, $2, $3, $6 }' $LPLIB/devices
111 262ecfed 2005-08-31 devnull case *; LPDEST=$FLAGd
114 262ecfed 2005-08-31 devnull if (! ~ $#FLAGf 0) eval `{echo $FLAGf | sed -e 's/([^.]*)\.([0-9.]*)/FONT=\1;POINT=\2;/'}
115 262ecfed 2005-08-31 devnull if (! ~ $#FLAGi 0) IBIN=$FLAGi
116 262ecfed 2005-08-31 devnull if (! ~ $#FLAGk 0) KILLFLAG=1; if not KILLFLAG=0
117 262ecfed 2005-08-31 devnull if (! ~ $#FLAGl 0) LINES=$FLAGl
118 262ecfed 2005-08-31 devnull if (! ~ $#FLAGm 0) MAG=$FLAGm
119 262ecfed 2005-08-31 devnull if (! ~ $#FLAGn 0) NPAG=$FLAGn
120 262ecfed 2005-08-31 devnull if (! ~ $#FLAGo 0) OLIST=-o$FLAGo
121 262ecfed 2005-08-31 devnull if (! ~ $#FLAGp 0) {
122 262ecfed 2005-08-31 devnull switch (FLAGp) {
123 262ecfed 2005-08-31 devnull case '?';exec ls $LPLIB/process
124 262ecfed 2005-08-31 devnull case *; LPPROC=$FLAGp
127 262ecfed 2005-08-31 devnull if (! ~ $#FLAGq 0) LPQ=1; if not LPQ=0
128 262ecfed 2005-08-31 devnull if (! ~ $#FLAGr 0) {
129 262ecfed 2005-08-31 devnull switch ($REVERSE) {
130 262ecfed 2005-08-31 devnull case '';REVERSE=1
131 262ecfed 2005-08-31 devnull case 1; REVERSE=''
134 262ecfed 2005-08-31 devnull if (! ~ $#FLAGt 0) TRAY=$FLAGt
135 262ecfed 2005-08-31 devnull # originating user id
136 262ecfed 2005-08-31 devnull if (! ~ $#FLAGu 0) LPUSERID=$FLAGu
137 262ecfed 2005-08-31 devnull if (! ~ $#FLAGx 0) XOFF=$FLAGx
138 262ecfed 2005-08-31 devnull if (! ~ $#FLAGy 0) YOFF=$FLAGy
140 262ecfed 2005-08-31 devnull if (~ $#LPDEST 0) {
141 262ecfed 2005-08-31 devnull echo 'Set environment variable LPDEST or use the
142 262ecfed 2005-08-31 devnull ''-d printer'' option to set the destination.' >[1=2]
143 262ecfed 2005-08-31 devnull exit 'LPDEST not set'
145 262ecfed 2005-08-31 devnull if (~ $LPDEST */*) { # handles MHCC destinations like mh/lino
146 262ecfed 2005-08-31 devnull LPLOC=`{echo $LPDEST|sed 's/^(.*)\/(.*)/\1/'}
147 262ecfed 2005-08-31 devnull LPDEST=`{echo $LPDEST|sed 's/^(.*)\/(.*)/\2/'}
150 262ecfed 2005-08-31 devnull # Fetch device info from devices file.
152 262ecfed 2005-08-31 devnull LPDLINE=`{grep '^'$LPDEST'[ ]' $LPLIB/devices}
153 262ecfed 2005-08-31 devnull if (! ~ $status '') {
154 262ecfed 2005-08-31 devnull echo 'device '$LPDEST' is not in '$LPLIB'/devices' >[1=2]
155 262ecfed 2005-08-31 devnull exit 'LPDEST is bad'
157 262ecfed 2005-08-31 devnull LOC=$LPDLINE(2)
158 262ecfed 2005-08-31 devnull DEST_HOST=$LPDLINE(3)
159 262ecfed 2005-08-31 devnull OUTDEV=$LPDLINE(4)
160 262ecfed 2005-08-31 devnull SPEED=$LPDLINE(5)
161 262ecfed 2005-08-31 devnull LPCLASS=$LPDLINE(6)
162 262ecfed 2005-08-31 devnull if (~ $#LPPROC 0) LPPROC=$LPDLINE(7)
163 262ecfed 2005-08-31 devnull SPOOLER=$LPDLINE(8)
164 262ecfed 2005-08-31 devnull STAT=$LPDLINE(9)
165 262ecfed 2005-08-31 devnull KILL=$LPDLINE(10)
166 262ecfed 2005-08-31 devnull DAEMON=$LPDLINE(11)
167 262ecfed 2005-08-31 devnull SCHED=$LPDLINE(12)
169 262ecfed 2005-08-31 devnull # On to the actual command-line processing.
172 262ecfed 2005-08-31 devnull if (~ $KILLFLAG 1)
173 262ecfed 2005-08-31 devnull switch ($KILL) {
175 262ecfed 2005-08-31 devnull echo kill option not available on $LPDEST >[1=2]
176 262ecfed 2005-08-31 devnull exit 'kill n/a'
178 262ecfed 2005-08-31 devnull lpsub kill $KILL $*
179 262ecfed 2005-08-31 devnull exit $status
183 262ecfed 2005-08-31 devnull if (~ $LPQ 1)
184 262ecfed 2005-08-31 devnull switch ($STAT) {
186 262ecfed 2005-08-31 devnull echo queue status option not available on $LPDEST >[1=2]
187 262ecfed 2005-08-31 devnull exit 'stat option not available'
189 262ecfed 2005-08-31 devnull lpsub stat $STAT $* </dev/null
190 262ecfed 2005-08-31 devnull exit $status
194 262ecfed 2005-08-31 devnull DATE=`{date}
195 262ecfed 2005-08-31 devnull LPLOG=$LPLOGDIR/$LPDEST
196 262ecfed 2005-08-31 devnull if (! test -e $LPLOG) {
198 262ecfed 2005-08-31 devnull chmod +rwa $LPLOG >[2]/dev/null
201 262ecfed 2005-08-31 devnull if (~ $RESET '') { # lp file
202 262ecfed 2005-08-31 devnull switch ($SPOOLER) {
203 262ecfed 2005-08-31 devnull case -; echo spooler does not exist for $LPDEST >[1=2]
204 262ecfed 2005-08-31 devnull exit 'no spooler'
205 262ecfed 2005-08-31 devnull case *; path=($LPLIB/spooler $path)
206 262ecfed 2005-08-31 devnull if (~ $#* 0) $SPOOLER
207 262ecfed 2005-08-31 devnull if not $SPOOLER $*
211 262ecfed 2005-08-31 devnull if not { # lp -R
212 262ecfed 2005-08-31 devnull echo restarting daemon for printer $LPDEST >[1=2]
213 262ecfed 2005-08-31 devnull echo `{date} restarting daemon >>$LPLOG
214 262ecfed 2005-08-31 devnull UNLOCK $LPSPOOL/$LPDEST
218 262ecfed 2005-08-31 devnull # run daemon
219 262ecfed 2005-08-31 devnull if (~ $QONLY '') { # not lp -Q
220 262ecfed 2005-08-31 devnull if (! ~ $DAEMON -) {
221 262ecfed 2005-08-31 devnull lpsub daemon $DAEMON $* >>$LPLOG >[2=1] &