xref: /plan9/sys/src/cmd/lp/lp.rc (revision efc4291f9554edd4b2b0148fe3a05435b4507286)
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