#!/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 ''
