123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- #!/bin/rc
- # This program enqueues the file to be printed and starts the daemon, when necessary.
- # Make changes to /sys/src/cmd/lp/lp.rc. Changes made directly to /rc/bin/lp will be lost.
- rfork en # so that environment and name space are not polluted
- #
- # put 'fn sigexit { rm /tmp/lpcrap; exit interrupted }' into processes that create /tmp/lpcrap.
- ifs='
- ' # set ifs in case it is munged in user's environment
- LPLIB=/sys/lib/lp # lp scripts directories and configuration file are here
- LPBIN=/$cputype/bin/aux # lp specific binaries are here
- LPSPOOL=$LPLIB/queue # lp queues
- LPLOGDIR=$LPLIB/log # lp logs
- $LPLIB/bin/lpscratch
- x=$status
- if(! ~ $x '') exit $x
- # build /bin from the ground up
- bind /$cputype/bin /bin # general compiled binaries
- bind -a /rc/bin /bin # general rc scripts
- # This needs to be fixed for the real thing
- bind -a $LPLIB/bin /bin # lp specific rc scripts
- bind -a $LPBIN /bin # lp specific compiled binaries
- path=(/bin)
- if (! test -w /tmp) bind -bc $LPLIB/tmp /tmp
- USAGE='usage: lp [-d printer] [-p process] [options] [files]
- lp [-d printer] -q
- lp [-d printer] -k jobnos
- options include:
- -H no header
- -L landscape mode
- -c<n> make <n> copies
- -f<font.size> specify font and size
- -i<src> take media from <src> input bin
- -l<n> print <n> lines per logical page
- -m<n> magnify <n> times
- -n<n> print <n> logical pages per physical page
- -o<i-j,k> print only pages i-j and k
- -r reverse pages
- -x<n> x page offset in inches
- -y<n> y page offset in inches'
- # umask 000 # this doesn't work in plan 9
- if (~ $#sysname 0)
- THIS_HOST=plan9
- if not {
- THIS_HOST=`{ndb/query sys $sysname dom}
- if(~ $#THIS_HOST 0)
- THIS_HOST=$sysname
- }
- LPMACHID=$THIS_HOST
- THIS_USERID=$user
- LPUSERID=$THIS_USERID
- LPLOC=''
- # Set default printer to be output device
- if (~ $#LPDEST 0 && test -f $LPLIB/defdevice) LPDEST=`{cat $LPLIB/defdevice}
- # option parameters
- XOFF=''
- YOFF=''
- POINT=''
- FONT=''
- LINES=''
- LAND=''
- COPIES=''
- MAG=''
- NPAG=''
- OLIST=''
- IBIN=''
- REVERSE=''
- NOHEAD=''
- TRAY=''
- # remove FLAGS from environment
- FLAGD=();FLAGH=();FLAGL=();FLAGM=();FLAGQ=();FLAGc=();FLAGd=();FLAGf=()
- FLAGi=();FLAGk=();FLAGl=();FLAGm=();FLAGn=();FLAGo=();FLAGp=();FLAGq=()
- FLAGr=();FLAGt=();FLAGu=();FLAGx=();FLAGy=()
- # Process options
- eval `{aux/getflags DHLM:1QRc:1d:1f:1i:1kl:1m:1n:1o:1p:1qrt:1u:1x:1y:1 $*}
- if (! ~ $status '') exit $status
- if (! ~ $#FLAGD 0) { DEBUG=1; flag x + }; if not { DEBUG=''; flag x - }
- if (! ~ $#FLAGH 0) NOHEAD=1; if not NOHEAD=''
- if (! ~ $#FLAGL 0) LAND=1; if not LAND=''
- # originating machine id (for information only)
- if (! ~ $#FLAGM 0 && ~ $LPUSERID daemon) LPMACHID=$FLAGM
- if (! ~ $#FLAGQ 0) QONLY=1; if not QONLY=''
- if (! ~ $#FLAGR 0) RESET=1; if not RESET=''
- if (! ~ $#FLAGc 0) COPIES=$FLAGc; if not COPIES=1
- if (! ~ $#FLAGd 0) {
- switch ($FLAGd) {
- case '?'; exec awk 'BEGIN{printf "device location host class\n"}
- /^[^#]/ {printf "%-12s %-9s %-20s %s\n", $1, $2, $3, $6 }' $LPLIB/devices
- case *; LPDEST=$FLAGd
- }
- }
- if (! ~ $#FLAGf 0) eval `{echo $FLAGf | sed -e 's/([^.]*)\.([0-9.]*)/FONT=\1;POINT=\2;/'}
- if (! ~ $#FLAGi 0) IBIN=$FLAGi
- if (! ~ $#FLAGk 0) KILLFLAG=1; if not KILLFLAG=0
- if (! ~ $#FLAGl 0) LINES=$FLAGl
- if (! ~ $#FLAGm 0) MAG=$FLAGm
- if (! ~ $#FLAGn 0) NPAG=$FLAGn
- if (! ~ $#FLAGo 0) OLIST=-o$FLAGo
- if (! ~ $#FLAGp 0) {
- switch (FLAGp) {
- case '?';exec ls $LPLIB/process
- case *; LPPROC=$FLAGp
- }
- }
- if (! ~ $#FLAGq 0) LPQ=1; if not LPQ=0
- if (! ~ $#FLAGr 0) {
- switch ($REVERSE) {
- case '';REVERSE=1
- case 1; REVERSE=''
- }
- }
- if (! ~ $#FLAGt 0) TRAY=$FLAGt
- # originating user id
- if (! ~ $#FLAGu 0) LPUSERID=$FLAGu
- if (! ~ $#FLAGx 0) XOFF=$FLAGx
- if (! ~ $#FLAGy 0) YOFF=$FLAGy
- if (~ $#LPDEST 0) {
- echo 'Set environment variable LPDEST or use the
- ''-d printer'' option to set the destination.' >[1=2]
- exit 'LPDEST not set'
- }
- if (~ $LPDEST */*) { # handles MHCC destinations like mh/lino
- LPLOC=`{echo $LPDEST|sed 's/^(.*)\/(.*)/\1/'}
- LPDEST=`{echo $LPDEST|sed 's/^(.*)\/(.*)/\2/'}
- }
- LPDLINE=`{grep '^'$LPDEST'[ ]' $LPLIB/devices}
- if (! ~ $status '') {
- echo 'device '$LPDEST' is not in '$LPLIB'/devices' >[1=2]
- exit 'LPDEST is bad'
- }
- LOC=$LPDLINE(2)
- DEST_HOST=$LPDLINE(3)
- OUTDEV=$LPDLINE(4)
- SPEED=$LPDLINE(5)
- LPCLASS=$LPDLINE(6)
- if (~ $#LPPROC 0) LPPROC=$LPDLINE(7)
- SPOOLER=$LPDLINE(8)
- STAT=$LPDLINE(9)
- KILL=$LPDLINE(10)
- DAEMON=$LPDLINE(11)
- SCHED=$LPDLINE(12)
- if (~ $KILLFLAG 1)
- switch ($KILL) {
- case -; echo kill option not available on $LPDEST >[1=2]
- exit 'kill n/a'
- case *; bind -b $LPLIB/kill /bin
- exec $KILL $*
- exit 'kill command '"$KILL"' not found'
- }
- if (~ $LPQ 1)
- switch ($STAT) {
- case -; echo queue status option not available on $LPDEST >[1=2]
- exit 'stat option not available'
- case *; bind -b $LPLIB/stat /bin
- exec $STAT $* < /dev/null
- exit 'stat command '"$STAT"' not found'
- }
- DATE=`{date}
- LPLOG=$LPLOGDIR/$LPDEST
- if (! test -e $LPLOG) {
- >$LPLOG
- chmod +rwa $LPLOG >[2]/dev/null
- }
- if (~ $RESET '') {
- switch ($SPOOLER) {
- case -; echo spooler does not exist for $LPDEST >[1=2]
- exit 'no spooler'
- case *; bind -b $LPLIB/spooler /bin
- if (~ $#* 0) $SPOOLER
- if not $SPOOLER $*
- }
- }
- if not {
- echo restarting daemon for printer $LPDEST >[1=2]
- UNLOCK $LPSPOOL/$LPDEST
- sleep 5
- }
- # run daemon
- if (~ $QONLY '') {
- if (! ~ $DAEMON -) {
- bind -b $LPLIB/daemon /bin
- $DAEMON $* >>$LPLOG >[2=1] &
- }
- }
- exit ''
|