RMDAYS=3
LOGO=/usr/lib/lprfax/logo.eps

Make_Coverpage() {

	cat >banner.tex <<EOF
	\documentclass{article}
	\usepackage{graphicx}
	\begin{document}
	\pagestyle{empty}
	\bf\LARGE
	\begin{center}

	\includegraphics[width=0.7\textwidth]{$LOGO}

	\vspace{0.5in}
	\textbf{\textit{\Huge Facsimile}}

	\vspace{1in}

	\begin{tabular}[t]{ll}
	  To: & $TONAME \\\\
	      & $NUMBER\\\\
	  From: & $FROMNAME\\\\
	        & $ID\\\\
	  Date: & $(date)\\\\
	  Files: & $FILES\\\\
	  Pages: & $PAGES
	\end{tabular}

	\end{center}

	\end{document}

EOF

	if ! latex banner.tex >latex.out; then
	    echo Latex failure >&2
	    cat latex.out >&2
	    exit 2
	fi

	Erun 2 dvips banner.dvi 2>/dev/null -o banner.ps

	Erun 2 cat banner.ps | gs  -q -dSAFER -dNOPAUSE -r300 -sDEVICE=faxg3 -r204x196 -sOutputFile=- -

}


Lookup_Names() {

	NUMBER=$1
	TONAME="To whom it may concern"
	FROMNAME=""
	if [ -x /usr/bin/finger ] ; then
		FROMNAME=$(echo $(finger $USER@$HOST |grep Username:) | cut -f6- -d\  )
	fi
	if [ "$FROMNAME" = "" ] ; then
		FROMNAME=$USER@$HOST
	fi

}

# Allow user customization to override above
test -r /etc/lprfax/lprfax.conf && . /etc/lprfax/lprfax.conf

MPC=/etc/lprfax/printcap
SFC=/etc/mgetty/sendfax.config
SFH=/etc/mgetty/faxheader
LIBDIR=/usr/lib/lprfax

SUCCESS=0
RETRY=1
ABORT=2
REMOVE=3
HOLD=6

SEP=1
SEPSTR="\$SEP"
JOIN="g3join -s $SEP"
SPLIT="g3split -s $SEP"

SNDQEXT="_snd"
HDRQEXT="_hdr"

Erun() {

	EV=$1
	shift
	if ! $@ ; then	
		echo "$@ fails" >&2
		exit $EV
	fi

}

#
# lpd.conf manipulation
#

Get_Conf_Path() {

	if [ -r /etc/lprng/lpd.conf ] ; then
		echo /etc/lprng/lpd.conf
	else
		if [ -r /etc/lpd.conf ] ; then
			echo /etc/lpd.conf
		fi
	fi

}


Get_Lpd_Var() {

    local SRCH="\<$1[[:space:]]*=[[:space:]]*"
    local LPC=$(Get_Conf_Path)	
    test -r $LPC && 
	cat $LPC | grep "$SRCH" | 
	sed "s,.*$SRCH\([[:alnum:][:punct:]]*\).*,\1,g" | tail -1l

}

Add_Printcappath() {

	local i
	local j
	local LPC=$(Get_Conf_Path)
	local PP=$(Get_Lpd_Var printcap_path)
	local SRCH="^[^#]*\<printcap_path[[:space:]]*=[[:space:]]*"

	j=0
	for i in $(echo $PP | tr ':' ' '); do
		if [ "$i" = "$MPC" ] ; then
			j=1;
		fi
	done

	if [ $j = 0 ] ; then
		if grep "$SRCH" $LPC >/dev/null; then
			k=$(tempfile -m 644)
			cat $LPC | 
				sed "s,\($SRCH\)\([[:alnum:][:punct:]]*\),\1\2:$MPC,1" >$k
			mv $k $LPC
		else
			if [ "$PP" != "" ] ; then
				PP="$PP:"
			fi
			echo printcap_path=$PP$MPC >>$LPC
		fi
	fi

}

Clear_Printcappath() {

	local k
	local LPC=$(Get_Conf_Path)
	k=$(tempfile -m 644)
	cat $LPC | 
	    sed "s,:*$MPC,,g" | 
	    sed '/^printcap_path=$/d' >$k
	mv $k $LPC

}

#
# sendfax.config manipulation
#

SENDFAX_COMMENT="#Added-by-lprfax----delete-this-comment-to-keep-following-line"

Add_Sendfax() {

	k=$(tempfile -m 644)
	cat $SFC | 
		awk '{
			print
			if ($1 == "port" && $2 == "'$1'") {
				i=1;
				printf("%s\n\tfax-id %s\n","'$SENDFAX_COMMENT'","'$2'");
			}
		} END {
			if (!i) {
				printf("%s\nport %s\n","'$SENDFAX_COMMENT'","'$1'");
				printf("%s\n\tfax-id %s\n","'$SENDFAX_COMMENT'","'$2'");
			}
		}' >$k
	mv $k $SFC

}

Clear_Sendfax() {

	k=$(tempfile -m 644)
	cat $SFC | 
		awk '/'$SENDFAX_COMMENT'/ {i=2} {if (i) {i--;next} print}' >$k
	mv $k $SFC

}

Get_Faxid() {

	local SER=$(echo $1 | cut -f1 -d_)
	cat $SFC | 
		awk '{
			if ($1 == "port") {
			    if ($2 == "'$SER'")
				i=1;
			    else	       
				i=0;
			    next;
			}
			if (i && $1 == "fax-id") 
			    print $2
		    }'

}


#
# lprfax printcap manipulation
#

Add_Serverqueues() {

	local k
	k=$(tempfile -m 644)
	cat $MPC | awk '/^faxint/ {printf("%s%s\n",$0,"'$1'");next} {print}' >$k
	mv $k $MPC
	echo >>$MPC
	for i in $(echo $1 | tr ',' ' '); do
		echo $i:tc=.banner:lp=${i}${HDRQEXT}@localhost >>$MPC
		echo ${i}${HDRQEXT}:tc=.header:lp=${i}${SNDQEXT}@localhost >>$MPC
		echo ${i}${SNDQEXT}:tc=.send >>$MPC
		echo >>$MPC
	done

}

Clear_Serverqueues() {

	local SQ=$(Server_Queues)
	for i in $(echo $SQ | tr ',' ' '); do
	    rm -rf /var/spool/lpd/$i*
	done
	k=$(tempfile -m 644)
	cat $MPC | 
	    awk '/^faxint/ {i=1;print;next} {if (!i) print}' |
	    sed 's,\(^faxint.*:sv=\).*$,\1,1' >$k
	mv $k $MPC

}


Server_Queues() {

	cat $MPC | 
		grep '^faxint' |
		sed 's,.*:sv=,,1'

}

Check_Server_Queues() {

	local SQ=$(Server_Queues)
	/usr/sbin/checkpc -f -Pfax
	/usr/sbin/checkpc -f -Pfaxint
	for i in $(echo $SQ | tr ',' ' '); do
		/usr/sbin/checkpc -f -P$i
		/usr/sbin/checkpc -f -P$i$HDRQEXT
		/usr/sbin/checkpc -f -P$i$SNDQEXT
	done

}

Clean_Server_Queues() {

	local SQ=$(Server_Queues)
	/usr/sbin/checkpc -r -A${RMDAYS}d -Pfax
	/usr/sbin/checkpc -r -A${RMDAYS}d -Pfaxint
	for i in $(echo $SQ | tr ',' ' '); do
		/usr/sbin/checkpc -r -A${RMDAYS}d -P$i
		/usr/sbin/checkpc -r -A${RMDAYS}d -P$i$HDRQEXT
		/usr/sbin/checkpc -r -A${RMDAYS}d -P$i$SNDQEXT
	done

}

#
# printer control
#

Reload_Printer() {

	if [ -r /var/run/lprng/lpd.* ] ; then
		for i in $(ls -1 /var/run/lprng/lpd.*) ; do
		    kill -HUP $(cat $i)
		done
	fi

}

#
# Fax file manipulation
#

Fax_Headers() {

	local HF=/usr/lib/mgetty-fax/cour25.pbm
	local DATE=$(date)
	if ! [ -r $HF ] ; then
		HF=/usr/lib/mgetty+sendfax/cour25.pbm
	fi
	Erun $ABORT [ -r $HF ] 
	let c=1
	for i in $@; do
	    ( set -e ; cat $SFH | sed \
		-e "s;@T@;$NUMBER;g" \
		-e "s;@P@;$c;g" \
		-e "s;@M@;$PAGES;g" \
		-e "s;@U@;$USER;g" \
		-e "s;@N@;$FROMNAME;g" \
		-e "s;@D@;$TONAME;g" \
		-e "s;@ID@;$ID;g" \
		-e "s;@DATE@;$DATE;g" \
	    | pbmtext -font $HF | pbm2g3 \
	    | g3cat - $i > tmp )
            if [ $? != 0 ] ; then
		echo Cannot place faxheader on $i >&2
		exit $REMOVE
            fi
	    Erun $ABORT mv tmp $i
	    let c=$c+1
	done

}


#
# Fax transmission
#

Check_Sendfax() {

	if ! [ -x $LIBDIR/sendfax ] ||
		[ /usr/sbin/sendfax -nt $LIBDIR/sendfax ] ; then
		Erun $ABORT cp /usr/sbin/sendfax $LIBDIR
		Erun $ABORT $LIBDIR/bpatch $LIBDIR/sendfax /var/log/mgetty/sendfax.log sendfax.log
	fi
	Erun $ABORT test -x $LIBDIR/sendfax

}

Do_Fax() {

	local e
	Erun $ABORT test -x $LIBDIR/sendfax
	touch sendfax.log
	tail -f sendfax.log >&2 &
	pid=$!
	$LIBDIR/sendfax -l $(echo $PRINTER | cut -f1 -d_) $NUMBER $(ls -1 *.g3)
	case $? in
	    0) e=$SUCCESS; REASON="Success";;	
	    1) e=$REMOVE; REASON="Sendfax Command Line error";;
	    2) e=$RETRY; REASON="Cannot open fax device $DEVICE";;
	    3) e=$ABORT; REASON="Cannot initialize modem";;
	    4) e=$RETRY; REASON="$NUMBER is busy";;
	    5) e=$ABORT; REASON="No dialtone";;
	    10) e=$RETRY; REASON="No carrier";;
	    11) e=$RETRY; REASON="Timeout waiting for XON";;
	    12) e=$RETRY; REASON="Error in transmission";;
	    15) e=$RETRY; REASON="Job terminated prematurely";;
	esac
	kill $pid
	grep '#####' sendfax.log >&2
	return $e

}

#
# Queue manipulation
#

Do_Retries() {

	SQ=$(Server_Queues)
	for i in $(echo $SQ | tr ',' ' ') ; do
		j=$(lpq -P${i}${SNDQEXT} |grep ^hold | awk '{print $4}')
		k=$(lpq -P${i}${SNDQEXT} |grep ^error | awk '{print $4}')
		for l in $j $k; do
			/usr/sbin/lpc release ${i}${SNDQEXT} $l
		done
	done

}

#
# Filter utilities
#


Cleanup() {

	Erun $ABORT cd $SPOOLD
	Erun $ABORT rm -rf $WD

}

Parse_Args() {

	while [ $# -ne 0 ] ; do
	    k=$(echo $1 | cut -c2-2)
	    case $k in
	    j)
		JOB="$(echo $1 | cut -c3- | awk '{printf("%03d",$1)}')"
	    ;;
	    H)
		HOST=$(echo $1 | cut -c3-)
	    ;;
	    C)
		CLASS=$(echo $1 | cut -c3-)
	    ;;
	    J)
		NUMBER=$(echo $(echo $1 |cut -c3-) | cut -f1 -d\ )
	    ;;
	    P)
		PRINTER=$(echo $1 |cut -c3-)
	    ;;
	    L)
		USER=$(echo $1 |cut -c3-)
	    ;;
	    k)
		CONTROL_FILE=$(echo $1 |cut -c3-)
	    ;;
	    a)
		ACCOUNTING_FILE=$(echo $1 |cut -c3-)
	    ;;
	    *)
	    ;;
	    esac
	    shift 1
	done

}

Test_Number() {

	let i=$NUMBER
	if [ "$NUMBER" = "" ] || [ $i = 0 ] ; then
		echo "Bad desination phone number: $NUMBER" >&2
		exit $REMOVE
	fi

}	

Script_Init() {

	export PATH=$LIBDIR:$PATH
	Parse_Args $@

	WD=$(basename $0).$$
	SPOOLD=$(pwd)

	Erun $ABORT rm -rf $WD
	Erun $ABORT mkdir $WD
	Erun $ABORT cd  $WD

	trap Cleanup exit

}

