|  | #!/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) <<endmail1 | 
|  | rm -f $LPDEST/$FILE(1) $LPDEST/$FILE(1)^id | 
|  | } | 
|  | if not { | 
|  | touch $LPDEST/$FILE(1) | 
|  | sleep $LPDELAY | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | if not { | 
|  | # we don't want to be here | 
|  | #			trap '' 13	# temp hack: ignore SIGPIPE | 
|  | echo `{date} queuing - should not get here | 
|  | STARTIME=`{date} | 
|  | eval $REMOTE_CMD | 
|  | rv=$status | 
|  | ENDTIME=`{date} | 
|  | if (~ $rv '') { | 
|  | echo $SCHEDLINE(1)^$SCHEDLINE(3)'	'$SCHEDLINE(2)'	'$SCHEDLINE(4)' + '$LSLINE(6)' '$STARTIME(4)' '$ENDTIME(4) | 
|  | 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) | 
|  | echo status $rv from '$REMOTE_CMD' | 
|  | THISTRY=`{echo $SCHEDLINE(4) + 1|hoc} | 
|  | echo $SCHEDLINE(1) $SCHEDLINE(2) $SCHEDLINE(3) $THISTRY >$LPDEST/$FILE(1)^id | 
|  | if (~ $THISTRY $MAXTRY) { | 
|  | upasname=daemon | 
|  | mail $SCHEDLINE(2) <<endmail2 | 
|  | } | 
|  | if not { | 
|  | touch $LPDEST/$FILE(1) | 
|  | sleep $LPDELAY | 
|  |  | 
|  | # this is here to deal with running out of | 
|  | # Datakit channels or other stupid problems | 
|  | # backoff connection attempts but not too long | 
|  | LPDELAY=`{echo $LPDELAY '*' 2|hoc} | 
|  | if (test $LPDELAY -gt 960) | 
|  | LPDELAY=60 | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | Your job has failed to print on $LPDEST after $MAXTRY attempt(s). | 
|  | If the directory $LPLIB/prob/$LPDEST exists on $DEST_HOST, | 
|  | the file has been put there along with the printer log file. | 
|  | Your friendly printer daemon | 
|  | endmail1 | 
|  | Your job has failed to print on $LPDEST after $MAXTRY attempt(s). | 
|  | There is a problem in sending the job to $DEST_HOST, | 
|  | but I'll keep trying.  Have a nice day. | 
|  | Your enthusiastic printer daemon | 
|  | endmail2 | 
|  | UNLOCK $LPSPOOL/$LPDEST | 
|  | rm $LPSPOOL/$LPDEST >[2]/dev/null |