1bd389b36SDavid du Colombier#!/bin/rc 2b4ed3b92SDavid du Colombier# lp - enqueues the file to be printed and starts the daemon, when necessary. 3b4ed3b92SDavid du Colombier# Make changes to /sys/src/cmd/lp/lp.rc; 4b4ed3b92SDavid du Colombier# changes made directly to /rc/bin/lp will be lost. 5bd389b36SDavid du Colombier 6219b2ee8SDavid du Colombierrfork en # so that environment and name space are not polluted 7219b2ee8SDavid du Colombier# 8219b2ee8SDavid du Colombier# put 'fn sigexit { rm /tmp/lpcrap; exit interrupted }' into processes that create /tmp/lpcrap. 9bd389b36SDavid du Colombier 10bd389b36SDavid du Colombierifs=' 11bd389b36SDavid du Colombier' # set ifs in case it is munged in user's environment 125d459b5aSDavid du Colombier 13219b2ee8SDavid du ColombierLPLIB=/sys/lib/lp # lp scripts directories and configuration file are here 14219b2ee8SDavid du ColombierLPBIN=/$cputype/bin/aux # lp specific binaries are here 157dd7cddfSDavid du ColombierLPSPOOL=$LPLIB/queue # lp queues 167dd7cddfSDavid du ColombierLPLOGDIR=$LPLIB/log # lp logs 17219b2ee8SDavid du Colombier 185d459b5aSDavid du Colombier$LPLIB/bin/lpscratch 195d459b5aSDavid du Colombierx=$status 205d459b5aSDavid du Colombierif(! ~ $x '') exit $x 21219b2ee8SDavid du Colombier 225d459b5aSDavid du Colombier# build /bin from the ground up 23219b2ee8SDavid du Colombierbind /$cputype/bin /bin # general compiled binaries 24219b2ee8SDavid du Colombierbind -a /rc/bin /bin # general rc scripts 25219b2ee8SDavid du Colombier# This needs to be fixed for the real thing 26219b2ee8SDavid du Colombierbind -a $LPLIB/bin /bin # lp specific rc scripts 27219b2ee8SDavid du Colombierbind -a $LPBIN /bin # lp specific compiled binaries 28bd389b36SDavid du Colombierpath=(/bin) 29219b2ee8SDavid du Colombier 30219b2ee8SDavid du Colombierif (! test -w /tmp) bind -bc $LPLIB/tmp /tmp 31219b2ee8SDavid du Colombier 32bd389b36SDavid du ColombierUSAGE='usage: lp [-d printer] [-p process] [options] [files] 33bd389b36SDavid du Colombier lp [-d printer] -q 34bd389b36SDavid du Colombier lp [-d printer] -k jobnos 35bd389b36SDavid du Colombier 36bd389b36SDavid du Colombier options include: 3784cb9422SDavid du Colombier -D turn on debugging output 38bd389b36SDavid du Colombier -H no header 39bd389b36SDavid du Colombier -L landscape mode 4084cb9422SDavid du Colombier -M<mach> print on machine <mach> 4184cb9422SDavid du Colombier -Q put task only into the queue 4284cb9422SDavid du Colombier -R restart printer daemon 43bd389b36SDavid du Colombier -c<n> make <n> copies 44bd389b36SDavid du Colombier -f<font.size> specify font and size 45bd389b36SDavid du Colombier -i<src> take media from <src> input bin 46bd389b36SDavid du Colombier -l<n> print <n> lines per logical page 47bd389b36SDavid du Colombier -m<n> magnify <n> times 48bd389b36SDavid du Colombier -n<n> print <n> logical pages per physical page 49bd389b36SDavid du Colombier -o<i-j,k> print only pages i-j and k 50bd389b36SDavid du Colombier -r reverse pages 5184cb9422SDavid du Colombier -u<userid> print as <userid> 52bd389b36SDavid du Colombier -x<n> x page offset in inches 5384cb9422SDavid du Colombier -y<n> y page offset in inches 5484cb9422SDavid du Colombier' 5584cb9422SDavid du Colombier 56bd389b36SDavid du Colombier# umask 000 # this doesn't work in plan 9 57bd389b36SDavid du Colombierif (~ $#sysname 0) 58bd389b36SDavid du Colombier THIS_HOST=plan9 595d459b5aSDavid du Colombierif not { 605d459b5aSDavid du Colombier THIS_HOST=`{ndb/query sys $sysname dom} 615d459b5aSDavid du Colombier if(~ $#THIS_HOST 0) 62bd389b36SDavid du Colombier THIS_HOST=$sysname 635d459b5aSDavid du Colombier} 645d459b5aSDavid du Colombier 65bd389b36SDavid du ColombierLPMACHID=$THIS_HOST 66bd389b36SDavid du ColombierTHIS_USERID=$user 67bd389b36SDavid du ColombierLPUSERID=$THIS_USERID 68bd389b36SDavid du ColombierLPLOC='' 69bd389b36SDavid du Colombier 70bd389b36SDavid du Colombier# Set default printer to be output device 71bd389b36SDavid du Colombierif (~ $#LPDEST 0 && test -f $LPLIB/defdevice) LPDEST=`{cat $LPLIB/defdevice} 72bd389b36SDavid du Colombier 73bd389b36SDavid du Colombier# option parameters 7484cb9422SDavid du ColombierCOPIES=1 75bd389b36SDavid du ColombierFONT='' 7684cb9422SDavid du ColombierIBIN='' 7784cb9422SDavid du ColombierKILLFLAG=0 78bd389b36SDavid du ColombierLAND='' 7984cb9422SDavid du ColombierLINES='' 8084cb9422SDavid du ColombierLPQ=0 81bd389b36SDavid du ColombierMAG='' 8284cb9422SDavid du ColombierNOHEAD='' 83bd389b36SDavid du ColombierNPAG='' 84bd389b36SDavid du ColombierOLIST='' 8584cb9422SDavid du ColombierPOINT='' 8684cb9422SDavid du ColombierRESET='' 87bd389b36SDavid du ColombierREVERSE='' 8884cb9422SDavid du ColombierQONLY='' 89bd389b36SDavid du ColombierTRAY='' 9084cb9422SDavid du ColombierXOFF='' 9184cb9422SDavid du ColombierYOFF='' 9284cb9422SDavid du Colombier 93bd389b36SDavid du Colombier# Process options 9464c7f6b6SDavid du Colombierflagfmt='D,H,L,Q,R,r,q,M mach,c copies,d printer,f font.size,i src,k jobnos,l lines,m magnify,n lpages,o pages,p proc,u userid,x offset,y offset' 9584cb9422SDavid du Colombierargv0=lp 9684cb9422SDavid du Colombier 9784cb9422SDavid du Colombierif(! ifs=() eval `{aux/getflags $*}) { 9884cb9422SDavid du Colombier echo $USAGE 9984cb9422SDavid du Colombier exit usage 10084cb9422SDavid du Colombier} 10184cb9422SDavid du Colombierif(~ $flagd '?'){ 1021072dfd1SDavid du Colombier awk 'BEGIN {print "device location host class"} 1031072dfd1SDavid du Colombier/^[^#]/ { printf "%-12s %-9s %-22s %s\n", $1, $2, $3, $6 }' $LPLIB/devices 10484cb9422SDavid du Colombier exit 105bd389b36SDavid du Colombier} 10684cb9422SDavid du Colombierif(~ $flagp '?'){ 10784cb9422SDavid du Colombier ls $LPLIB/process 10884cb9422SDavid du Colombier exit 109bd389b36SDavid du Colombier} 11084cb9422SDavid du Colombier 11184cb9422SDavid du Colombierif (! ~ $#flagD 0) { DEBUG=1; flag x + }; if not { DEBUG=''; flag x - } 11284cb9422SDavid du Colombierif (! ~ $#flagH 0) NOHEAD=1 11384cb9422SDavid du Colombierif (! ~ $#flagL 0) LAND=1 11484cb9422SDavid du Colombierif (! ~ $#flagM 0 && ~ $LPUSERID daemon) LPMACHID=$flagM 11584cb9422SDavid du Colombierif (! ~ $#flagQ 0) QONLY=1 11684cb9422SDavid du Colombierif (! ~ $#flagR 0) RESET=1 11784cb9422SDavid du Colombierif (! ~ $#flagc 0) COPIES=$flagc 11884cb9422SDavid du Colombierif(! ~ $#flagd 0) LPDEST=$flagd 11984cb9422SDavid du Colombierif (! ~ $#flagf 0) eval `{echo $flagf | sed -e 's/([^.]*)\.([0-9.]*)/FONT=\1;POINT=\2;/'} 12084cb9422SDavid du Colombierif (! ~ $#flagi 0) IBIN=$flagi 12184cb9422SDavid du Colombierif (! ~ $#flagk 0) KILLFLAG=1 12284cb9422SDavid du Colombierif (! ~ $#flagl 0) LINES=$flagl 12384cb9422SDavid du Colombierif (! ~ $#flagm 0) MAG=$flagm 12484cb9422SDavid du Colombierif (! ~ $#flagn 0) NPAG=$flagn 12584cb9422SDavid du Colombierif (! ~ $#flago 0) OLIST=-o^$flago 12684cb9422SDavid du Colombierif (! ~ $#flagp 0) LPPROC=$flagp 12784cb9422SDavid du Colombierif (! ~ $#flagq 0) LPQ=1 12884cb9422SDavid du Colombierif (! ~ $#flagr 0) REVERSE=1 12984cb9422SDavid du Colombierif (! ~ $#flagu 0) LPUSERID=$flagu 13084cb9422SDavid du Colombierif (! ~ $#flagx 0) XOFF=$flagx 13184cb9422SDavid du Colombierif (! ~ $#flagy 0) YOFF=$flagy 132bd389b36SDavid du Colombier 133bd389b36SDavid du Colombierif (~ $#LPDEST 0) { 134bd389b36SDavid du Colombier echo 'Set environment variable LPDEST or use the 135bd389b36SDavid du Colombier''-d printer'' option to set the destination.' >[1=2] 136bd389b36SDavid du Colombier exit 'LPDEST not set' 137bd389b36SDavid du Colombier} 138bd389b36SDavid du Colombierif (~ $LPDEST */*) { # handles MHCC destinations like mh/lino 139bd389b36SDavid du Colombier LPLOC=`{echo $LPDEST|sed 's/^(.*)\/(.*)/\1/'} 140bd389b36SDavid du Colombier LPDEST=`{echo $LPDEST|sed 's/^(.*)\/(.*)/\2/'} 141bd389b36SDavid du Colombier} 142b4ed3b92SDavid du Colombier 143b4ed3b92SDavid du Colombier# look up device, get info 144bd389b36SDavid du ColombierLPDLINE=`{grep '^'$LPDEST'[ ]' $LPLIB/devices} 145bd389b36SDavid du Colombierif (! ~ $status '') { 146bd389b36SDavid du Colombier echo 'device '$LPDEST' is not in '$LPLIB'/devices' >[1=2] 147bd389b36SDavid du Colombier exit 'LPDEST is bad' 148bd389b36SDavid du Colombier} 149bd389b36SDavid du ColombierLOC=$LPDLINE(2) 150bd389b36SDavid du ColombierDEST_HOST=$LPDLINE(3) 151bd389b36SDavid du ColombierOUTDEV=$LPDLINE(4) 152bd389b36SDavid du ColombierSPEED=$LPDLINE(5) 153bd389b36SDavid du ColombierLPCLASS=$LPDLINE(6) 154bd389b36SDavid du Colombierif (~ $#LPPROC 0) LPPROC=$LPDLINE(7) 155bd389b36SDavid du ColombierSPOOLER=$LPDLINE(8) 156bd389b36SDavid du ColombierSTAT=$LPDLINE(9) 157bd389b36SDavid du ColombierKILL=$LPDLINE(10) 158bd389b36SDavid du ColombierDAEMON=$LPDLINE(11) 159bd389b36SDavid du ColombierSCHED=$LPDLINE(12) 160*efc4291fSDavid du Colombier 161*efc4291fSDavid du Colombierif (~ $LPCLASS *nohead*) 162*efc4291fSDavid du Colombier NOHEAD=1 163*efc4291fSDavid du Colombierif (~ $LPCLASS *duplex*) 164*efc4291fSDavid du Colombier DUPLEX=1 165*efc4291fSDavid du Colombier 1661072dfd1SDavid du Colombierif (~ $#SCHED 0) SCHED=FIFO # everyone uses FIFO 167bd389b36SDavid du Colombierif (~ $KILLFLAG 1) 168bd389b36SDavid du Colombier switch ($KILL) { 169bd389b36SDavid du Colombier case -; echo kill option not available on $LPDEST >[1=2] 170bd389b36SDavid du Colombier exit 'kill n/a' 171bd389b36SDavid du Colombier case *; bind -b $LPLIB/kill /bin 172bd389b36SDavid du Colombier exec $KILL $* 173219b2ee8SDavid du Colombier exit 'kill command '"$KILL"' not found' 174bd389b36SDavid du Colombier } 175bd389b36SDavid du Colombierif (~ $LPQ 1) 176bd389b36SDavid du Colombier switch ($STAT) { 177bd389b36SDavid du Colombier case -; echo queue status option not available on $LPDEST >[1=2] 178bd389b36SDavid du Colombier exit 'stat option not available' 179bd389b36SDavid du Colombier case *; bind -b $LPLIB/stat /bin 180bd389b36SDavid du Colombier exec $STAT $* < /dev/null 181219b2ee8SDavid du Colombier exit 'stat command '"$STAT"' not found' 182bd389b36SDavid du Colombier } 183bd389b36SDavid du ColombierDATE=`{date} 1845d459b5aSDavid du ColombierLPLOG=$LPLOGDIR/$LPDEST 1855d459b5aSDavid du Colombierif (! test -e $LPLOG) { 186bd389b36SDavid du Colombier >$LPLOG 1875d459b5aSDavid du Colombier chmod +rwa $LPLOG >[2]/dev/null 188219b2ee8SDavid du Colombier} 1895d459b5aSDavid du Colombier 1905d459b5aSDavid du Colombierif (~ $RESET '') { 191bd389b36SDavid du Colombier switch ($SPOOLER) { 192bd389b36SDavid du Colombier case -; echo spooler does not exist for $LPDEST >[1=2] 193bd389b36SDavid du Colombier exit 'no spooler' 194bd389b36SDavid du Colombier case *; bind -b $LPLIB/spooler /bin 195bd389b36SDavid du Colombier if (~ $#* 0) $SPOOLER 196bd389b36SDavid du Colombier if not $SPOOLER $* 197bd389b36SDavid du Colombier } 1985d459b5aSDavid du Colombier} 1995d459b5aSDavid du Colombierif not { 2005d459b5aSDavid du Colombier echo restarting daemon for printer $LPDEST >[1=2] 2015d459b5aSDavid du Colombier UNLOCK $LPSPOOL/$LPDEST 2025d459b5aSDavid du Colombier sleep 5 2035d459b5aSDavid du Colombier} 204bd389b36SDavid du Colombier 205bd389b36SDavid du Colombier# run daemon 206bd389b36SDavid du Colombierif (~ $QONLY '') { 207bd389b36SDavid du Colombier if (! ~ $DAEMON -) { 208bd389b36SDavid du Colombier bind -b $LPLIB/daemon /bin 209219b2ee8SDavid du Colombier $DAEMON $* >>$LPLOG >[2=1] & 210bd389b36SDavid du Colombier } 211bd389b36SDavid du Colombier} 212219b2ee8SDavid du Colombierexit '' 213