diff options
author | rsc <devnull@localhost> | 2005-08-31 02:18:29 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-08-31 02:18:29 +0000 |
commit | 262ecfed9f7e39811f34517d82e848b8ec20f863 (patch) | |
tree | b9947441be3e7b6a3d7c5e944854591e1b027bfb /src/cmd/lp/lp.rc | |
parent | 2863ba101f0c9fec34756948e263cd534a3634ee (diff) | |
download | plan9port-262ecfed9f7e39811f34517d82e848b8ec20f863.tar.gz plan9port-262ecfed9f7e39811f34517d82e848b8ec20f863.tar.bz2 plan9port-262ecfed9f7e39811f34517d82e848b8ec20f863.zip |
Initial lp.
Diffstat (limited to 'src/cmd/lp/lp.rc')
-rwxr-xr-x | src/cmd/lp/lp.rc | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/src/cmd/lp/lp.rc b/src/cmd/lp/lp.rc new file mode 100755 index 00000000..fca6f068 --- /dev/null +++ b/src/cmd/lp/lp.rc @@ -0,0 +1,224 @@ +#!/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<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 +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 $* </dev/null + exit $status + } + +# lp +DATE=`{date} +LPLOG=$LPLOGDIR/$LPDEST +if (! test -e $LPLOG) { + >$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 '' |