summaryrefslogtreecommitdiff
path: root/rc/bin/lp
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 17:14:36 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 17:14:36 +0300
commit2959e1ede0ebc6fdffd7b8660f43c2ce14c9696f (patch)
treef6343b1ce11a8c87251dd27cf3d3e26b50693fa7 /rc/bin/lp
parente463eb40363ff4c68b1d903f4e0cdd0ac1c5977f (diff)
downloadplan9front-2959e1ede0ebc6fdffd7b8660f43c2ce14c9696f.tar.xz
Import sources from 2011-03-30 iso image - rc
Diffstat (limited to 'rc/bin/lp')
-rwxr-xr-xrc/bin/lp212
1 files changed, 212 insertions, 0 deletions
diff --git a/rc/bin/lp b/rc/bin/lp
new file mode 100755
index 000000000..92b9ceab2
--- /dev/null
+++ b/rc/bin/lp
@@ -0,0 +1,212 @@
+#!/bin/rc
+# lp - 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:
+ -D turn on debugging output
+ -H no header
+ -L landscape mode
+ -M<mach> print on machine <mach>
+ -Q put task only into the queue
+ -R restart printer daemon
+ -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
+ -u<userid> print as <userid>
+ -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
+COPIES=1
+FONT=''
+IBIN=''
+KILLFLAG=0
+LAND=''
+LINES=''
+LPQ=0
+MAG=''
+NOHEAD=''
+NPAG=''
+OLIST=''
+POINT=''
+RESET=''
+REVERSE=''
+QONLY=''
+TRAY=''
+XOFF=''
+YOFF=''
+
+# Process options
+flagfmt='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'
+argv0=lp
+
+if(! ifs=() eval `{aux/getflags $*}) {
+ echo $USAGE
+ exit usage
+}
+if(~ $flagd '?'){
+ awk 'BEGIN {print "device location host class"}
+/^[^#]/ { printf "%-12s %-9s %-22s %s\n", $1, $2, $3, $6 }' $LPLIB/devices
+ exit
+}
+if(~ $flagp '?'){
+ ls $LPLIB/process
+ exit
+}
+
+if (! ~ $#flagD 0) { DEBUG=1; flag x + }; if not { DEBUG=''; flag x - }
+if (! ~ $#flagH 0) NOHEAD=1
+if (! ~ $#flagL 0) LAND=1
+if (! ~ $#flagM 0 && ~ $LPUSERID daemon) LPMACHID=$flagM
+if (! ~ $#flagQ 0) QONLY=1
+if (! ~ $#flagR 0) RESET=1
+if (! ~ $#flagc 0) COPIES=$flagc
+if(! ~ $#flagd 0) 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 (! ~ $#flagl 0) LINES=$flagl
+if (! ~ $#flagm 0) MAG=$flagm
+if (! ~ $#flagn 0) NPAG=$flagn
+if (! ~ $#flago 0) OLIST=-o^$flago
+if (! ~ $#flagp 0) LPPROC=$flagp
+if (! ~ $#flagq 0) LPQ=1
+if (! ~ $#flagr 0) REVERSE=1
+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/'}
+}
+
+# look up device, get info
+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 (~ $LPCLASS *nohead*)
+ NOHEAD=1
+if (~ $LPCLASS *duplex*)
+ DUPLEX=1
+
+if (~ $#SCHED 0) SCHED=FIFO # everyone uses FIFO
+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 ''