#!/usr/local/plan9/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=$PLAN9/lp # lp scripts directories and configuration file are here LPBIN=$PLAN9/bin/lpbin # lp specific binaries are here LPSPOOL=$LPLIB/queue # lp queues LPLOGDIR=$LPLIB/log # lp logs # $LPLIB/bin/lpscratch || exit $status LPTMP=/var/tmp path=($PLAN9/bin /usr/local/bin /usr/bin /bin $LPLIB/bin $LPBIN) 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 make copies -f specify font and size -i take media from input bin -l print lines per logical page -m magnify times -n print logical pages per physical page -o print only pages i-j and k -r reverse pages -x x page offset in inches -y y page offset in inches' umask 000 # this doesn't work in plan 9 THIS_HOST=$sysname if(~ $#THIS_HOST 0) THIS_HOST=`{hostname | sed 's/\..*//'} if(~ $#THIS_HOST 0) THIS_HOST=gnot # Helpers for scripts # Run a program from a /sys/lib/lp subdirectory. fn lpsub { _LPSUB=$1 shift _LPCMD=$1 shift @{path=($LPLIB/$_LPSUB $path); $LPLIB/$_LPSUB/$_LPCMD $*} } # Run a command with standard input from file $1. # If $1 is '', use the current standard input. fn lpinput { _LPFILE=$1 shift if(~ $_LPFILE '') $* if not $* < $_LPFILE } LPMACHID=$THIS_HOST THIS_USERID=$user LPUSERID=$THIS_USERID LPLOC='' # Set default printer to be output device if (~ $#LPDEST 0 && test -f $LPLIB/default) LPDEST=`{cat $LPLIB/default} # Parse 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 `{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/'} } # Fetch device info from devices file. 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) # On to the actual command-line processing. # lp -k if (~ $KILLFLAG 1) switch ($KILL) { case - echo kill option not available on $LPDEST >[1=2] exit 'kill n/a' case * lpsub kill $KILL $* exit $status } # lp -q if (~ $LPQ 1) switch ($STAT) { case - echo queue status option not available on $LPDEST >[1=2] exit 'stat option not available' case * lpsub stat $STAT $* $LPLOG chmod +rwa $LPLOG >[2]/dev/null } if (~ $RESET '') { # lp file switch ($SPOOLER) { case -; echo spooler does not exist for $LPDEST >[1=2] exit 'no spooler' case *; path=($LPLIB/spooler $path) if (~ $#* 0) $SPOOLER if not $SPOOLER $* } } if not { # lp -R echo restarting daemon for printer $LPDEST >[1=2] echo `{date} restarting daemon >>$LPLOG UNLOCK $LPSPOOL/$LPDEST sleep 5 } # run daemon if (~ $QONLY '') { # not lp -Q if (! ~ $DAEMON -) { lpsub daemon $DAEMON $* >>$LPLOG >[2=1] & } } exit ''