home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 April / PCWorld_2001-04_cd.bin / Software / Vyzkuste / gs / gs650w32.exe / gs6.50 / lib / unix-lpr.sh < prev    next >
Linux/UNIX/POSIX Shell Script  |  2000-12-05  |  4KB  |  162 lines

  1. #!/bin/sh
  2. # $Id: unix-lpr.sh,v 1.1 2000/03/09 08:40:40 lpd Exp $
  3. #
  4. # Unix lpr filter. The default setup sends output directly to a pipe,
  5. # which requires the Ghostscript process to fork, and thus may cause 
  6. # small systems to run out of memory/swap space. An alternative strategy,
  7. # based on a suggestion by Andy Fyfe (andy@cs.caltech.edu), uses a named
  8. # pipe for output, which avoids the fork and can thus save a lot of memory.
  9. #
  10. # Unfortunately this approach can cause problems when a print job is aborted, 
  11. # as the abort can cause one of the processes to die, leaving the process 
  12. # at the other end of the pipe hanging forever.
  13. #
  14. # Because of this, the named pipe method has not been made the default,
  15. # but it may be restored by commenting out the lines referring to
  16. # 'gsoutput' and uncommenting the lines referring to 'gspipe'.
  17. #
  18.  
  19. PBMPLUSPATH=/usr/local/bin
  20. PSFILTERPATH=/usr/local/lib/ghostscript
  21. LOCALPATH=/usr/local/bin
  22. X11HOME=/usr/X11R6
  23.  
  24. PATH=/bin:/usr/bin:/usr/ucb:/usr/etc
  25. PATH=${PATH}\:${LOCALPATH}\:${PBMPLUSPATH}\:${PSFILTERPATH}
  26. LD_LIBRARY_PATH=${X11HOME}/lib
  27.  
  28. export PATH LD_LIBRARY_PATH acctfile host user
  29.  
  30. user= host= acctfile=/dev/null
  31.  
  32. #
  33. # Redirect stdout to stderr (for the logfile) and open a new channel
  34. # connected to stdout for the raw data. This enables us to keep the
  35. # raw data separate from programmed postscript output and error messages.
  36. #
  37. exec 3>&1 1>&2
  38.  
  39. #
  40. # Get username and hostname from filter parameters
  41. #
  42. while [ $# != 0 ]
  43. do  case "$1" in
  44.   -n)    user=$2 ; shift ;;
  45.   -h)    host=$2 ; shift ;;
  46.   -*)    ;;
  47.   *)    acctfile=$1 ;;
  48.   esac
  49.   shift
  50. done
  51.  
  52. #
  53. # Get the filter, printer device and queue type (direct/indirect)
  54. #
  55. filter=`basename $0`
  56. device=`dirname $0`
  57. type=`dirname ${device}`
  58. device=`basename ${device}`
  59. fdevname=$device
  60. type=`basename ${type}`
  61.  
  62. #
  63. # Find the bpp and number of colors, if specified
  64. #
  65.  
  66. colorspec="`echo ${device} | sed 's/.*\.[0-9][0-9]*\.\([0-9][0-9]*\)$/\1/'`"
  67. if test "$colorspec" = "${device}"
  68. then
  69.     colorspec=""
  70. else
  71.     device=`basename ${device} .$colorspec`
  72.     colorspec="-dColors=$colorspec"
  73. fi
  74.  
  75. bpp="`echo ${device} | sed 's/.*\.\([0-9][0-9]*\)$/\1/'`"
  76. if test "$bpp" = "${device}"
  77. then
  78.     bpp=1
  79. else
  80.     device=`basename ${device} .$bpp`
  81. fi
  82.  
  83. #
  84. # Information for the logfile
  85. #
  86. lock=`dirname ${acctfile}`/lock
  87. cf=`tail -1 ${lock}`
  88. job=`egrep '^J' ${cf} | tail +2c`
  89.  
  90. echo "gsbanner: ${host}:${user}  Job: ${job}  Date: `date`"
  91. echo "gsif: ${host}:${user} ${fdevname} start - `date`"
  92.  
  93. #
  94. # Set the direct or indirect output destinations
  95. #
  96. #gspipe=/tmp/gspipe.$$
  97. #mknod ${gspipe} p
  98.  
  99. case "${type}" in
  100.   direct)
  101.         gsoutput="cat 1>&3" ;;
  102. #        cat ${gspipe} 1>&3 & ;;
  103.   indirect)
  104.         gsoutput="lpr -P${device}.raw" ;;
  105. #        cat ${gspipe} | lpr -P${device}.raw & ;;
  106. esac
  107.  
  108. (
  109. #
  110. # Any setup required may be done here (eg. setting gamma for colour printing)
  111. #
  112. #echo "{0.333 exp} dup dup currenttransfer setcolortransfer"
  113.  
  114. #
  115. # The input data is filtered here, before being passed on to Ghostscript
  116. #
  117. case "${filter}" in
  118.   gsif)      cat ;;
  119.   gsnf)      psdit ;;
  120.   gstf)      pscat ;;
  121.   gsgf)      psplot ;;
  122.   gsvf)      rasttopnm | pnmtops ;;
  123.   gsdf)      dvi2ps -sqlw ;;
  124.   gscf|gsrf) echo "${filter}: filter not available" 1>&2 ; exit 0 ;;
  125. esac
  126.  
  127. #
  128. # This is the postlude which does the accounting
  129. #
  130. echo "\
  131. (acctfile) getenv
  132.   { currentdevice /PageCount gsgetdeviceprop dup cvi 0 gt
  133.     { exch (a) file /acctfile exch def
  134.       /string 20 string def
  135.       string cvs dup length dup
  136.       4 lt
  137.         { 4 exch sub
  138.           { acctfile ( ) writestring } repeat
  139.         } { pop } ifelse
  140.       acctfile exch writestring
  141.       acctfile (.00 ) writestring
  142.       acctfile (host) getenv 
  143.         { string cvs } { (NOHOST) } ifelse writestring
  144.       acctfile (:) writestring
  145.       acctfile (user) getenv
  146.         { string cvs } { (NOUSER) } ifelse writestring
  147.       acctfile (\n) writestring
  148.       acctfile closefile
  149.     } { pop } ifelse
  150.   } if
  151. quit"
  152. ) | gs -q -dNOPAUSE -sDEVICE=${device} -dBitsPerPixel=${bpp} $colorspec \
  153.         -sOutputFile=\|"${gsoutput}" -
  154. #        -sOutputFile=${gspipe} -
  155.  
  156. rm -f ${gspipe}
  157. #
  158. # End the logfile entry
  159. #
  160. echo "gsif: end - `date`"
  161.  
  162.