Version LPRng-3.8.27 - Wed Apr 21 11:32:41 PDT 2004

  Fixed:  'Missing HOLD_FILE' logic error fixed in lpd_rcvjob.c
   (Noted by: Mark Tamisiea <tamisiea@jilau1.Colorado.EDU>)
   (And another suggestion by: Christian Reiber <chrei@krischan.org>)

  Fixed: configure with-initpath
    --with-initpath=PATH now works correctly
   (Reported by: Jeff Bastian <jmbastia@ti.com>)

  Fixed (well, clarified):
   Errormsg() now checks for a 'null' error string and provides
   a printable version of errno for logging.

  Edited the Scan_queue() function to print error message and removed
   some dead code.
    (Inspired by comments from: Russell Adams <RLAdams@Kelsey-Seybold.com>)

  lpc MOVE could result in endless loop.
    (Problem reported by: Wichert Akkerman <wichert@wiggy.net> to 
	  Debian bug list, forwarded by: Craig Small <csmall at : enc.com.au>)

  lpc MOVE will now start printing job in destination, rather than just copying
    and preserving status of last operation.

  Added detailed error message for connection failure.
    (Inspired by comments by: Russell Adams <RLAdams@Kelsey-Seybold.com>)

  Found a really small (1 byte) memory leak in LPD.  Solves the mystery of
    the server dying with malloc failed messages.
    (Information supplied by: Russell Adams <RLAdams@Kelsey-Seybold.com>)


Version LPRng-3.8.26 - Tue Feb 3 16:58:00 PST 2004
  ADDITION to UTILS:
    VeryFlexibleChooser.pl script uses SNMP to get printer
    status and selects printer.
  (Contributed by: Henrik Edlund <henrik@edlund.org>)

  Fixed:
   --disable-werror configuration option not set correctly.
  (Noticed and patched by:  Gabriele Balducci <balducci@univ.trieste.it>)

   IPP listening enabled by default.  Should not be enabled by default.
   (ipp_listen_port=0)

Version LPRng-3.8.25 - Wed Jan 7 04:46:12 PST 2004

  MAJOR CHANGE in internals:
    The legacy 'control file' has been removed from the spool
  queue as all of the information is duplicated in the hold
  file.  The various LPRng documents will be updated to reflect
  this.   Users who access the control file information external
  to LPRng should be warned that this is not a good idea due
  to file locking, etc.

  MAJOR CHANGE in 'move' operation:
    The 'lpc move' is now 'nonblocking'.  If you request
  a job to be moved, the LPD server will start a process to
  (almost) immediately move the job.  Until this job is moved,
  no other job processing for the queue will be done.
  If the move is to a local queue on the same host, then the
  job will be copied via a file copy.  This action is identical
  to the action for sending a job to a 'load balance' queue,
  with the difference that the job is immediately marked as done
  rather than after the load balance queue has printed it.

  Note: if you enter a non-existent remote queue,  then the
  LPD subserver process trying to move the job will/may sit
  in an endless loop trying to move the job.

  Added: discard_large_jobs option
    discard_large_jobs   - if this option is set, large jobs are
    accepted and then discarded.

  Fixed: Priority and Class
    For incoming jobs, the first letter of the C (class) field
    in the control file is used to set the priority.
    This action is modified by the:
      # ignore requested user priority
      ignore_requested_user_priority=0
      # do not set priority from class name
      break_classname_priority_link=0

    If not present or the break_classname_priority_link,
    the default priority value is used to set the priority.
    (C=) and class (class=) values in the control file.

    This deals with several lpd print clients that appear to
    to assign random control file names and do not have a
    C field in the control file.  Not to mention users
    who try to manipulate queue priorities.

  Modified: incoming_control_filter action
    This filter is applied to the incoming job control file.
    and is used to modify the actions of the LPD server.
    options.  The output can be in the form:
     Xoption      X (no option)
     Xoption
      ...
     <blank line>
     key=value
     key=value
    
   The Xoption is equivalent to X=option.  The key=value
   set of options is separated from the first by a blank line.
   If an option is not specified, it is not modified. The
   X (no option) or X=  (no option) form will remove the
   option from the control file.  It is dangerous to try to
   modify the A (identifier) option unless the user has intimate
   knowledge of the LPRng lpd server operation.

  Modified: filter environment variables
    Filters are now invoked with the HF environment variable
    set to the hold file contents.  This assists with the
    incoming_control_filter and control_filter actions.

  Fixed:

    The 'Remove_done_jobs' code now removes done and error jobs.
    This makes the 'done_jobs' and 'done_jobs_max_age' actions
    symmetrical.

  Documented:  added more details to the -D flags.

    debug flag format: num | flag[+num] | flag=str
      flag names: print[+N], lpr[+N], lpc[+N], lprm[+N], 
       lpq[+N], network[+N], database[+N], log[+N], 
       test=num
     use on command line, or in printcap :db=... entry
     for server:
       print:     show queue (printing) actions,
                  larger number, more information
         NUMBER     same as print+NUMBER
       lpr:       show servicing lpr actions
       lpq:       show servicing lpq actions
       lprm:      show servicing lprm actions
       network:   show low level network actions
       database:  show low level database actions
       log:       Testing.  Don't use this unless you read the code.
       test:      Testing.  don't use this unless you read the code.
     for clients (lpr, lpq, etc):
       print:     show client actions, larger number, more information
         NUMBER     same as print+NUMBER
       network:   show low level network actions.
       database:  show low level database actions.

   Modified:

      The lpq display now shows Pr/Class (Priority/Class)
      information if the priority is different than the
      class information.  This better shows information on
      the class/priority relationshiop.

      The Class information is in the 'class=' field in the
      control file and the Priority information is in the
      priority field.

   The 'nonexistent printer message' has been modified to be a little
      more helpful, or at least more verbose:

            Status Information, attempt 1 of 3:
            sending job 'papowell@h110+563' to xx@localhost
             connecting to 'localhost', attempt 1
             connected to 'localhost'
             requesting printer xx@localhost
             job 'papowell@h110+563' transfer to xx@localhost failed
              error 'NONZERO RFC1179 ERROR CODE FROM SERVER' with ack 'ACK_FAIL'
              sending str '^Bxx' to xx@localhost
             error msg: 'spool queue for 'xx' does not exist on server h110.private'
             error msg: 'check for correct printer name or you may need to run'
             error msg: ''checkpc -f' to create queue'
            Waiting 10 seconds before retry

Version LPRng-3.8.24 - Fri Dec 12 15:03:02 PST 2003

  Small bugfixes

    Cygwin patch applied.
     (From "Luke Bakken"<Luke.Bakken@getronics.com>
    Comment:
     I thought I'd check LPRng to make sure that the latest version still
     works OK with Cygwin. Everything seems OK except for the checkpc.c
     "root" user warning. Will this patch be OK for that file?

    GCC 3.xx giveth, GCC 2.95 taketh a hard line.
     Patch for -  t = 0; char buffer[128]; in user_auth.c
    (From: "Marcus Overhagen" <marcus.overhagen@ims.fhg.de> and
        Jeff Chua <jchua@fedex.com>)



Version LPRng-3.8.23 - Wed Nov 12 13:32:02 PST 2003

   I did not document that the default locations of the lpd.conf and lpd.perms
   file are now /etc/lpd/lpd.conf and /etc/lpd/lpd.perms
   This change puts all of the lpd files, except /etc/printcap,  whose location
   is hardwired into too many places, in the /etc/lpd directory.  You can
   change this:
       configure --help
  --with-config_subdir=CONFIG_SUBDIR configuration subdirectory (default 'lpd')
  --with-lpddir=DIR                 lpd executable directory (default \${sbindir})
  --with-lpd_conf_path=PATH         path of lpd.conf (default: \${sysconfdir}/${CONFIG_SUBDIR}/lpd.conf)
  --with-lpd_perms_path=PATH        path of lpd.perms (default: \${sysconfdir}/${CONFIG_SUBDIR}/lpd/lpd.perms)
  --with-printcap_path=PATH         path of printcap (default \${sysconfdir}/printcap)
  --with-lpd_printcap_path=PATH     path of lpd_printcap (default \${sysconfdir}/${CONFIG_SUBDIR}/lpd_printcap)
  --with-initpath=PATH              path of lpd startup file (default /usr/local/etc/rc.d/lprng.sh)
    
  Also, the postinstall will now copy the old files to the new locations and
  issue a warning message.

   Fixed up a very subtle problem with 'chooser' functionality.

     we now have to find out if we really need to call the chooser
        if we are working and have a single queue, then we do not need to call the chooser
        if :sv= p1,p2  but none are available then we do not need to call the chooser
        if :sv == ""   - then we do need to call the chooser
        if :sv == p1,p2 and at least one is available - then we do need to call the chooser

     Added the 'chooser_scan_queue' flag.   If the flag is 1, then we
      check all the jobs in the spool queue to see if any can be sent to
      any destination.  If the flag is 0 (default), then only the first printable
      job in the queue is checked.  This causes only the first job in the queue
      to be tested, which is probably the appropriate behaviour for the majority
      of situations.

  Determined that it was possible to do a denial of service attack on the LPRng system.
   Added a zillion timeouts for reads/writes to socket/pipe connections.
    - for 'non-printing' actions, used Send_query_rw_timeout
    - for 'printing' actions, used Send_job_rw_timeout
    - on initial connections, use Send_job_rw_timeout, then Connect_timeout,
       and finally fall back to 10 seconds.
   While this does not totally eliminate the attack,  it does try to make the LPD
   server responsive after the timeout periods.  This is better than nothing.
   Note that there is a problem when you use these timeouts AND you are connecting
   to a slow printer.
 
   This solves the mystery of the 'hanging lpr processes' on some systems where a
   connection is made to the lpd server and then nothing is sent so there is no
   way to timeout things.

  Added a further fallback for missing filters:
   job format X - filter is :Xf=/filter if present, else
   filter is :filter=/filter if present, else
   filter is :if=/filter if present.

  Added --with-config_subdir (=lpd) to allow the $sysconfig/$subdir
   to be the directory for lpd.conf and lpd.perms files, also SSL
   files.

  The :ppd=file option now specifies the location of a PPD file.  This
  is used by foomatic-rip (http://www.linuxprinting.org) to specify
  options and by ifhp.
     - checkpc -f checks to see if the file is present and readable
     - lpc ppd will return the PPD  file contents 
   We can now integrate lrpng into KDE in a straight forward
   manner, as the ppd file should be standard.  Also, you can specify
   a default PPD file in /etc/lpd.conf.  This will be added to the
   printcap entries shown by lpc printcap and passed to the filters.

  Added a 'pc_entries_required' option that will force the specified
  printcap entries to be put into the PRINTCAP_ENTRY information if they
  have a defined value and are not in the printcap entry.  The
  current (only) value is ppd, but I suspect others might be nice.

  Fixed a bug in the way that the PGP security was implemented.
   - removed the PGP* environment variables from the default pass
     list for clients
   - did sanity checks for PGPPASS, PGPPASSFILE, and PGPPASSFD,
     and passed only the correct ones.  Also opened the PGPPASSFILE
     and passed the file descriptor.
   - made sure that the file descriptor specified in PGPPASSFD was
     actually connected to the open file.
   - only passed PGPPASS if running as a client.
   - on clients, passing the PGPPATH environment value, on server
     using printcap :pgp_server_pgppath value (if specified).
   - updated the Reference (AKA LPRng-HOWTO) manual to reflect these
     changes.
   In summary, we now use:
    lp:
    :pgp_path   - path of the PGP program
    :pgp_id     - id for clients to use when sending to server
                - id used by server for decoding client requests
    :pgp_server_pgppath   - PGPPATH environment variable for server
    :pgp_server_passphrasefile   - file containing passphrase
                     (must be absolute path name or is relative
                      to the spool directory)
    :pgp_forward_id  - for server to server communications
                  id of the remote server
    :pgp_passphrasefile - default client passphrase file
   For clients, the following environment variables are used:
    PGPPATH     - location of PGP configuration and key files
    PGPPASS     - password
    PGPPASSFD   - file descriptor to file with password
    PGPPASSFILE   - file with password
    If PGPASSFD and PGPPASSFILE not defined, then
      - if PGPPATH defined, look for $PGPPATH/$passphrasefile
      - if $HOME defined, look in $HOME/.pgp/$passphrasefile


   Error in SSL Support discovered by Geoff Greene and patch
    supplied.
    (Patch and hard work by: Geoff Greene <ggreene@alum.wpi.edu>)

   Amazing speed of some systems is so fast that jobs complete
    in less than the resolution of the system clock.  This,
    needless to say,  has some interesting problems with job
    order.  Added some sequence numbers as well as time to
    various places.

   Screwed up the patch sent by Henrik Edlund <henrik@edlund.org>.  It should
    have been:
    >     for(i = 0; i < listv.count; ++i ){
    >         s = listv.list[i];
    > -       if( (t = safestrpbrk(s,File_sep)) ) *t++ = 0;
    > +       if( (t = safestrpbrk(s,Value_sep)) ) *t++ = 0;
    >         Free_line_list(&l);
    > -       Split(&l,t,Value_sep,0,0,0,0,0,0);
    > +       Split(&l,t,File_sep,0,0,0,0,0,0);
    >         DEBUGF(DLPQ1)("Job_status: Force_lpq_status '%s'='%s'", s,t);
  (Correction by: Henrik Edlund <henrik@edlund.org>)

   Misimplemented Hendriks accounting fixes.
    -    if( Match_ipaddr_value(&l,&RemoteHost_IP) ){
    +    if( Match_ipaddr_value(&l,&RemoteHost_IP) == 0 ){
   Oooops.
  (Correction by: Henrik Edlund <henrik@edlund.org>)

   utiltities.c:  modified the 'Find_{str,flag,decimal}_value
   routines so that they did not take a separator option.  This
   appears to be an oversite due to the importation from another
   set of code. Apparently I wanted to used non-printable characters
   as separators,  but this turned out to be too hard to debug,
   so I used '=', '#', and '@' instead.

   Modified the init.freebsd.sh, postinstall.freebsd.sh, and preremove.freebsd.sh
   files to be a bit more 'ports' friendly.  Updated the STANDARD_install
   to be more in line with FreeBSD/NetBSD.

   Documented the max_accounting_file_size and min_accounting_file_size option
   and changed the lpd.conf comment to indicate a 0 value disables truncation.
    (Lack of documentation pointed out by: Jim Trocki <trockij@transmeta.com>)

   Fixed typos in INSTALL document.
    (Pointed out by: Daniel E Singer <des@cs.duke.edu>)

Version LPRng-3.8.22 - Fri Sep  5 08:45:33 PDT 2003

   Updated the LPRng, IFHP, and LPRngTool LICENSE with the new
   Artistic License from the www.opensource.org web site.

   Updated the DISTRIBUTIONS/FreeBSD port information to meet the current
   (new) port format.

   Renamed LPRng HOWTO to LPRng Reference Manual.  Added notes to the
    Printing Cookbook.

  lpf.c - removed log() and fatal().
    (Suggested by: Torsten Rohlfing <rohlfing@IGL.Stanford.EDU>)
  Filter command line options now allows ${X} to reference a control file
    option.  You can now use:
    $X   with -X<value>      (if present)
    $0X  with -X <value>     (adds space)
    $'X  with -X'<value>'    (adds quotes)
    $-X  with  <value>       (drops key)
    $0-X with  <value>       (same as $-X)
    $'-X  with  '<value>'    (adds quotes)
    ${ss}  with value of printcap option ss
    $'{ss} with quoted value of printcap option ss or job control file option

    Example:  filter=ifhp -Z '${S},${O}'
    This will get the O and S options from the job control file.  Note that
    $S is the 'printer comment name' and '$P' is the 'actual printer name'.
    (prompted by a question from: Paul Armstrong <army@cyber.com.au>)

   Fixed vars.c 'fifo' option - 
     -{ "fifo", 0, STRING_K, &Fifo_DYN,0,0,0},
     +{ "fifo", 0, FLAG_K, &Fifo_DYN,0,0,0},
   (Thanks to the Debian folks - especially Craig Small <csmall@debian.org>)

   Fixed up printer@remotehost%port parsing so you can do:
      localhost:lp=pr@%P and it gets expanded to:
      localhost:lp=pr@localhost
    This is pretty far down the extrema of wierd... But somebody
    came up with a use for it. Sigh...
   (Lots of head scratching caused by: Michael J. Carter <mcarter@lanl.gov>)

   Filters no longer have file descriptor 3 connected to the 'accounting
   file'.  Since the '-a accounting_file' option provides the name of the
   file and this should be used instead.

   plp_snprintf now handles '*' in floating precision correctly.
   (Patch by: Henrik Edlund <henrik@edlund.org>)

   if( Run_OF_filter(), Status_file_DYN ) problem found.
   (Thanks to the Debian List: Sam Lown <samuel.lown@cern.ch>
     and Craig Small <csmall@debian.org>)

   If you want to use force_lpq_status according to the docs (HOWTO), the
   following patch has to be applied. Otherwise it doesn't work when you have
   several ip netmasks listed as in the example:
     force_lpq_status=s=pc*.eng.com,130.192.12.0/24,l=sun*.eng.com
   Change is:
     -       Split(&l,t,Value_sep,0,0,0,0,0,0);
        Value_sep DEFINE( = " \t=#@" );
     +       Split(&l,t,File_sep,0,0,0,0,0,0);
        File_sep DEFINE( = " \t,;:" );
   (Pointed out to me by: Henrik Edlund <henrik@edlund.org>)

   Updated the configure and src/krb5_auth.c to be consistent with latest Kerberos
   releases.

   Added 'accounting_namefixup' option as suggested by Henrik Edlund <henrik@edlund.org>
    accounting_namefixup=list[,list]*
       where list is:   host(,host*)[=user(,user*)]
    The incoming job is check to see if the originating host (RemoteHost_IP)
    is in the list of hosts;  the first matching one found is used.

    Each host list has the format: host,host... where host has the
    same format used for the 'oh' and other host name matching
    options.  You can  use '!host' to invert matching.  For example:
    host1,127.*,!somehost

    When a host match is found,  the name to be used for the user
    is determined from the user list; if none is specified then no
    changes are made.  Each entry in the user list has the format
    ${option}  or 'name'; the ${option} values are extracted from
    the control file (capital letters) or printcap/configuration
    information (lower case letters/names).  The first non-empty
    value found is used.

    For example:   ${R},${L},${accounting_name},default
     If the control file 'R' option is present, the R option value is used
     else if the control file 'L' option is present, the L option value is used,
     else if the printcap/config option 'accounting_name' is not empty then
     it is used, otherwise the 'default' value is used.

   (Original suggestion and patches by:  Henrik Edlund <henrik@edlund.org>)

   Fought with the various Kerberos distributions and appear to
   have a new version that compiles with the Kerberos 1.3.1 release
   and with other legacy releases.

   Added the "# REJECT NOT SERVER" comment to the lpd.perms file to cause
   LPRng to reject all jobs/connections from external (non-localhost)
   clients

Version LPRng-3.8.21 - Mon Mar 17 07:06:57 PST 2003

  The LPQ 'stalled' indication is now based on status information updates,
  rather than the job run time.  If there has been no status update for the
  specified stall time, i.e. - log file (lf=...) or status file (ps=...) then
  the stalled indication will be displayed.

  Karol Lewandowski discovered that psbanner, a printer filter that
  creates a PostScript format banner and is part of LPRng, insecurely
  creates a temporary file for debugging purpose when it is configured
  as filter. The program does not check whether this file already
  exists or is linked to another place writes its current environment
  and called arguments to the file unconditionally with the user
  id daemon.
    -- reported by security.debian.org
    -- Debian Security Advisory DSA 285-1
      Fixed.

Version LPRng-3.8.20 - Tue Jan 7 09:18:15 PST 2003

  The lpd.conf now uses (EMPTY STRING) for defaults which are
  empty strings... Before it was '0'. Oops.  Patrick

  At the request of Karl Kopper <karl@unfiw.com> I reviewed the issues
  of queue starting,  polling the queues for done jobs, and other
  issues.  A small side effect of this is that the LPD server process
  now starts printing processes.  This is actually beneficial as it can
  now limit the total number of printing processes and allow some
  LPQ/LPC/LPR etc actions. Here is a summary of the current operation
  and the options that control it:
   Options:
      lpd_force_poll - forces a check of the spool queues, even when there
        is most likely no reason to.  Used when you have some REALLY odd
        programs running that will directly manipulate the LPD spool queues
        and you do not want to have to connect to the server.
        (default is OFF).
     lpd_poll_time - interval in secs between checking queues for work.
        Done if there is some reason to suspect that some spool queue
        had problems and might need to be restarted.  This also handles a
        race condition where a job arrives just as the process servicing
        the spool queue exits.
        (default is 5 minutes or 600 seconds)
     lpd_poll_start_interval - if there are spool queues which need service,
        fork up to 'lpd_poll_servers_started' processes at a time and then
        wait for lpd_poll_start_interval seconds before forking more.
        This prevents the deadly situation where the LPD server is started
        and in turn  starts a gizillion process; the rc starupt scripts
        may fail because there are no free processes (I kid you not on this
        one, it drove me nuts trying to find out why the system would crash
        ONLY when LPD ran with NO debugging - the IO caused it to slow down
        enough so that the other scripts could run).
        (default now 1 second)
     lpd_poll_servers_started - maximum number of processs to fork to be
        spool queue servers at a time.  this prevents the massive forking a huge
        number of processes at once.
        (default now 3)
     max_servers_active - the maximum number of children of LPD that are handling
        spool queues.  Since each spool queue process may have up to 5 children,
        and these in turn make fork other ones,  you should make sure that the
        limits for the LPD server are set as high as possible, or use this
        value to throttle activity.  The actual limit used by LDP value
        is the minimum of max_servers_active value and
           maximum children processes per process/2
        as determined by the getrlimit(), sysconf(), or other appropriate system
        calls.  Most problems reported by systems with heavy load are caused by
        restrictive process limits.  Run 'lpd -F -D1 | grep Get_max_servers'
        (as an ordinary user) and see the limits for processes and file
        descriptors.

    Summary:
     lpd_force_poll=0
     lpd_poll_time=600   (5 minutes)
     lpd_poll_start_interval=1  (1 second)
     lpd_poll_servers_started=3  (3 per start interval)
     max_servers_active=1024

    Experiments with heavily loaded systems (FreeBSD 4.7, Solaris
    2.8, Linux RedHat 7.3, and Mandrake 8) indicate that these
    values should not cause system trauma.  Your milage may vary;
    if the load average goes up very high, then set lpd_poll_start_interval
    to a larger value and/or decrease the lpd_poll_servers_started
    value.  Both is best.  The amount of free memory seems to be
    the limiting factor on the system loading.

    When you send a job via LPR, the LPD server forks a 'service socket'
    process to handle job reception;  in previous versions after receiving
    the job the process would then call Do_queue_jobs() to take on the
    duties of the 'handle the jobs in the spool queue' process.  In
    this version the 'service socket' process sends a 'start queue'
    request to the LPD server and then exits.  The LPD service will
    then fork a process to become the 'handle the jobs' process.
    Similarly, when an lpc operation needs to start a 'handle the jobs'
    process,  a message is sent to the LPD server to start the process.

    While there is no real difference in performance on lightly loaded
    systems,  there is a big difference on heavily loaded systems.  Now
    the LPD server can control the total number of active spool queues
    much easier,  and the system does not get overloaded as easily.

    Also, the LPRng server does not clobber the system at startup
    time as badly now.

    By the way,  queues which are started or have jobs put in them
    by LPC or LPR have priority over queues that are started by the
    LPD process looking for work,  and the LPD server will brutally
    try to start as many as possible.  Thus, if you do an 'lpc start all'
    you can bring the system to its knees for a short time until
    all of the forking and file reading activity is completed.
    Since only the administrator can do an 'lpc start' command,
    this should not be an issue...

  Keith ("HP Printer Dies Horrible Death") Rinaldo
  <rinaldok@egr.unlv.edu> has reported that some HP printers lock
  up and do not report status, etc., and display a nasty low level
  error message on the printer console such as 7900FE.  The IFHP
  filter or LPD would sit there waiting for a response.  The 'keepalive'
  TCP/IP facility does not solve this problem,  as sometimes the
  TCP/IP stack is OK but the job handling code (i.e. - print engine)
  is non-functional.  You need to try to get a response from the
  printer,  which is what the IFHP filter does.

  NOTE: send_job_rw_timeout default value is now 0 (no timeout).
  In order to not surprise new users,  the default value for
  send_job_rw_timeout is now 0, i.e.- no timeout.  Details below.

    The send_job_rw_timeout is now used to set a maximum time that
    the printer (network, parallel port or serial port) connection
    will be 'inactive', i.e. - no data input and not available for
    data output, OR, starting with this release, that the various
    filter processes do not update the status file (by default,
    ${spooldir}/status.printer).  When the timeout expires the job
    will terminate with a JTIMEOUT status, which will be treated
    as a JFAIL status.

       /* LPRng internal        process exit status */
       #define JTIMEOUT 43      /* 12 timeout */
    
    The IFHP filter (ifhp-3.5.11) now has a similar 'send_job_rw_timeout'
    option that has the same effect as the LPD 'send_job_rw_timeout'.
    If the file descriptor used to communicate with the printer is
    inactive for this period of time,  then the IFHP filter will
    exit with a JTIMEOUT error code, which will be treated as a
    JFAIL status.

    This will only work if the printer goes totally catatonic and
    does not reply with status, or the print filter goes catatonic
    and does not update the status file.  This situation, unfortunately,
    can happen when the printer is taken offline in the middle of
    a job in order to put paper in the paper tray.  You can't win
    them all...  but if the time taken to put the paper in the tray
    is less than the send_job_rw_timeout then you should be OK.

Version LPRng-3.8.19 - Thu Dec 5 12:34:45 PST 2002
  Check_for_missing_files was not writing control file.
  (Spotted by Keith ("Wanna bet on that?") Rinaldo <rinaldok@egr.unlv.edu>

Version LPRng-3.8.18 - Mon Dec 2 12:08:34 PST 2002
  Added the 'fifo' option  - this now makes LPRng handle
  one incoming job at a time in FIFO order.  If you send
  jobs A B C then they get delivered in order A B C.
  For users who MUST have sequential delivery of jobs.

  Some Linux distributions set 'unlimited' resources for all
  parameters, such as user processes.  Added limit of 1024
  processes for such cases as the system will die a horrible
  death at startup.


Version LPRng-3.8.17 - Sat Oct 26 20:11:28 PDT 2002
  Found a race condition between LPD printing, LPRM, and LPC actions
   that would cause LPD to stop printing if you removed or did
   an LPC action on a job.  After a bit of thought, decided that
   the job would get moved or removed anyways.  Sigh...
   But you might get a bogus error message about 'cannot
   find id' as the job hold file has been removed.

Version LPRng-3.8.16 - Mon Aug 12 15:26:05 PDT 2002

  lpr now honors :mx=xx values so you can check job size
  before you send it.
   (Suggested by:  Rick Cochran <rcc2@cornell.edu>)

  configure --disable-werror removes the -Werror option from CFLAGS.
   (From the wish list of: Rick Cochran <rcc2@cornell.edu>)

  Bad incoming jobs are removed.  You do not get the jobs
  left in the queue as errors.  Note - spoolers will
  keep trying to send jobs even when they get error and
  sit in an endless loop.  No solution for this one except
  to get a better print spooler or whatever...

Version LPRng-3.8.15 - Sun Aug 11 13:11:48 PDT 2002
  
  Remove_done_jobs
    - checks to see if the INCOMING flag is set BEFORE
    it checks to see if there is an error and only checks
    for the data files if the ERROR or DONE flags are set.
    This removes a race condition.  It was bloody obvious
    when I looked at it... I wonder why I did not see it
    before?

Version LPRng-3.8.14 - Tue Aug  6 09:14:06 PDT 2002

  man page fixes.
    (Spotted by the eagle eyes of: Eric S. Raymond <esr@golux.thyrsus.com>)

  Based on third hand reports, some installations of GNU compilers
  on HPUX and other systems now have 'fd_set' data types.
  I have modified configure so that it checks for 'fd_set' being
  present.  I wish there was a way to read the man pages and
  find out if this was the real case.

  The configure 'enable-ssl/disable-ssl/' option was not working.
  Once again beating on autoconf 1.53 ...  It now understands
  'enable-OPTION' and 'disable-OPTION'.
  
  The Samba examples in the LPRNG-Howto were not consistent.
   changed 
        queuepause command = /usr/sbin/lpc -P%p stop
        queueresume command = /usr/sbin/lpc -P%p start
   to
         queuepause command = /usr/local/sbin/lpc stop %p
         queueresume command = /usr/local/sbin/lpc start %p
   (Suggested by: Jim Van Sickler <vansickj-eodc@Kaman.com>)

Version LPRng-3.8.13 - Mon Jul 22 09:07:57 PDT 2002

  Major Enhancement In Printcap and Configuration Functionality
  After much consideration, added the 'client.xxx' and 'server.xxx'
  facility.  Briefly,  if you have a printcap entry of the form
  client.xxx or server.xxx then this can be used to set the corresponding
  xxx variable when the printcap entry is used by the lpd server
  or the LPRng client programs lpr, lpq, lprm, checkpc, etc.

    Entry               Program Type          Sets
    server.xxx = vvv    lpd (server)          xxx = vvv
    client.xxx = vvv    lpr,lpq... (client)   xxx = vvv

  The purpose of this enhancement is to allow a single printcap
  entry to be used for both client and server operation, especially
  in situations where the lpd server is forwarding or sending jobs
  to another lpd queue.

  Example of use:
    lp:
        # used by clients, forcess them to send to
        # specified server
     :lp=%P@server.hostname:force_localhost@
        # used by lpd server
        # the server will now send jobs to the
        # specified destination
     :server.lp=%P@destination

  This is equivalent to and replaces the :client and :server
  printcap flags, as shown below:

    lp:client
     :lp=%P@server.hostname:force_localhost@
    lp:server
     :lp=%P@destination

  This selection operation also works with values in the
  lpd.conf file, allowing global overrides for clients and
  servers.  (I can't imagine a use for this,  but it is there
  if somebody wants to use it.)

  The lpc client and lpc server commands will display the
  selected client.xxx and server.xxx values.  They are also
  propagated to the PRINTCAP_ENTRY environment variables
  for filters.

  Typo's in documentation corrected.
  (Patch by: Stepan Kasal <kasal@math.cas.cz>)

  lpr Kerberos authentication failures were not being reported.
  (Problem noticed by: Rick Cochran <rcc2@cornell.edu>)

  Added SSL authentication.  See the README.SSL.SECURITY file for
  the truly complicated details.  Note that testing with certificates
  signed by non-root CA indicates that the client is not sending
  a certificate, even though one has been requested and the
  certificates and signing certs are in the right places.

  lpd.conf did not have 'include' functionality working.
    (Patch by: Stepan Kasal <kasal@math.cas.cz>)
  
  Added Yet Another LPRng Option: user_is_authuser
      user_is_authuser:
       if( header_info && User_is_authuser_DYN
               && (s = Find_str_value(header_info,AUTHUSER,Value_sep)) ){
               Set_str_value(&job->info,LOGNAME,s);
               DEBUG1("Check_for_missing_files: authuser '%s'", s );
       }
  printcap:
  lp:auth=kerberos5:user_is_authuser:...
   Causes the principle name to be used as the user name.

  lpq_in_perl was screwed up
  (Patches by: Anthony Thyssen <anthony@cit.gu.edu.au>)

  generate_banner core dumped.  Turned out not to be setting
  banner format ("f") when generating entry, so that control
  file generation core dumped when generating new control file.
  (Problem reported by: "Keith Rinaldo" <rinaldok@egr.unlv.edu>)

  Updated Remove_done_jobs to sort jobs by completion time.
  Added 'Set_nz_flag_value' function to stop the ERROR_TIME value
  from being gratuitously updated by various routines.

  Found possible cause of 'job data files not removed' problem
  in the Remove_done_jobs() code.  There is a possibility of a
  data file being orphaned if a 'done job' is removed by the
  spooler at the same time that another processes such as lpq
  information gathering examines the print job.  Rare, but possible.

  Put warnings in the LPRng-HOWTO section on Samba about the
  done_jobs option and interaction with SAMBA job status.
  (Suggested by: Marcus Manske <manske@dramedia.de>)

  Added yet another wakeup and kick to the master server process
  so that printer pools will respond faster.  Sigh...

Version LPRng-3.8.12 - Mon May 6 08:21:49 PDT 2002

  patch for TCPWRAPPERS added a gratuitous -lwrap to the src/Makefile.
  (Spotted by: Rabellino Sergio <rabellino@di.unito.it>)

Version LPRng-3.8.11 - Thu Apr  4 07:49:30 PST 2002

  Subtle problem when a filter fails and produces zero
  length file.  This is now treated as a JABORT level
  error.  The problem is that RFC1179 treats a file
  length as 0 as a 'read until end of file on socket'.
  This means that folks who have filters that WILL produce
  zero length files need to do something to produce at
  least one byte of 'dummy' output.
    (Brought to my attention by:
      Sergij Kovalenko <s.kovalenko@drgueldener.de>)

  Fixed up a portability issue for Solaris 2.6, in linksupport.c.
  Need to do an unsigned long cast to do comparison of INADDR_NONE.
  (Original patch from: Dr Andreas F Muller <afm@othello.ch>)

  Added patches to support TCP wrappers.  Use:
    configure --enable-tcpwrappers
  (Patch by:  Tobias Burnus <burnus@net-b.de>)

  Added a 'Linux Standards Base' (LSB) style startup script
    for Linux systems.
  (Provided by:  Tobias Burnus <burnus@net-b.de>)

  Missing initialization for statb
  (Patch by: Rob Joyce <robjoyce@EE.Princeton.EDU>)

  Clobbering Logfile_LPD in common/lpd.c
  (Patch by: Hugh McDonald <hugh@gw1.symac.dhs.org>)

  Added a call to 'Remove_done_jobs()' in lpd_status.c;
   then modified Remove_done_jobs to return indication that
   a job was removed so that lpd_status.c would RESCAN
   queue... Sigh... OK, but it now works 'right'.
  (Stale jobs not getting removed noted by:
    Richard Ems <r.ems.mtg@gmx.net>)

  The problem of saturating a server when checking for work was
   re-examined.  The new approach is:
    a) if some work was done,  then check for success at
        lpd_poll_time intervals.  If there remains work to
        be done and there is no process actively doing the
        work, mark the queue as needing service.
    b) for the marked queues, start at most 'lpd_poll_servers_started'
       queues at once,  and start these at intervales of
       'lpd_poll_start_interval' seconds.
   The effect of this will be to limit the number of processes
     that LPD will start at a time.
   (Pushed to look at the problem by: Johan Bengtsson <elijah@dd.chalmers.se>)

  Found a very odd bug... the escape code for '\:' in printcap entries
   appears to be broken.  The fix was to assume that the only places where
   it would be used was in 'filter' or other options where the 'expand
   escape sequences' code would be called and would take care of replacing
   "\:" by a ":".
.
  The 'Printer_device()' routine, when opening a filter as an output
  device, did not provide 'stdout' for the filter.  Some filters such
  as pap from Appletalk seem to need this as they produce messages
  on STDOUT (fd 2) as well as STDERR (fd 3).

Version LPRng-3.8.10 - Sun Mar 31 11:31:19 PST 2002

 printcap.5 had :as and :ae examples reversed
  (Spotted by the guy with the red pen and the eagle eyes:
    Craig Small <csmall@eye-net.com.au>)

 Slew of patches sent in by Tim Waugh <twaugh@redhat.com> 
   - silly little kerberos include file patch
   - can't spell printer patch
   - si no moleste the files in the spool queue patch
     (already done)
   - added configure ability to find 'pr' program
   - GCC flags -W -Wall -Werror -Wno-unused-parms
      - also fixed up &*)*(&)*(& unsigned and signed
        integer casts
 Added patch to allow tcp wrappers to be used.  Configure updated
   configure --enable-tcpwrappers     use tcp wrappers (-lwrap)
   (Patch from: Tobias Burnus <burnus@net-b.de>)

 The authentication and connection information for permissions
  checking is now recorded so it can be used for permissions checking.
  and a couple of new fields have been added.
  The following permission tags now have the indicated values
   UNIXSOCKET - true (match or 1) if connection was over a UNIX socket,
     i.e. - the local host.
   When SERVICE=P 
     REMOTEHOST - the original remotehost from which the job was sent
      (previously was the HOST value)
     REMOTEPORT - the original port from which the job was sent
      (previously was undefined )
     AUTH - true (match or 1) if job sent using authentication
     AUTHTYPE - authentication type
     AUTHUSER - value of authentication key for user who originated
        job.  For example, for kerberos this is the user's principle value
     AUTHFROM - value of authentication key for sender of job.  For example,
        if the job was from the LPR program,  this would have the same
        value as AUTHUSER.  However, if it was forwarded from a server,
        it would have the server's authentication name or value.
  lpd.perms.in update to match the new entries
   (Requested by: Toby Blake <toby@cogsci.ed.ac.uk>)

  Once again the checkpc file creation stuff is modified so that
   it can create files in a directory NOT owned by the lpd group/user.
   This is necessary for log files and other items.  Note that this
   MAY cause problems for log file truncation as you need to copy
   file contents rather than just renaming them.  But it turns out
   that I am already doing this so it appears to be OK.
     CAVEAT EMPTOR.
   (Reported by: Torsten Wiebesiek <wiebesiek@tnt.uni-hannover.de>)

  Usage messages now display version information as well as options
   and available debug flags.  Idea shamelessly swiped from somebody else.
   (Stolen from: 'Guido' Van Rossen)

Version LPRng-3.8.9 - Sat Mar  2 15:02:11 PST 2002

  The 'unix_socket_path' and 'lpd_port' options have been modified
  slightly to correct some ambiguous behaviour, and a 'lpd_listen_port'
  option has been added.
    lpd -p lpd_listen_port -P unix_socket_path
     - the -p and -P command line options override the
       lpd.conf lpd_listen_port and unix_socket_path options
     - the default values for lpd_listen_port is "", indicating
       the use the 'lpd_port' value.
   The value "off" suppresses opening a port or socket.

     This allows the following operation:
     No unix socket:
        lpd -Poff   (/etc/lpd.conf unix_socket_path=off)
     No lpd listening socket:
        lpd -poff   (/etc/lpd.conf lpd_listen_port=off)
        Note that LPD will still open connections to the
        remote LPD servers using 'lpd_port'.
   If you want to override the destination lpd port, you must
      modify the lpd.conf file.

  Jeff Chua of FedEx (Federal Express) <jchua@fedex.com>
  showed up at my office armed with a set of test scripts and a laptop
  running LPRng.  He demonstrated the problem of the 'missing datafile'
  during job transfers.  I have fixed the problem in this release.
  See the UTIL/testpr file.  
   (Thanks to: Jeff Chua: <jchua@fedex.com>)
    
  more autoconf + automake + libtool insanity:
     WITH_LINK removed
     STRIP now used by libtool, changed to STRIP_OPTION
     Added AC_C_VOLATILE (see note on volatile below)
  (Reported by: Rick Troxel <rick@helix.nih.gov>)

  Forced a rescan of the input queue when the number of done jobs
   exceeds 'done_jobs' or the time since the first done job exceeds
   done_jobs_max_age .  This solves a silly problem that shows up
   when you have a slew of jobs in a queue,  the subserver is processing
   them,  and no new jobs arrive while it is processing them.  Under these
   conditions the 'done jobs' would not have been removed until all were
   done.  If you were printing 1000 jobs then you could not submit any
   new jobs, even though you have done 999 of them... :-)

   Sigh... these boundary conditions are the pits.

  Added the 'volatile' option to declarations of static and nonstatic
  variables updated in signal handlers.  You really don't want to
  hear the frothing about over-enthusiastic optimizing compilers, do you?

  Ran the Kerberos tests, discovered minor definition problems with
  krb4_auth.h and Kerberos4 support.  Have no way to test this,  hope
  the problem is resolved.

  The AUTHUSER information received at job submission time was not
  being stored and used later when printing permissions were checked.
  (Discovered by: Toby Blake <toby@cogsci.ed.ac.uk>)

  Added a 'UTILS/README.ForKerberosHackers' file so that Kerbero Hackers
  can quickly and brutally set up a test LPRng system.  Not for the
  faint hearted.  Carry a dog nummy when you read this stuff...

  Some users hit themselves in the head and complain about headaches.
  If the 'lpd_port' value is 0,  then checkpc and lpd squawk.
   (Not telling me who the user was, but reported by:
      Craig Small <csmall@eye-net.com.au>)

 

Version LPRng-3.8.8 - Sat Feb 23 07:35:45 PST 2002

  Restored include file functions to lpd.conf.  Also put in recursion
  depth checks so that it will stop if you have a loop.

Version LPRng-3.8.7 - Fri Feb 22 12:24:38 PST 2002

  Modified the wildcard lookup so that it returns some sane
   values for defaults, i.e. - '*' is not treated like
   a real printer and the first 'real' printer is used.
     Sigh...

  autoconf, automake, and libtoolize insanity.
    Each of these facilities has a different version of the
    config.guess and config.sub files, and will brutally copy
    them to the distribution directory when you run automake,
    autoconf, or libtoolize.  Problem sort of solved by
    running through the /usr/local/share/{auto*,libtool}
    directory and finding latest versions of things.  As the
    CarTalk guys say, "Bo-0H-OH-OH Gus!".  Sigh. 

  The 'Service_connection: bad request...' error message now has
   the IP address of the sender added.
  (Good idea from: Rainer Tammer <rainer.tammer@spg.schulergroup.com>)

  Makefile.in had the diagnostic options left enabled after
   regression tests.
   BAD! Bad Programmer! BAD! No coffee for you today.
   (Reported by: Petri Kaukasoina <kaukasoi-lprng@elektroni.ee.tut.fi>
      among others...)

  Portability stuff,  // comments, and src/Makefile referencing
   ${SRC}/../UTILS instead of ../UTILS.
   (Reported by: Hans Peter Verne <h.p.verne@usit.uio.no>)

  Missing check in lpstat for end of string condition:
   for( t = Printer_DYN; t && !isspace(cval(t)); ++t );
    => for( t = Printer_DYN; !ISNULL(t) && !isspace(cval(t)); ++t );
   (Reported by: Villy Kruse <vek@pharmapartners.nl>)

  psbanner was creating a /tmp/before file.
   (Reported by:
