home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.mayn.de
/
ftp.mayn.de-pub.zip
/
ftp.mayn.de-pub
/
apple
/
apple_unix
/
Sys_stuff
/
at_interface
< prev
next >
Wrap
Text File
|
2017-03-06
|
9KB
|
369 lines
# 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