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:
     Anthony R Iano-Fletcher <Anthony.Iano-Fletcher@cbel.cit.nih.gov>)

  Fixed the 'job done' status message so that it shows the job id.
   (Suggested by: Christoph Beyer <christoph.beyer@desy.de>)

  Added some sanity checks to handle cases when hold files and
   control files do not have identifier information in them.

  Checkpc now checks for duplicate spool directories.

Version LPRng-3.8.6 - Fri Feb  8 19:31:52 PST 2002

  HF_NAME not getting set when hold file read and it is not
  in file.  This makes updates miserable.
  (Problem spotted by: Helmut Jarausch <jarausch@igpm.rwth-aachen.de>)

  Fixed typeo in configure where I had unixsocket and unixsocketpath
  instead of unix_socket and unix_socket_path...
  (Pointed out by: Craig Small csmall@eye-net.com.au)

  Modified the host/printer lookup behavior when clients
  are using 'force_localhost'.  You now use the 'original'
  queue name rather than the 'destination' queue name.
  Wonder how long this has been there.
  (Prompted by a problem report from: Andrew Gray" <grayaw@egr.unlv.edu>)

  Missed a 'AF_UNIX' definition.  Now guarded with ifdefs.
 
  Corrected LPRngHOWTO accounting information:
   (Error reported by: "Dirk Krause" <d.krause@fh-sm.de>)

    Example:
     lpd generates:  
      jobstart  - from the lpd.conf 'as=' option
      jobend    - from the lpd.conf 'ae=' option
        -H   - host name
        -n   - user name
        -P   - printer
        -k   - control file name
        -b   - byte count of job/file
        -t   - current printing time
        -J   - Jobname (if present in control file)
        -C   - class (if present in control file)
        -M   - mailname (if present in control file)
    
     ifhp filter generates:
       start/end         - of filter, for entire job
       filestart/fileend - if or other filter, for each file
       (options above are same)
        -A  - identifier information (if present in control file)
        -q  - process id of filter
        -p  - current value of page counter, 0 indicates no
              page counter on printer or it is not readable
    
    jobstart '-Hh110.private' '-nroot' '-Plp' \
       '-kcfA129h110.private' '-b48780' '-t2001-10-19-09:36:36.000'
                               ^^^ bytes in file
    
    start '-q26130' '-p105340' '-t2001-10-19-09:36:38.330' \
                     ^^^^^^^  starting page counter value for job
        '-Aroot@h110+129' '-nroot' '-Plp' 
    filestart '-q26132' '-p105340' '-t2001-10-19-09:36:38.350' \
                          ^^^^^^^  starting page counter value for file
        '-Aroot@h110+129' '-nroot' '-Plp' 
    fileend '-b19' '-T435' '-q26132' '-p105359' '-t2001-10-19-09:43:51.504'
                                      ^^^^^^^  ending page countvalue for file
             ^^^ number of pages printed for this file
        '-Aroot@h110+129' '-nroot' '-Plp'
    end '-b19' '-T435' '-q26130' '-p105359' '-t2001-10-19-09:43:51.504'
                                      ^^^^^^^  ending page countvalue for job
         ^^^ number of pages printed for this job
        '-Aroot@h110+129' '-nroot' '-Plp'
    jobend '-Hh110.private' '-nroot' '-Plp' \
        '-kcfA129h110.private' '-b48780' '-t2001-10-19-09:43:51.000'
                               ^^^ bytes in file

Version LPRng-3.8.5 - Tue Jan 22 15:58:46 PST 2002

  Added a minor fix to lpq so that it will check all queues.
   (Courtesy of Jim Trocki <trockij@transmeta.com>)

Version LPRng-3.8.4 - Thu Dec 13 08:25:17 PST 2001

   ARGH! ARGH!  screwed up lpq -a by forgetting to
   get the 'all' printer information.  Doh!
   (Spotted by and slapped his forehead by:
      Patrick Powell <papowell@lprng.com>)

   "Why do we need a TCP/IP port?"  quoth the raven,  I mean
   Craig Small <csmall@eye-net.com.au>.
   "I have a version that has this facility..." respondeth
   Patrick ("Mr. Grumpy") Powell.  "But I think you will not
    be happy".  I merged the two versions.  Be Happy.

   configure:
     Added these options
       --enable-unix_socket  (default disabled)
       --with-unix_socket_path=PATH  (default /dev/lprng)

   /etc/lpd.conf:
    OPTION      TYPE   DEFAULT PURPOSE
     unix_socket FLAG   1       enables/disables the UNIX socket
     unix_socket_path STR   /dev/lprng    path to the pipe using this

    Also: lpd_port = 0 will disable the TCP/IP port

     lpd -p 0    - disables the TCP/IP port
       or /etc/lpd.conf  lpd_port=0
     lpd -P /path   - enables, unix socket specified by path
       or /etc/lpd.conf  unix_socket@
     lpd -P off     - disable unix socket

      Permissions:
       Connections to the UNIX socket will appear to come
       from localhost, (127.0.0.1) port 0.  You can use the
       UNIXSOCKET to check for this condition, or explicitly for
       localhost/port 0
         ACCEPT/REJECT ... UNIXSOCKET
    Also updated the INSTALL note.

   checkpc:  I was using 'To_daemon()' calls all through the
     code.  This was not needed and would cause a substantial
     slowdown in operation.  I now do exactly ONE call at the
     start of operations.

   updated the config.guess and config.sub to the latest version
   provided by autoconf.

   Incoming jobs now have a status entry.  This is to support IPP
   and status reporting for incoming jobs.  The idea is that you
   can start transferring a job and then,  when the whole job is
   transferred,  the job will be done.  To make this happen you
   need to put an entry in the queue to act as a place holder and
   reserve the job number for this action.  When transfering an
   IPP job,  you can send it in chunks.  This now allows the IPP
   system to send the job header (request), set up the job status,
   and then the job contents.  Just to make life interesting...

   Found some places where I was using 'sizeof(xxx)' instead of a
   passed value for an error message buffer.  Very short error
   messages - 3 chars long... :-)

   LPD now REALLY uses the lock files to prevent multiple
   instances from running.  This might/will/could break on
   systems that NFS mount their lock directories.

   Cleaned up the error message about bad print job formats.
    Clearly there are some REALLY strange printing systems out there.
    (reported by: Phil Moses <pmoses@physics.ucsd.edu>)

   Checkpc -A XX -r now has nicer format:
     t1:  file 'hfA877', age 24.57 hours > 24.00 hours maximum
     (Spotted by: (Craig Small) csmall@eye-net.com.au)

   Added the following to the pass_env options:
    LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    LC_IDENTIFICATION LC_ALL
    This should help with LOCALE support.

Version LPRng-3.8.3 - Mon Dec 10 20:40:02 PST 2001

   Fixed the operation of 'lpr -Pxx' when printcap for xxx
   has the format:
     xx:direct:lp=...
     Sigh... too many special cases...
       (Pointed out at LISA2001, and fixed on site...
       Now who was that masked Sysadmin???...)
    (From the mailing list:
      James Thomas Klaas <jklaas@engin.umich.edu> )

   Removed spurious commas in control file Z options.

   Configure did not set 'done_jobs_max_age' correctly.
   (Patch from: Dejan Ilic <dejan.ilic@home.se>)

   lpc flush now cleans out status as it should have done...
    GRRR... user pointed this out at LISA 2001...

   Fixed up a problem with global variable Name.
      From:  Rick Cochran <rcc2@cornell.edu>
    I got LPRng to build under OSX.  It required only one patch which
    seems to be due to the fact that "Name" is declared "extern" all
    over the place, but is only defined in getopt.c.  Since lpstat
    doesn't use getopt, ld complains.  I'm not sure why GNU ld should
    complain under OSX and not on other platforms.
     (Patch by:  Rick Cochran <rcc2@cornell.edu>)

   Editted the lpr man page.  Updated the information about
    obsolete options.

   Updated the installation procedures for FreeBSD, linux, etc.
   The STANDARD_configuration script now checks to see if there
   is a /usr/share/man and if so, runs  configure with
   --mandir=/usr/share/man.  Man pages now show up in the
   right place.  This was true on *BSD, various LINUX distros,
   and some versions of SunOS/Solaris.

   Updated the DISTRIBUTIONS/FreeBSD entry and the postinstall
   scripts so that the port stuff works better.  Now if you do:
         cd LPRng/DISTRIBUTIONS/FreeBSD*
         make PREFIX=/usr SYSCONFDIR=/etc
   You will get the same effect as:
         cd LPRng
         sh STANDARD_configuration
         make clean all install
   But, as you might suspect, there are some minor gotchas.
   The man pages usually get installed in /usr/share/man, but
   when you use the PORT system and override PREFIX it
   insists on installing them in /usr/man... and various
   versions of the FreeBSD and OpenPort stuff INSISTS that
   when generating a port that the originals of the man pages
   are in the ${PREFIX}/man/manX directories.

   I gave up and cheated:  you get an obnoxious warning to
   either create /usr/man or to make a symbolic link from
   to /usr/share/man from /usr/man before installation starts.
   I know, I know.  But I don't have that many brain cells
   left to fry...


Version LPRng-3.8.2 - Mon Dec  3 12:26:52 PST 2001

  MAJOR CONFIGURATION CHANGE:

  LPRng can retain status of last N completed jobs
     configure --with-done_jobs=N
         - set done_jobs value, default 1
     configure --with-done_jobs_max_age =N
          - set done_jobs_max_age value, default = 0 (no expiry)

     Or in the printcap/lpd.conf:
       :done_jobs=1
       :done_jobs_max_age=1

   Example:
    Printer: t1@h110 'Test Printer 1'
     Queue: no printable jobs in queue
     Server: no server active
     Status: job 'cfA231h110.private' removed at 18:25:36.281
     Rank   Owner/ID         Class Job Files             Size Time
    done   papowell            A   278 /tmp/hi              3 18:25:31

  Controlled by:
    :save_on_error        - all jobs with error saved, status not removed
    :save_when_done       - all jobs with no error saved, status not removed
    :done_jobs=N          - last N jobs completed (error or no error) saved
    :done_jobs_max_age=N  - jobs with status older than N seconds removed

  This is best explained by:
    On job completion:
    if( (no error && save_when_done)
       || (error && save_on_error)
       || done_jobs > 0 || done_jobs_max_age > 0 ){
      do not remove job
    }

    When queue updated:
    if( !(save_on_error || save_when_done) ){
       while( done_jobs_max_age >= 0
         && the time since completion of oldest done job > done_jobs_max_age ){
               remove the oldest done job
       }
       while( done_jobs >= 0 && total number of done jobs > done_jobs ){
          remove the oldest done job
       }
    }

  Fixed up the order of 'require_explicit_q' in the variable list.

  Added 'lpd -p port' so that lpd port can be specified at run time.
   (Suggested by: Chris J. Herbst <chris@herbst.com>)

  Added 'PrintingCookbook' to the distribution.

  The 'shorthost' DNS lookup result was not being set correctly
  if DNS lookup failed and you had to drop back to using IP address.
  Clearly the shorthost form of IP10.0.0.1 is IP10.0.0.1, not
  IP10.

  Added patches to help support Win32 porting using Cygwin:
  UID 0 is now ROOTUID instead of 0 value.
  ROOTUID is set by ifdef in portable.h

  checkpc -f no longer puts out the annoying '/var/run/lpd.515
   does not exist' message.

  List_sep (which is only used in Check_for_rg_group) needs
  a comma.
    (Discovered by: Graeme Wood <Graeme.Wood@ed.ac.uk>)

  Reworked the 'start lpd subprocess' code so that it is a little more
  civilized.

  Modified portable.h so that LPRng compiles properly on HPUX 11.xx
  systems.

  lpc help fixed up - 'redo - reprints jobs'

  Cleaned up the 'Make_sort_key' code so it does not do needless
   malloc.

Version LPRng-3.8.1 - Thu Nov 15 16:08:41 PST 2001

  The original default actions and values for the LPD_PRINTCAP_PATH
  have been restored, as it broke too many other things.  A work around
  for the problems with using LPD and database based configuration
  has been found... ugly, but it works.

  Chooser also now will wait when it cannot find a queue instead of
  just exiting.  This solves the problem of 'hung' load balance print
  queues using 'chooser' support.

  Trim the accounting file information.  This now solves the 'mysterious
  full spool partition' error messages.

  'indefinately' is really 'indefinitely' ... so says 'ispell'

  The 'remove_z' now really removes 'Z' options.
   (Found by: Ryan Lovett <ryan@stat.Berkeley.EDU>)

  The 'require_explicit_q' added for those folks who absolutely require
  that a queue be specified and do not want them to use a default queue.
   (Patch to code supplied by: James Thomas Klaas <jklaas@engin.umich.edu>
     with a little help from Dan Escapa)

  Grrr... left in a line of code when I was doing some testing of the
  setuid functions in Win32 and screwed up the setuid stuff.

  Fixed up a silly problem with file descriptor 0 not bound to
  /dev/null in lpd subprocesses.

  Fixed the 'Trim_status_file' routine so that it now treats file
  descriptor 0 and -1 as 'closed' files.  This prevents some silly
  problems with initialization.

Release LPRng 3.8.0 Mon Oct 15 12:09:13 PDT 2001

   At line 174 in accounting.c:
     } else if( safestrncasecmp( s, "hold", 4 ) ){
   This should be
     } else if( !safestrncasecmp( s, "hold", 4 ) ){
   otherwise anything send back to lpd from the accounting filter
   other than accept will result in a JHOLD!
    (Spotted by: "C. L. McAvaney" <chrismc@deakin.edu.au>)

