From 6174642093bdcef4116ae78dbdf4f2e608494258 Mon Sep 17 00:00:00 2001 From: rsc Date: Wed, 31 Aug 2005 02:15:26 +0000 Subject: Initial lp. --- lp/daemon/generic | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100755 lp/daemon/generic (limited to 'lp/daemon/generic') diff --git a/lp/daemon/generic b/lp/daemon/generic new file mode 100755 index 00000000..938c40a0 --- /dev/null +++ b/lp/daemon/generic @@ -0,0 +1,138 @@ +#!/usr/local/plan9/bin/rc + +rfork s + +if (! ~ $DEBUG '') flag x + + +LPDELAY=60 + +if (! ~ $#* 2 && ! ~ $#* 3) { + echo 'usage generic local_cmd _remote_cmd [ success_cmd ]' >[1=2] + exit 'argument count' +} +LOCAL_CMD=$1 +REMOTE_CMD=$2 +SUCCESS_CMD=$3 + +# we don't want to make a LOCK file unless we are at the destination +# let the spooler take care of moving it there +# this is necessary for clients and servers that share the +# same lp queue directory +if (! ~ $THIS_HOST $DEST_HOST || ! LOCK $LPSPOOL/$LPDEST/LOCK $THIS_HOST $pid) exit '' + +cd $LPSPOOL + +MAXTRY=2 +PRINTLOG=$LPLOGDIR/$LPDEST^.st + +fn schedule{ + FILE=`{lpsub sched $SCHED $LPDEST} +} + +while (schedule; ! ~ $#FILE 0) { + SCHEDLINE=`{cat $LPDEST/$FILE(1)^id} + LSLINE=`{ls -l $LPDEST/$FILE(1)} + echo `{date} start $SCHEDLINE + if (! test -s $LPDEST/.seqno) { + echo 0 > $LPDEST/.seqno + } + if not { + LPSEQNO = `{cat $LPDEST/.seqno | awk '{seqno = $1 + 1; if (seqno > 999) seqno = 0; print seqno}'} + echo $LPSEQNO > $LPDEST/.seqno + } + STARTIME=`{date} + if (! test -s $LPDEST/$FILE(1)) { + echo `{date} file $LPDEST/$FILE(1) disappeared or is empty + ls -l $LPDEST + echo $SCHEDLINE(2)$SCHEDLINE(4)' '$SCHEDLINE(3) $SCHEDLINE(5)' ! '$LSLINE(6) $STARTIME(4) >> $LPLOG + rm -f $LPDEST/$FILE $LPDEST/$FILE^id + } + if not { + if (~ $THIS_HOST $DEST_HOST) { + if (test -f $LPLIB/perm/$LPDEST && grep -s $SCHEDLINE(2) $LPLIB/perm/$LPDEST) { + echo `{date} permission denied + echo you are not allowed to use printer $LPDEST | mail $SCHEDLINE(2) + rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id + } + if not { + echo `{date} sending to printer + > $PRINTLOG + STARTIME=`{date} + @{eval $LOCAL_CMD} + rv=$status + ENDTIME=`{date} + status=$rv + if () { + echo $SCHEDLINE(1)^$SCHEDLINE(3)' '$SCHEDLINE(2)' '$SCHEDLINE(4)' + '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4) + eval $SUCCESS_CMD + rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id + } + if not { + echo $SCHEDLINE(1)^$SCHEDLINE(3)' '$SCHEDLINE(2)' '$SCHEDLINE(4)' - '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4)' status='$rv + THISTRY=`{echo $SCHEDLINE(4) + 1|hoc} + echo $SCHEDLINE(1) $SCHEDLINE(2) $SCHEDLINE(3) $THISTRY >$LPDEST/$FILE(1)^id + if (test $THISTRY -ge $MAXTRY) { + if (test -d $LPLIB/prob/$LPDEST) { + cp $LPDEST/$FILE(1) $LPLIB/prob/$LPDEST + cp $LPDEST/$FILE(1)^id $LPLIB/prob/$LPDEST + cp $PRINTLOG $LPLIB/prob/$LPDEST/$FILE(1)^log + } + upasname=daemon + mail $SCHEDLINE(2) <$LPDEST/$FILE(1)^id + if (~ $THISTRY $MAXTRY) { + upasname=daemon + mail $SCHEDLINE(2) <[2]/dev/null -- cgit v1.2.3