# System V line printer spooler model for PostScript/TranScript printer # Copyright (c) 1985 Adobe Systems Incorporated # PostScript and TranScript are trademarks of Adobe Systems Incorporated # Modified from RCSID: $Header: psinterface,v 2.1 85/11/24 12:20:16 shore Rel $ # # "@(#)at_interface: 2.0, 2.1; 9/25/89; Copyright 1988-89, Apple Computer, Inc." # This interface program accepts the following option args passed in via # lp -o[option] -o["option string"] # # -h - No Banner Page # -r - Don't reverse the pages # -o - object, passed to at_printer for AppleTalk NBP lookup, any object is "=" # -l - Output is giong to a laserwriter, run through Postscript utilities # -t - Type, used to specify the type of printer, "LaserWriter" is the # only special type recognized at this point. If user specifies # "LaserWriter" the output is piped through the PS utils. This option is # also pased to the at_printer prog for use in the AppleTalk NBP lookup. # -z - Zone to look in for printer, passed to at_printer # Remember that the appletalk "this zone" id is the char '*', # any printer, any type is the char '='. # Set DEBUG non-zero for debug information DEBUG=0 set -f # This interface program is ment to adapt the System V LP Spooler to the # Appletalk network / LaserWriter world. It's not a perfect match. # You may wish to modify this file to your own special needs. # Location of the directory containing the Adobe Systems PostScript (ps) tools PSLIBDIR=/usr/lib/ps PSLOGDIR=transcript PSTEMPDIR=/tmp # Location of the binary the does the actual transfer over appletalk atprinter=/usr/bin/at_printer # Some useful vars pstmp=$PSTEMPDIR/pstmp$$ psrtmp=$PSTEMPDIR/psrtmp$$ psfinal=$PSTEMPDIR/psfinal$$ prog=$0 pr=`basename $prog` cwd=`pwd` ptime=`date` # This logging is not part of the "normal" lp spooler software but # is supplied by Adobe. log=$cwd/${PSLOGDIR}/${pr}-log if [ ! -w "$log" ] ; then if [ $DEBUG != 0 ] ; then echo "Creating adobe log file $log." fi cp /dev/null $log if [ $? != 0 ] ; then disable -r"can't access log file $log" $pr 1>/dev/console 2>&1 exit 1 fi chmod 644 $log fi # These are the Adobe PostScript tools necessary to convert standard ascii to # PostScript format. Set psrv to null if you don't want page (order) reversal. banner=$PSLIBDIR/psbanner psrv=$PSLIBDIR/psrv format=$PSLIBDIR/pstext BANNERPRO=$PSLIBDIR/banner.pro # Pick one or the other BANNERFIRST=1 BANNERLAST=0 REVERSE=0 export BANNERPRO BANNERFIRST BANNERLAST PSTEMPDIR REVERSE PSLIBDIR # printer-specific options file (can change any of the above) test -r ./${PSLOGDIR}/${pr}.opt && . ./${PSLOGDIR}/${pr}.opt if [ "$REVERSE" != "1" ] ; then psrv= fi # lpsched invokes us the following command line: # argv[0] is the interface program: interface/PRINTERNAME # argv[1] is the request id: PRINTERNAME-#id # argv[2] is the requesters id: USERNAME # argv[3] is the number of copys: #COPYS # argv[4] is the list of options: -OPTIONS # argv[5] is the list of files: /usr/spool/lp/request/PRINTERNAME/d0-#id # Now parse it. if [ $DEBUG != 0 ] ; then echo "$*" fi seqid=$1 name=$2 title="$3" copies=$4 options="$5" shift; shift; shift; shift; shift files="$*" if [ $DEBUG != 0 ] ; then echo "seqid = $seqid, title = $title, copies = $copies" echo "options = $options, files = $files" fi if [ -z "$title" ] ; then title=`basename $1` fi # parse remaining user options # # NOTE: There are two kind of options: # 1. Style options for the PS utilities # 2. Appletalk routing information used by at_printer. # In addition the LaserWriter flag "-l" signals use of the Adobe PS tools. # set $1 = output of getopt[1] set -- `getopt hmro:lt:z:f: $options` ; if [ $? != 0 ] ; then echo "$pr: $seqid bad user options $options [hmr]" >> $log exit 2 fi # Adobe PostScript filters, which do we use and how? Hflag="" Mflag="" Rflag="" ATopt="" DashL="" Tflag="" while [ ! -z `getopt hmro:lt:z:f: $options` ] do if [ $DEBUG != 0 ] ; then echo $1 fi case $1 in -h|h) Hflag=$1; shift;; # no banner page -m|m) Mflag=$1; shift;; # mail stream output if any -r|r) Rflag=$1; shift;; # Don't reverse page order # Handle postscript for laserwriter -t) Tflag=$1; Type=$2; shift; ATopt="$ATopt $Tflag";; -l) DoPS="True";DashL="True"; shift;; --) break;; # Do not move this option *) ATopt="$ATopt $1"; shift;; # These must be for at_printer esac done if [ $DEBUG != 0 ] ; then echo "" echo "PS flags - $Hflag $Mflag $Rflag" echo "AT flags - $ATopt" fi # If user has not indicated -l option, but has choosen a printer # which is a laserwriter, or have specified -t LaserWriter on the # command line, set DoPs to true, and -l option. if [ -z "$DoPS" ]; then if [ ! -z "$Tflag" ] ; then if [ "$Type" = "LaserWriter" ] ; then DoPS="true" if [ -z "$DashL" ] ; then ATopt="$ATopt -l" fi fi else Pchoice=`atstatus | grep LaserWriter` if [ ! -z "$Pchoice" ] ; then DoPS="true" ATopt="$ATopt -l" fi fi fi # set up to send the job if [ ! -x $atprinter ] ; then disable -r "can't find $atprinter program" $pr exit 1 fi # If this request is for a LaserWriter, run Adobe PostScript tools if [ ! -z "$DoPS" ] ; then # Adobe log of transaction start. echo "$pr: $seqid $name "$title" start - $ptime" >> $log # Generate banner page, but don't add it in till later. if [ -z "$Hflag" -a \( "$BANNERFIRST" = "1" -o "$BANNERLAST" = "1" \) ] ; then if [ ! -x $banner ] ; then disable -r "can't exec $banner program" $pr exit 1 fi bannerf=$PSTEMPDIR/b$seqid.$$ if [ ! -r $BANNERPRO ] ; then disable -r "can't access banner prolog" $pr exit 1 fi $banner $pr $seqid $name "$title" "$ptime" > $bannerf fi # Do we print banner page first? (or last?) if [ -z "$Hflag" -a "$BANNERFIRST" = "1" ] ; then if [ $DEBUG != 0 ] ; then echo "Printing banner first" fi cat $bannerf > $psfinal fi # Set up to mail job output if user flag set # # ***** MAKE THIS FUNCTION CORRECTLY ***** # # if [ -n "$Mflag" ] ; then # JOBOUTPUT=${PSTEMPDIR}/o$seqid.$$ # export JOBOUTPUT # fi # Now process the print files. # # IMPORTANT: Remember that the request must be batched with # only one call to function at_printer. for f in $files do echo "$pr: $seqid `basename $f` - `date`" >> $log cop=$copies if [ $DEBUG != 0 ] ; then echo "Printing $copies copy(s) of file $f" fi # check for magic number and format if plain text magic=`line <$f | cut -c1-11` rev= case "$magic" in %!PS-Adobe-*) cat $f > $pstmp ; rev=1 ;; *) $format <$f > $pstmp ; rev=1;; esac # if multiple copies, reverse only once if [ -n "$rev" -a -n "$psrv" -a -z "$Rflag" ] ; then if [ $DEBUG != 0 ] ; then echo "Reverse done" fi $psrv <$pstmp >$psrtmp fi # print all the copies, reversing as necessary while [ $cop -ge 1 ] do if [ -n "$rev" -a -n "$psrv" -a -z "$Rflag" ] ; then if [ $DEBUG != 0 ] ; then echo "Adding reverse" fi cat $psrtmp >> $psfinal else if [ $DEBUG != 0 ] ; then echo "Adding copy" fi cat $pstmp >> $psfinal fi cop=`expr $cop - 1` done done # Do we print the banner page last? (or first?) if [ -z "$Hflag" -a "$BANNERLAST" = "1" ] ; then if [ $DEBUG != 0 ] ; then echo "Printing banner last" fi cat $bannerf >> $psfinal fi else # This is not a Postscript printer, # we must supply our own banner function. x="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" if [ -z "$Hflag" ] ; then # print a banner? # echo "\014\c" echo "$x\n$x\n$x\n$x\n" > $psfinal banner "$name" >> $psfinal echo "\n" >> $psfinal user=`grep "^$name:" /etc/passwd | line | cut -d: -f5` >> $psfinal if [ -n "$user" ] ; then >> $psfinal echo "User: $user\n" >> $psfinal else echo "\n" >> $psfinal fi echo "Request id: $seqid Printer: $pr\n" >> $psfinal date >> $psfinal echo "\n" >> $psfinal if [ -n "$title" ] ; then banner "$title" >> $psfinal fi echo "\014\c" >> $psfinal fi for f in $files do cop=$copies if [ $DEBUG != 0 ] ; then echo "Printing $copies copy(s) of file $f" fi cat $f > $psfinal done fi # if [ ! -z "$DoPS" ] ; then # mail user the job ouput if flag set # # ****** THIS NEEDS WORK AS WELL ****** # # if [ -n "$Mflag" ] ; then # if [ -s "$JOBOUTPUT" ] ; then # (echo Subject: output from PostScript print job $seqid follows # cat $JOBOUTPUT ) | mail $name # fi # rm -f $JOBOUTPUT # fi # fi # Because appletalk cannot grant exclusive access to a printer, # send the entire job in one call. if [ $DEBUG != 0 ] ; then echo "$atprinter $ATopt < $psfinal" cat < $psfinal else $atprinter $ATopt < $psfinal fi if [ ! -z "$DoPS" ] ; then # Adobe log of job finish echo "$pr: $seqid end - `date`" >> $log fi # clean up tmp files if [ $DEBUG = 0 ] ; then rm -f $bannerf $pstmp $psrtmp $psfinal fi .