###########################################################################
# LPRng - An Extended Print Spooler System
#
# Copyright 1988-1998 Patrick Powell, San Diego, CA
#     papowell@astart.com
# See LICENSE for conditions of use.
#
###########################################################################
# MODULE: Changes
# PURPOSE: Record Changes
# CHANGES,v 3.47 1998/03/29 18:37:09 papowell Exp
###########################################################################

Release LPRng 3.5.3 Mon Nov  9 10:07:42 PST 1998
  Documentation Error:
    LPRng-HOWTO, Section 8, indicated that the lpd.conf file
  could be obtained using a filter.  This is not correct.
  (Noticed by: David Stenglein <david.stenglein@citicorp.com>)

  Major Modification:
    removed the 'xu' (per spool queue permission file) after trying
  to make the semantics work.  Now we have a single permission file
  for all printers

  Major Modification - Load Balance Queues:
    Some users reported very slow operation of the load balance
    queues.  This was verified,  and extensive modifications were
    made to the functionality.

    CHANGE:
     	The subserver queues are only scanned at startup
      and when there is an explicit indication that a new
      job has been put into or removed from the queue
      (SIGUSR2 received)

  Major Modification - LPD Does Not Ignore LPR, LPC Requests

      Some users with either large numbers of spool queues or
    spool queues with large numbers of jobs noticed VERY slow
    LPD response.
      This has been improved considerably.

    CHANGE:
      LPD server would run through the Spool queues, looking for
    trash to be removed or jobs to be started.  This polling is
    necessary due to the possibility of a race condition between
    the time that a job is put into the queue and the time that
    the unspooler checks the queue for entries.
      The operation has been modified so that only a SINGLE PROCESS
    runs down through the spool queues.  When it finds work to do,
    it informs the LPD server,  which now will start ANOTHER process
    to check other queues for work.  Note that while these processes
    are working their little hearts out,  chewing up swap space
    and reading directory entries like mad,  the LPD server can
    accept requests for LPQ, etc.

  Major Modification - LPR speedup:
    The LPD server now accepts jobs for spooling WITHOUT extensively
    checking the spool queue.  This eliminates problems with printing
    to queues with a large number of entries.
   
  Speed Improvement:
    A bit of time analysis showed that LPRng was spending a large
    amount of time during queue scanning in the fcmp() routine.
    This has been rewritten and is now a strcmp().

    During queue scan, Get_controlfile() generates a 'cmp_str' value
    that represents the information needed to do sorting.  This is
    is then used during queue sorting as the comparison value.

    The 'struct cmp_struct' in the include/sortorder.h is used to
    make sure that sufficiently long string buffers are allocated.
    The make_cmp_str() in common/sortorder.c can be replaced with
    a users version if they desire.

  Bug Fix:
  safestrncpy, mystrncpy, safestrncat, mystrncat now used for string
   copies where there is doubt on the buffer/string length.  Note that
   these versions will always make sure the buffer is terminated with
   a 0 value.

  lpr -U xx is supposed only to work for ROOT. Check for root perms
    was not done correctly.
    (Patch by: Paul Szabo <psz@maths.usyd.edu.au>)
  permissions checking:  the C=value1,value2 permissions checking
    option wants a C (control file) line starting with character C
    and glob matching the indicated value1, value2, etc.  For example,
    N=patrick*,powell* should match against line Npatrickwashere or
    Npowellwasthere.  The check was done incorrectly.
    (Patch by: Paul Szabo <psz@maths.usyd.edu.au>)
  LPD/lpd_rcvjob.c - removed limits on lengths of class and host names
  When using bounce queues and the generate_banner to cause a banner to
    be added to a job,  the 'ab' (always banner) and the lpr -h (no header)
    flags now are used in the decision for banner generation.
    (Noticed by: Charles Karney <karney@pppl.gov>)
  Filters were not being passed -Knnn option.
    (Noticed by: Charles Karney <karney@pppl.gov>)
  Permissions:  SERVER keyword was not used for X permissions.
    (Fix by: Patrick Powell <papowell@astart.com>)
  File Permissions:  spool_file_perms was being ignored due to the
    umask() not being (un)set before creating a file.
    (Discovered by: Albert Fluegel <albert.fluegel@hl.siemens.de)
  ConnectTimeout now times out on connect() calls.
    (Reminded by: Heinz-Ado Arnolds <arnolds@ifns.de>)
  Accounting filter:  when the filter returns 'JHOLD' the job
    will be held (as documented).
    (Patch by: Rainer Schoepf <schoepf@uni-mainz.de>)
   LPRM incorrectly gives the "clean" usage instead of "lprm" usage.
    (Fix by:  Edan Idzerda <edan@mtu.edu>)
   The 'xt' and 'check_for_nonprintable' flags were in conflict.  Removed
    the 'xt' flag.
    (Reported by: "Dugal James P." <jpd@usl.edu>)
   The LPD/lpd_remove.c code did not remove jobs correctly when a
    :destination=... entry was present
    (Patch by: john@cs.wisc.edu)
   Log files not being truncated.  Well, they are now.
    (Fix by: Patrick Powell <papowell@astart.com>)
   LPR not printing multiple copies (-K option)
    (Patch by: Keith Richardson <keithr@ms.com>)
   LPD did not check spool queue just before exiting from printing loop.
    This opened a BIG race window on systems with lots of jobs in the
    spool queue.
    (Fix by: Patrick Powell <papowell@astart.com>)
   Expand_command did not check for Do_dollar() returning 0, indicating
    a string overflow condition, which it then dereferenced and core dumped.
    (Reported by:  (Walter Misar) <misar@rbg.informatik.tu-darmstadt.de>)
   Control file filters were not being invoked correctly.
    (Reported by: Tony Graham <Tony.Graham@uni-c.dk>)
   Memory trashing being done by different behaviour of strncat() on some
    systems.  Replaced by mystrncat() and took the performance hit in return
    for reproducible behaviour and non-trashing copies.  Sigh.
    (Fix by: Patrick Powell <papowell@astart.com>)
   strncpy() and strcpy() does not handle overlapping strings correctly, or
    at least that is what the man page says.  Replaced several of these
    calls by memcopy() and friends.
    (Fix by: Patrick Powell <papowell@astart.com>)

Release LPRng 3.5.2 Fri May  1 14:39:55 PDT 1998
  Bug Fix:
   lpr -k did not pass the correct length (0) to the
   remote system.
    (Reported and patch by:  Wolfgang Scherer <ws@ecosys.de>)
   common/pr_support/ checks Do_lock() for <= instead of < for
    failure condition.
    (Reported by:  Wolfgang Scherer <ws@ecosys.de>)
   common/proctitle.c had a strdup() call - not supported
    under ULTRIX.
    (Reported by:  "Todd C. Miller" <Todd.Miller@cs.colorado.edu>)
   force_localhost was being tested BEFORE it was set in the printcap
    entry.  Now is checked AFTER the printcap entry is processed.
    (Reported by: Petri Kaukasoina <kaukasoi@elektroni.ee.tut.fi>)
   LPD returns 'o connect permissions' instead of 'no connect ...'
    (Noted by: Reinhard Zierke <zierke@informatik.uni-hamburg.de>)
   LPD records filter name in error message correctly.
   LPQ now reports full class name in status message if
     'class_in_status' flag set in printcap.
     (Requested by: Philip J. Nesser II <pjnesser@nesser.com>)
   common/sendlpc.c - missing Lp_device = 0
     (Reported by: "Dugal James P." <jpd@usl.edu>)
   LPD reported the wrong host name in 'no permission' messages.
     (Noticed by: Patrick Powell)

Release LPRng 3.5.1 Fri May  1 14:39:55 PDT 1998
  Baseline Stable Release

Release LPRng 3.4.12 Fri May  1 14:39:55 PDT 1998
  Legacy support modification:
    control file now has printer information in:
       controlfile
       Ninfo
       Uinfo
    order.  Some legacy printer spoolers require this order.
   (Reported by: Don Badrak <dbadrak@geo.census.gov>)

  Minor cleanups of:
    Get_printer() calls - some silly comments and orders
    common/fileopen.c/Init_tempfile() - clarified the
      use of the various directories and defaults.
    Force_localhost:  now done in Get_printer(), where it should
      have been done in the first place;  LPQ  and LPRM
      now send requests to localhost unless explicitly overriden
    Force_fqdn will now brutally assume that the domain of the
      sender is the one reported by the FQDN of the originator
	  of the connection.

Release LPRng 3.4.11 Thu Apr 30 11:46:25 PDT 1998

  Functionality Change:
   JABORT and stop_on_abort default value changed
   JNOPRINT filter exit status stops printing
   JFAILNORETRY filter exit status stops retries

  In previous versions,  when a filter exited with unknown or
  JABORT status,  the default action was halt processing of
  PENDING jobs.  When a new job was sent to the queue,
  or a lpc start was performed,  processing was restarted started.
  Under heavy load conditions,  the effect of the JABORT was
  nullified by the arrival of new jobs.

  The LPRng behaviour has now been modified to handle JABORT
  conditions in a predictable manner, using the 'stop_on_abort'
  flag.

  1. The default for 'stop_on_abort' is now FALSE.
     This means by default that the JABORT status will simply be
     treated as a 'do not retry this job' error status.
     If the 'save_on_error' flag is FALSE (default), the job
     will be removed from the queue.

  2. If 'stop_on_abort' is set to TRUE,  then when a filter
     exits with a JABORT on unknown status,  further processing
     will stop, and NO pending jobs will be printed.  If the
     'save_on_error' flag is FALSE, the job will be removed from
     the queue.

  3. If 'stop_on_abort' is set to TRUE, the abort condition is
     sticky, i.e. - it will persist until
     action is taken to clear it.  Any of the LPC commands which
     cause printing to be restarted will clear it:
       LPC start, up, kill, topq, release, or redo

  4. LPQ and LPC will report if there is an aborted job condition.
 
  Note that for most users, the default action is now the desired
  action, i.e. - to continue processing jobs.

  However,  certain administrators will most likely need to assume
  that when a filter exits with JABORT that further printing on this
  queue will fail.  The sites should set 'stop_on_abort' to TRUE.

  JNOPRINT:

  If a filter exits with JNOPRINT,  then printing will be stopped;
  this will have the same effect as an LPC stop command.  The job
  will NOT be treated as an error job and will remain pending in the
  print queue.

  This allows filters to detect conditions that would normally cause
  printing to fail before a job is started,  and halt printing under
  these conditions.

  JFAILNORETRY:

  Under various arcane conditions,  it is possible for a filter to
  determine that a job has failed,  and should not be retried.  Most
  filters would return a 'JREMOVE' error code,  but for various arcane
  reasons (lots of Arcania here, folks), the 'save_on_error' flag
  might be set,  and the adminstrator would like to have the job
  marked as erroneous,  but NOT removed.

  If the filter exits with JFAILNORETRY,  then the job is treated
  as though it had an error, but no retries are performed.

  Extended Functionality:  'mail_from' option
    Allows specification of the 'From:' user.  If not specified
    default is to use the printer name. 
   (Patch By: Rainer Schoepf <schoepf@uni-mainz.de>)
  Portability Extension:
   LPD_CONF_PATH compilation option
   The location of the LPRng configuration file is specified
   by the config_path value in the src/common/vars.c file.
   The compilation option -DLPD_CONF_PATH=path can be
   used to override the default locations.
   Example:  make LPD_CONF_PATH=/usr/local/etc/lpd.conf all
  Nit Fix:  spelling errors corrected.
   (Reported by: Don Badrak <dbadrak@geo.census.gov>)
  Incredible 9 Gigabyte Partition Fix:
   (Reported by: Don Badrak <dbadrak@gesg34.geo.census.gov>)
   Apparently the common/freespace/plp_fs_free_bytes cannot handle
   a >4 gigabyte partition.  The fix was to cast values to a
   double - this should be sufficient until we get 10**38 byte file
   systems. :-)
  Bug Fixes:
   LPD usage() had (erroneous) -i option.
     (Reported by: wcolburn@nmt.edu (William Colburn (aka Schlake)))
   get_max_servers did not get max servers.
     (Patch by: Don Badrak <dbadrak@gesg34.geo.census.gov>)
   

Release LPRng 3.4.10 Thu Apr 23 18:01:37 PDT 1998
  Added Functionality:
   sync_lpr flag- this suppresses the closing of the lpr to lpd
   network connection until the LPR job is completely processed
   by the LPD server.  This can,  under various arcane and odd
   situations,  result in the lpr processes 'hanging' until the
   LPD server queries DNS servers, looks up permissions, etc etc.
   However,  if users are trying to figure out why LPR has returned
   and their job is not in the queue,  or you have some desire to
   write shell scripts that create jobs and then remove them
   in order to see 'just how fast LPRng is',  this flag will SLOW DOWN
   the operation by making it synchronous.  Any little thing
   to make folks happy... :-)
 Modified Functionality:
   The 'force_localhost' flag has now been modified to (literally)
   force a connection to one of the 'localhost' addresses returned
   by a DNS lookup.  This should have no effect on 'normal' users,
   but might have the result that the status returned by LPQ
   will now differ a little.  For example, if you have a printcap
    pr:lp=pr@host2:force_localhost
   you will discover that lpq -Ppr will now print:
    Printer: pr@localhost
     ... status for localhost queue
    Printer: pr@host2
     ... status for host2 queue
   This is correct and accurate reporting, compared to the previous
   lpq format.
    (Brought to my attention by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)

 Bug Fixes:
 Job_printable_status() did not report active jobs, so lpq and lpc job count
   was off by one.
   (Reported by:  Al Marquardt <almar@uiuc.edu>)

Release LPRng 3.4.9 Mon Apr 20 12:42:55 PDT 1998
  Enhanced Functionality:
   For those folks who want to 'masquerade' their servers,
   the 'report_server_as=hostname' will now report your printer@server
   as 'pr@hostname'.
   (Requested by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)
  EXTA/EXTB:
    ifdef'd for folks with REALLY vintage systems...
    (Requested by: David Coelho <drc@ppt.com>)
  Added debugging code to determine when servers started.
  LPD now clears job 'move' indications so that a job can
    be saved (save_when_done) and then reprinted with
    out being moved to the destination again.
  lp -s (Silent) now does not print job id information.
    (Noticed by: David Coelho <drc@ppt.com>)
  Jobs which do not have print permissions now get removed.
    (Reported by: Al Marquardt <almar@uiuc.edu>)
  lpq -tN -c now will not core dump.

Release LPRng 3.4.8 Sat Apr 18 15:23:22 PDT 1998
  Portability Fix:  AIX 4.1.5 has definition conflicts when
  doing #include a.out.h.
   (Reported and Fix by: Niklas Edmundsson <nikke@ing.umu.se>)
  Also, Solaris4.1.4 has conflicts with tgetent() definition.
   (Reported by: wcolburn@nmt.edu (William Colburn (aka Schlake)))
  Y2K checked - ISO conformant date format is used in log and other
   messages.
  :force_fqdn_hostname flag causes FQDN host name rather than
   short hostname to be put into control file.

  Bug Fixes:
  Accounting at end was failing do to closing output device
   too early in the algorithm.  Device now closed AFTER last
   accounting script is called.
   (Reported by: Niklas Edmundsson <nikke@ing.umu.se>)
  Time_t strikes again.  I just discovered that there were some
   places where I was using long instead of time_t for time values.
   This has been fixed.  However, there is also now the problem
   of snprintf( "%d", time((void*)0)) being used for output and
   t = atoi("xxx") for input of time values.  Sigh... will fix
   this later.
  "lpc lprm pr all" operation now works correctly
   (Reported by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)

Release LPRng 3.4.7 Wed Apr 15 08:40:25 PDT 1998
  Bug Fix:
    Stupid system implementor used snprintf() instead of
    plp_snprintf,  causing headaches for unsuspecting
    folks on systems that did not have snprintf().
    Better fix is to insist that systems have snprintf() :-)
    (Reported by: Helmut Jarausch <jarausch@igpm.rwth-aachen.de>)
  Enhancements:
    The code for doing 'polling' of spool queues had a very high
    overhead in terms of process creation.  This code has been
    modified to have a single process run down the queues and
    check for work.  There is a bit of overhead,  but much less than
    the overhead in creating a large number of processes.
  Bug Fix:
    when generating banners using :generate_banner,  it did not
    work.  System developer forgot to include banner... :-)
    (Reported by: Cecil R. Whitaker <cwhitak@nswc.navy.mil>)

    Jobs that did not get permission to print and were flagged
    with JREMOVE did not get removed.
     (Reported by: Al Marquardt <almar@uiuc.edu>)
 
    When putting in a new 'From this host' line in a control file,
    did not remove the old one.  Also 'Q' entry as well.
     (Reported by: Al Marquardt <almar@uiuc.edu>)

    Multi-homed hosts that do not recognize interfaces need
    special coddling when trying to connect to them.  Link_support.c
    gets yet another special case for connections.
     (Patches by: Giray Pultar <pultar@pprd.abbott.com>)

    listen(backlog=64) - used to be 10, which caused connections
    to be dropped under heavy loads.

    checkpc was adding a / to end of file names.
    (Noticed and fixed by: Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)

Release LPRng 3.4.6 Tue Mar 31 18:10:59 PST 1998
  Bug Fix or Nit Pick:
    When sending a job AND the :qq or :use_queuename flag
    is set AND the job arrives without a Q entry THEN
    the name of the queue it was spooled to is used.
    (Noticed by:Cortney Sampson <sampson@physics.utoronto.ca>)
  
    Missing initialization in src/common/permissions.c
    Discoverer got the 'Gold Star with Flashy Sequins' bug hunting
    award.
    (Found by and Award to: Duncan McEwan <duncan@MCS.VUW.AC.NZ>)

  Lpr -Z options now accumulate, rather than overwrite, if the
    Allow_duplicate_options flag is not set.  This makes life
    easier for the user when specifying multiple -Z options.

  Allowed a LPR to LPD job transfer ending in a 'blank line' to be accepted.
    This is generated by some oddball LPR programs.
    (Reported by:  Patrick Hildenbrand <patrick@emea.ers.ibm.com>)

Release LPRng 3.4.5 Sun Mar 29 18:37:09 PST 1998
  LPF:
    Cleaned up some minor nits with options.
    (Noticed by: Patrick Powell <papowell@astart.com>)

  LPRng-HOWTO:
    A huge number of corrections from:
    (Tim Mooney mooney@dogbert.cc.ndsu.NoDak.edu)

  Enhancements: max_log_file_size, min_log_file_size

    Sometimes it is desireable to run a log file in order to try
    to find problems.  But if you do not truncate the log file, it
    can grow to enormous lengths.  The max_log_file_size#nnn
    (size in Kbytes, default = 0 or unlimited size)
    printcap/configuration variable will 
    cause the LPD server to check for the size of the log file
    on opening it and if larger than max_log_file_size K bytes
    truncate it to min_log_file_size
    (default 0 specifies max_log_file_size/4) Kbytes.  It preserves
    the last part of the file.

    Note that when the truncation operation occurs and there is
    heavy logging activity from multiple processes that the log
    file may get jumbled.  Recommended value of max_log_file_size
    should be pretty large in order to make the truncation activity
    minimal - 10240 (10 Megabytes) is what I have been using with
    pretty reasonable success.

  Enhancements:
    The time of a job error is now logged in the hold file.
    This allows the time of the error to be determined.

  Bug Fixes:
    Modified reporting of subserver processes that have been
    killed off or have core dumped.  This solved a problem with
    a system that would generate a SIGTERM signal.

    UTILS/accounting.pl fixed up. Also, psfilter and hpif now
    working correctly with the filter.
    (Patches, suggestions, and advice by:
      Gordon Haverland <haverlan@agric.gov.ab.ca>)

    The LPD/lpd_jobs code for retrying has been redone to make it
    more robust when printing fails.  The LPRng system will now
    agressively retry sending jobs.  Needless to say,  there are
    magic debugging flags to turn this off for testing purposes.
      (Noticed by:  Jesse Off <joff@cnde.iastate.edu>)

    The bogus 'server starting' and 'server done' messages have
    been removed from the status file.

    Now send a trace/logging message before the job is finally put
    in the spool queue.  Removes disturbing occurrence of 'success'
    messages being sent for a job that has not yet arrived according
    to log messages.

    More informative error messages and logging messages added at
    appropriate points.

Release LPRng 3.4.4

  Bug Fixes:

  termclear.c - tgetent() misdefined.
     Also,  configure now checks for Solaris systems and tries to
     handle their brain damaged colliding definitions in term.h, curses.h,
     terminfo.h and termcap.h files.

  ignore_name_format_errors is now documented.  Actually, it is really
    fix_bad_jobs.
    (Pointed out by:  Bruce S. Marshall  bmarsh@wwnet.com)

  Fixed a minor but annoying problem with hold files and very fast
    system.  Better solution would be to have an indexed database,
    but it is almost more trouble than it is worth to implement.

  Fixed a problem with 'Destination' being a pointer to dynamically
    allocated memory,  which would get deallocated by Set_job_status()
    calling Get_job_status().

  Fixed a problem with control file names not being formatted correctly.
    (Reported by:  John Perkins <john@cs.wisc.edu>)

  Fixed up LPRng-HOWTO,  created new version.

  snprintf() used instead of plp_snprintf()
    (Reported by: lots and lots of folks, including 
        "Reinhard Zierke" <zierke@informatik.uni-hamburg.de>)

Release LPRng 3.4.3
  Bug Fixes:
    Serial Port Configuration.  Do_stty not called to set up serial
      ports.  Reported by LOTs and LOTs of folks.
    Fixed the GetMaxServers() code to really find the maximum number
      of processes.
      (Fixes by: Don Badrak <dbadrak@gesg34.geo.census.gov>)
    Memory Leaks From Hell
      Found them.  Found the problem.  Decided that fixing the problem
      was not worth it.  Found an alternative method to the current one
      for starting processes that AVOIDS the memory leaks.

      In the new version of code,  the LPD main() process will start
      subprocesses only when it needs to.  Periodically,  it will run
      down the list of print spools,  starting (forking) a process.

      In the previous version,  it would call the Setup_printer() code
      which would then in turn all the routines which would allocate
      (malloc) memory that would never get deleted.  If there were jobs
      to be printed,  the main() process would then fork and create a
      server process.
 
      In the current version,  the main() process will create a pipe(),
      and then fork the child process,  which will call the *&I*(&()
      Setup_printer() code,  and then checks for work.  If there is NO
      work,  it exits (exit code 0), and as a side effect, the pipe is closed.
      The parent process will read 0 bytes, and say, 'Ah, No work'.  As
      a side effect,  it also gets the status.  If there is work,  the
      daughter will write a string to the pipe and THEN close the pipe.
      The parent will read the data,  and say 'Ah, work to be done'.

      There are several elegant little side effects of this method.  Firstly,
      the main() process will block until the child decides if there is work
      to be done.  In effect,  this will allows the child to proceed ASAP
      to the decision point.  Secondly, the parent process has a VERY small
      amount of memory allocated,  and does not grow at all large.  This
      helps,  as the children,  when created, have very small memory needs
      and process creation is sped up tremendously.

      I am surprised to find just how much better this is...  I probably
      should have done this before,  but I was trying to avoid process creation
      problems, and ended up with large memory footprints.

      (Proddings, pokings,  help, suggestions, and lots of tracking down by:
          Al Marquardt <almar@uiuc.edu> - who found the cause of the memory
            leak
          Branson Matheson <Branson.Matheson@FergInc.com> - who came up with
            another memory leak

         If you ever want to debug memory leaks,  please look at the
         malloc debugging package by Gary Watson.
              http://www.letters.com/dmalloc/
       )

     lpc move
       In the previous versions,  lpc move only worked if the spool
       queue was active.  This meant that you could not stop a spool queue and then
       move the jobs to a different queue.  Now you can.  However, if you
       redirect a queue, then it must be active for jobs to be redirected.
       C'est la Vie.
       (Reported by:  Gary Cender <gcender@eng.dowjones.com>)
 
     Some logging numbers were not being reported correctly.  They now should be.
       (Reported by:  Gary Cender <gcender@eng.dowjones.com>)

     The QQ option was not working correctly due to a coding typo.
       (Reported by:  Gary Cender <gcender@eng.dowjones.com>, and others)

     LPR was doing translate_format, which was wrong.
       (Reported by:  Chad Mynhier <mynhier@cs.utk.edu>)

     LPR does not use '-' as a flag to read from STDIN.  Documentation changed
       to reflect this;  easier than fixing LPRng... :-)
       (Reported by: "James P. Dugal" <jpd@usl.edu>)

     LPR now allows LOOOONG options to -Z.
       (Requested by:  George Lindholm <lindholm@cheshire.ucs.ubc.ca>)

     Race condition with job completion and testing for completion once
       again explored.  Now err on the side of 'slow but correct' rather than
       'fast but sloppy'.  Only happens on FAST servers,  and the alternative
       to run LPRng on slow servers was not taken well :-).
       (Reported by: Gary Cender <gcender@eng.dowjones.com>)

     OS/2 sends very odd control file format - now should parse this format correctly.
       (Reported by:   "Patrick Hildenbrand"<patrick@emea.ers.ibm.com>)

Release LPRng 3.4.2
  Bug Fixes:
    Connect_timeout was not used uniformly or documented accurately.
    (Fixes by: Heinz-Ado Arnolds <arnolds@ifns.de>)
    configure was too agressive in checking for -lresolv.  Now includes
     -lresolv only if gethostbyname2 is not found.
     (Problem reported by: Uri Blumenthal <uri@ibm.net>)
    It was observed that under heavy load conditions that some files
      were getting printed twice.  This was due to a race condition.
      The race condition has been eliminated by introducing another
      field into the job control information specifying the subserver
      process id.

Release LPRng 3.4.1
  New Baseline Release - Stable version

  Enhancements:
   The configure script now supports setting the installation directories
    configure --with-lpddir=DIR --with-admindir=DIR
      - sets the install directory for lpd and lpc/checkpc respectively.
   (Patches by:  Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>)
   Added a 'retry_etimedout' flag as well to handle connections to devices
    that have a very long connection time due to slow network connections
    over dialup devices.
   The lpq status now will show 'stalled' when 'stalled_time' is non-zero
    and the job is active for more than stalled_time seconds.
    (Suggested by: lots of folks)
   The check_idle=program facility can now be used to check that a printer
    is idle before processing jobs.  This is useful when you have multiple
    server queues. For example:
     lp:sv=lp1,lp2:...
     lp1:check_idle=/prog:...
     lp2:check_idle=/prog:...
    When the lp server starts up,  it will check the lp1 and lp2 queues,
     and will only send jobs to the one whose check_idle program reports
     an idle condition.

  Bug Fixes:
    Updated LPRng-HOWTO.
    Fixed missing permission check checkpc.
    Also (correctly) implemented ${option} expansion in filter commands.
     This now gets expanded to the printcap option value,  as documented.
    (Made by: Patrick Powell <papowell@astart.com>

Release LPRng 3-3-7

 Ports:
   Solaris 2.6.  Also update README.install for new startup/shutdown script

 New functionality:

   reverse_lpq_format : reverse returned lpq status format when from
      specified host.

    There is a defect in some System V support for RFC1179 printers.
    The lpq facility will send a 'SHORT' status request when a 'LONG'
    is desired,  and vice versa.  This results in the wrong status format
    being returned.

    The reverse_lpq_format=(globhost|ip/mask)+ option allows you to specify
    that when a request is received from a host whose name or address matches
    an entry in the list,  then SHORT/LONG format requests will be reversed.
    When the LPD is acting as an intermediate host,  the reversed request
    will be sent to the next destination on the list.  For example:
      reverse_lpq_format=*.eng.com,130.29.0.0/16
    will select hosts whose FQDN ends in eng.com or in subnet 130.29
    to have reversed lpq formats.

   return_short_status : return limited length status information
   short_status_length : number of lines to return

    Some users have expressed a desire to have the LPD server return
    short (i.e. - limited length) status to the requestor.
    The return_short_status=(globhost|ip/mask)+ option allows you to specify
    that when a request is received from a host whose name or address matches
    an entry in the list,  then only short_status_length (default 3)
    Status: and Printer_status: lines returned.

   lpc redo command:
    this forces a job to be totally reprinted, if it has been held
    in the spool queue.  This command has been added in order to allow
    the reprinting of jobs that have been printed and held in the spool
    queue, i.e. - the save_when_done printcap flag is set.

   routing filter 'priority N' output:
    the routing filter can set the destination, copies, and now the
    priority of jobs.  If the routing filter output is:
      dest t1
      CB
      priority B
      copies 2
      end
    then two copies of the job will be routed to the destination
    with priority B, and the C line in the control file will be
    set to CB.

   safe_chars=nnn  configuration file option.
    By default, LPRng detects and optionally eliminates suspicious characters
    from the control file;  the fix_bad_job option will enable removal.
    The safe_chars=nnn specifies that in addition to the normal safe
    characters, the indicated ones can be used as well. For example,
    save_chars=#" will allow # and " to be used in the control file.

Release LPRng 3-3-6

 New functionality:

  Timeouts: send_job_rw_timeout, send_query_rw_timeout replace send_timeout

    The printcap send_job_rw_timeout and send_query_rw_status options
    now set timeouts on read/write operations when printing or sending
    jobs to a remote host or doing a status or query operation respectively.
    If the value is zero, there is no timeout on the operation.
    These timeout values and the associated read/write operations
    solve a problem when LPQ or LPR tries to attach to a printer or system
    which accepts a connection but then does not reply to the request
    in a reasonable amount of time.  Note that the send_job_rw_timeout
    should be quite large (6000 or 100 minutes) in order to accommodate
    transient problems like paper outages on a printer.
    (Suggested by: Brad Rogers <brad@ast.lmco.com> and
        Alek Komarnitsky <alek@ast.lmco.com>)

  lpc active, lpd, and reread commands
    The lpc active command will try to open a connection to the remote
    server.  This allows non-LPRng remote servers to be polled to see
    if they are active.

    All of the active, lpd, and rereads now take a printer[@host] argument,
    allowing the specified server for the printer to be queried.
    (Deficiency noted by:  James P. Dugal <jpd@usl.edu>)

  stop_on_abort printcap flag (default TRUE)
    If a filter aborts and this flag is TRUE then all further processing
    of the queue stops until restarted by some other action and the job
    will not be removed from the queue.

  max_connect_interval (default 60)
    maximum interval between attempts to send a job to a remote site.

  user_lpc configuration option, SERVICE=U, and lpc command
    There was a request to allow a selected set of lpc commands
    to be performed by users on their individual jobs in a queue.
    This has been accommodated using the following method.

    1. A new user_lpc=cmd,cmd,... printcap operation enables the
       SERVICE=U permissions facility.  The cmd can be:
       hold, release, move, topq, kill, and abort.
    2. When the lpc command is checked for permissions by the LPD
       server,  and the cmd is one of the specified in the user_lpc
       printcap,  rejection is delayed until the point where individual
       jobs are checked for action.  At this point a check for
       SERVICE=U is performed on the permission database.  If,
       at this point the action is rejected OR the default action is
       to reject,  the action will not be performed.
    3. While users can perform a kill or abort operation,  they can
       only do this while their job is active or at the top of the queue.
    
Release LPRng 3-3-5
  HOWTO and README:
   The HOWTO/LPRng-HOWTO has been extensively editted and extended.
  This will replace the README.* files in the distribution.

  Enhancements:
   configuration/printcap flag: force_localhost
    force_localhost forces client programs (lpq, lpr, lpc, lprm, etc)
    to connect to the server on the local host, as is done on the
    BSD LPR system.

    This option has an effect ONLY if you use the destination
    in the printcap information for the printer.

    If you explicitly specify a printer@host as the destination
    (-Pprinter@host) then the force_localhost flag is ignored.

    The default is force_localhost = TRUE.

    Question: why this flag?

    Answer: the Most Frequently Asked Question in the LPRng mailing
    list is from users asking why lpq/lpr/lprm does not send the
    job to the local server, and why they are sending them directly
    to the remote printer instead of spooling them.  After having
    referenced folks to the documentation multiple times,  I have
    thrown in the towel on this one and have put in this flag.

    Question: what does this change?
    Answer:  If you are running a server on your system,  jobs will be sent
    to the server and then spooled.  You may need more spool queue space.

    If you want to use the "lpr_bounce" option,  you will need to turn
    try_localhost and force_localhost OFF (:try_localhost@:force_localhost@:)
    to get the old behaviour and not have the job run through the filters
    by both LPR and LPD.

    Question: Wouldn't it be easier to ask people to read the documentation?
    Answer: No.
    I gave up asking.  The LPRng behaviour was too different from the BSD LPD
    behaviour and folks who wanted a "rip out and replace" solution were
    too frustrated by the different behaviour.

   User Requested Status Information:
    lpr -mhost%port  now causes LPD to open a UDP (by default)
    connection to port on host and send status updates for the job
    being processed.  The form host%port,TCP  will open a TCP port
    rather than a TCP port.  Users can now use the monitor program
    (or a variant) to have job status reporting done.  This has the
    side effect that mail addresses of the form host%port will
    not get mail sent to them.

   Routing Filters:
     During job reception,  the :routing_filter: option specifies that the
   received job information is to be processed by a routing filter,  which
   supplies additional destination information or modifications.
     STDIN of the filter is attached to the control file (read/write)
   and STDOUT of the filter should be the additional control/routing
   information.  Note that routing filters that need to modify the
   control file can now do so by using FD 0 and making the modifications
   directly to the file.  After processing by the routing filter, the
   control file will be re-read by the lpd server, and checked for correctness.
   See the HOWTO (/HOWTO/LPRng-HOWTO.html) for more information.
     Exit codes for routing filter:
      JSUCC (0) - processing continues;
      JHOLD     - job will be held
      anything else - job will be removed (not accepted for printing)

  socket_linger#secs
     This option/flag has been added to solve a nasty problem
   involving closing network connections and process exit.
     When a process exits, the system will attempt to finish IO
   operations, flushing pending data to the destination.  However,
   It has been observed that when the LPD process which is doing
   the actual printing exits, it will sometimes terminate and the
   last output is lost.
     Experiments have shown that when the SO_LINGER flag is set on these
   connections,  the LPD process will not terminate until the last data
   has been transferred, which is the desired behavior.
     The 'socket_linger#nn' flag can be used to force setting the SO_LINGER
   timeout value.  By default,  this is now set to 10 seconds,  which
   appears to be compatible with most TCP/IP connections.  Note that the
   documentation is very blank on what happens when the connection is still
   "active" but no data is being transferred.
     If you are having problems with network connections and lost data
   at the end of jobs, try using:
       :socket_linger#120 
   in the printcap for the printer.

   LPRng executables default to SUID root at installation:
       By default, LPRng executables are now installed SUID root.
     This will reduce the number of problems encountered by folks who
     do not read the README.install instrucutions.
     (Noted by: Patrick Powell <papowell@astart.com>)

  :remote_support=RMQVC (default)
    R = lpr, M = lprm, Q = lpq, V = verbose lpq, C = lpc : allowed operation
    This option specifies the allowed operations to a remote printer.
    This solves the problem of printer servers 'hanging on lpq', due
    to their inability to handle multiple requests.  Note that the hang
    appears to be permanent - i.e. - the printer locks up.  Thus, you
    should never do a lprm, lpq, or lpc operation to the printer. The
     :remote_support=R: setting will do this.

  :rg=group[,group] - allow clients to use printer only if user
    is a member of one of the specified groups.
    (Requested by: Oved Ben-Aroya <oved@ns.technion.ac.il>)

  Bug Fixes:
   After a LOOOONG study,  the problem with non-LPRng servers terminating
   with 'out of space' error status has been resolved,  and hopefully fixed.
   (Noted by: Patrick Powell <papowell@astart.com>)

   Order of variables in sorted list was incorrect.
   (Noted by: Patrick Powell <papowell@astart.com>)

   README.pgp_authentication referenced 'client_auth*' names; should be
    'user_auth*' names.
   (Noted by: Patrick Powell <papowell@astart.com>)

   The print job transfer (LPD/lpd_rcvjob.c) code has been reviewed,  and
     the underlying method has been modified to accomodate reception of
     multiple jobs in a more consistent manner.
     1. On start of job transmission,  a 'lock file' is created.
     2. Data and control files are placed in 'temporary files' during transfer.
     3. At the end of job transfer,  rename() is used to change temporary
        files to permanent ones.
     4. The routing filter (if any) is invoked.  Note that the data files
        are available for reference during this stage.
     5. The control file is renamed to the final version.
   (Noted by: Patrick Powell <papowell@astart.com>)

   The plp_waitpid() code has been extensively modified,  together with the
     fdfork() code,  the killchildren() support,  and the Print_abort()
     code.  Hopefully,  this will now solve the problems of processes
     not being terminated and/or zombies accumulating.  This has the
     (desirable!) side effect that child exits will not cause system calls
     to terminate with EINTR status.
   (Noted by: Patrick Powell <papowell@astart.com>)

   By default, LPRng executables are now installed SUID root.
     This will reduce the number of problems encountered by folks who
   do not read the README.install instrucutions.
   (Noted by: Patrick Powell <papowell@astart.com>)

   Race condition with Set_control_info fixed.  Now file locking works
     correctly.
   (Noted by: Patrick Powell <papowell@astart.com>)

   For HP configurations and no GCC,  added a -Aa flag to CFLAGS
     (Suggested by:  Brad Rogers <brad@ast.lmco.com>)

   The logger support was flawed somewhat.  Previously, each process
     would open a socket (connection) to the logger - this would soon
     use up a lot of connections.  Now the LPD server opens a connection
     at initialization,  which is then inherited by the various processes.
     (Found by: Desmond Macauley <desmondm@eng.dowjones.com>)

   By default, LPRng executables are now installed SUID root.
     This will reduce the number of problems encountered by folks who
   do not read the README.install instrucutions.
   (Noted by: Patrick Powell <papowell@astart.com>)

   The SERVER permissions checking did not handle localhost correctly.
   (Noted by: Patrick Powell <papowell@astart.com>)

   Passed the PRINTCAP_ENTRY to routing filters and control file filters.
    (Patch by: George Lindholm <lindholm@ucs.ubc.ca>)

   Only LPD now does killpg() otherwise this effects output from the
     lpq, lpc, etc., programs.
     (Noted by: Patrick Powell <papowell@astart.com>)

   Jobs were being thrown away with Send_try#0 
     (Patch by: George Lindholm <lindholm@ucs.ubc.ca>)

Release LPRng 3-3-4
  Enhancements:
    When using routing_filters to cause jobs to be sent to multiple
     destinations,  you might want LPQ to report the status of the
     destinations as well.  The 'destinations=pr1,pr2,pr3' will now
     case LPQ to report the status of destination queues.
      (Work, patches, and slugging by: George Lindholm <lindholm@ucs.ubc.ca>)
    LPR and LPRM duplicate arguments:
      Some users would like LPR's and LPRM's arguments to be 'cumlative', i.e. -
        lpr -a x -a y   would be identical to lpr -a
      The allow_duplicate_args configuration flag will now enable this behaviour.
      Also, by default the class name and the job priority are identical.  The
        break_classname_priority_link flag breaks this link, and the class can be
        specified separately from the priority.  Also, the maximum classname
        size specified by RFC1179 is 32 characters;  the 'classname_length#nnn'
        (default 31) allows a longer classname to be used.
      (Patches supplied by: George Lindholm <lindholm@ucs.ubc.ca>)

  Bug Fixes:
    checkpc -p and -c options were not functioning as documented.
      (Noted by: Christophe Kalt <kalt@research.bell-labs.com>)
    README.bouncequeues indicated that exit status returned by
      the control_filter program was used to control job processing.
      README and common/fixcontrol.c updated to agree.  When control_
      filter exits with: JSUCC (0) - normal processing, JHOLD (37)
      job is held, JREMOVE, job removed, etc.
      (Noted by:  George Lindholm <lindholm@ucs.ubc.ca>)
    Generate_banner did not put banner in correct position.
      (Reported by: Jost Krieger <Jost.Krieger@ruhr-uni-bochum.de>)
    LPD/lpd_rcvjob.c - control file is now written to a temp file and then
      renamed as the control file.  This elminates problems with locks.
      (Suggested by:  George Lindholm <lindholm@ucs.ubc.ca>)

Release LPRng 3-3-3
  Updated the sample lpd.perm, README's to use the 'REMOTEUSER'
   rather than USER in the permissions value.
   (Spotted by:  Chen Shiyuan <csy@hjc.edu.sg>)
  Cleaned up filter and server killing code - added more robust
   exit and abort facilities.  This was done in several places
   in order to try to make sure that processes created for filters would
   be killed off when the server process exited.
  Cleaned up logging and some minor error messages.
  Removed 'intl/po2tbl.sed' and 'po/POTFILES' from distribution.
   (Noted by: George Lindholm <lindholm@ucs.ubc.ca>)

Release LPRng 3-3-2
  Thu Oct  9 20:03:30 PDT 1997
  lpr, lpq,... usage message formats fixed.
    (Patches by: Jan Barte <yann@plato.uni-paderborn.de>)
  Autohold support was accidentally removed from LPD/lpd_rcvjob.c


Release LPRng 3-3-1
  New Baseline Tue Oct  7 18:29:55 PDT 1997
  Comments:
    README.account updated to show how to use psfilter and CTI-hpif
    filters and accounting scripts.
  Bug Fixes:
    Permissions checking patch did not work correctly. Patcher patched
     patch to make patchwork code work correctly.
    (Originator of patch: Simon Wilkinson <sxw@dcs.ed.ac.uk>)

Release LPRng 3-2-12
  Bug Fixes:
  The sample lpd.conf file had ff=\\f which confused folks.  Now it
    has correct syntax.
  The end of job and Print_abort code has been clean up and modified
    so that exit is now fast and brutal.  When you do LPRM you now GET
    LPRM action fast and quick,  and no processes hanging around.
  The code for reporting fatal 'filter errors' has been modified to put
    the termination conditions into the LPQ status report.  This will
    simplify the job of finding out why your job died much easier.
  Jobs that now exceed their maximum number of print attempts are deleted
    by default instead of being retried indefinately.  This can be be
    suppressed by setting retry to 0, as documented.
  The above bugs/changes were the result of a long standing report of
    the LPD server being slow to respond when printing bad jobs.
  (Added by: Patrick Powell <papowell@astart.com>)

Release LPRng 3-2-11
  Enhancements:
   printcap/configuration 'network_connect_grace#nnn' variable
   is similar to the 'connect_grace' variable,  but pauses for
   the specified time between connections to LPD or other servers.
   Useful when using LPD prototcol to network based printers that
   need some recovery time between jobs.
   (Suggested by: Christian Illinger <illinger@lepsi.in2p3.fr>)
  Bug Fixes:
   all:all=p1,p2,p3 did not check correctly for separators.
    (Reported by: Bertrand Decouty <Bertrand.Decouty@irisa.fr>)
   configure.in - checks for random() defined in stdlib.h
    (Suggested by: Bernhard Rosenkraenzer <root@BOL-SubNet.ml.org>)
   Logging:  the JOBNUMBER is now reported correctly.
    (Reported by:  Gary Cender <gcender@eng.dowjones.com>)
   LPC move:  the job is deleted from the queue after being moved,
    even if save_when_done is set.
    (Requested by:  Gary Cender <gcender@eng.dowjones.com>)

Release LPRng 3-2-10
  Bug Fixes:
    In cleaning up the routing support in LPD/lpd_jobs.c and
    LPD/lpd_rcv.c,  I cleaned it up so much that only the first
    routed job was printed.
    (Reported by:  Gary Cender <gcender@eng.dowjones.com>)

Release LPRng 3-2-9
  Bug Fixes:
    Typo in src/common/linksupport.c caused very wierd error messages to be
    printed.
    (Reported by:  lots and lots of people)
   

Release LPRng 3-2-8
  Bug Fixes:
   snprintf used instead of plp_snprintf()
   (Reported by:  Dirk Wrocklage <dirkw@uni-paderborn.de>
     and Helmut Jarausch <jarausch@igpm.rwth-aachen.de>)
   Max_servers code did not function correctly - there was a logic error
     in the design.  As a result,  it would lock up and refuse incoming
     jobs.
    (Reported by: Jim Stosick <Jim.Stosick@Forsythe.Stanford.EDU>)
   Poll_time:  Under certain very odd conditions,  a spool queue could
    have a job in it and the LPD server would not fork a process to
    serve the queue.  The poll_time (default 6000 seconds) is a timer
    that will scan the print queues for a pending job and no server.
    The previous version had a race condition in it that would
    periodically spawn too many servers.  The new code not only fixes
    this problem,  but also enforces a true idle condition on the
    lpd server.  If there is no activity and no jobs,  then the server
    will not periodically wake up and check the spool queues.
  Force_poll:  Some users have software that places jobs in the
    spool queues,  and want LPRng to periodically poll the queues
    for these jobs.  The 'force_poll' flag has been added to provide
    this functionality.

Release LPRng 3-2-7
  Major Revisions:

  Hold file names and creation:
    When the server creates a job in a job queue,  it also creates
  a hold file along with the data and control file in the spool
  queue directory.  During job processing the hold file is updated
  by various processes.  As a result,  this file must be locked
  and carefully updated.  The implemented method of locking and
  holding locks for jobs was flawed,  resulting in race conditions,
  etc.

    The routines responsible for reading and writing hold files are
  Lock_job_control, Get_job_control and Set_job_control.  These have
  been modified as follows.
  0. A Lock_job_control() routine now generates and locks a control
     file.
  1.  The Get_job_control() routine may now open the job file in a LOCKED
     or UNLOCKED mode. It will open the file UNLOCKED if not passed
     a file descriptor (FD) created by Lock_job_control(),
     reads the file and then closes the file if not locked.
  2.  The Set_job_control() file now updates the hold file as follows.
     a) It creates a temporary file (open, locked).
        This file has the name _fAnnn, while the lock file is
        cfAnnn.
     b) It writes the job file to the temporary file.
     c) It RENAMES the temporary file to the hold file.
     d) If it has been passed a FD created by Lock_job_control()
        it will close the passed FD and return the locked FD;
        the effect is to maintain the lock on the control file.
     e) if not passed an FD, it simply closes the FD, effectively
        releasing the lock.

  This functionality guarantees the following:
   1. While there might be a race condition in time over a particular
      control file,  the Get_job_control() routine will always open
      either a 0 length hold file (i.e. - file is in an initial state)
      or a VALID COMPLETE non-zero length hold file.
   2. Get_job_control() (no lock) will always read correct status information
      or NO status information.
   3. If a Write operation is needed, Set_job_control() does this correctly
     and indivisibly.
   4. If a Read/Modify/Write is needed, Get_job_control() is requested to
     read and lock the file,  and then Set_job_control is used to modify
     the information.

   Hold File Name Format:
     In order to guarantee that jobs placed into the hold file have unique
   job numbers, i.e. - so you can reference them by job number,  the hold
   file name format is now hfAnnn.  Note that this means the host name is
   now not used.  The Find_unique_job_number() routine will attempt to find
   and create a hold file with a unique job number in the queue.

   Jobs Placed In Queues Always Get Unique Job Numbers:
     In the previous version of LPRng,  when a job was placed in a queue
   with an existing job with the same control file name,  the job overwrote
   the existing job.  This had some interesting side effects, mostly concerned
   with duplicate jobs.  If you have the 'Save Job After Printing' flag
   set,  you may run out of job numbers.

   Full_time printcap/lpd.conf flag
     Specifies that you want to have a full year-mo-dy-hr:... time
   format in log and status message.

   Binding to random ports
     The RFC1179 specifies connections must originate from port 721-731;
   most BSD implementations relax this to 512-1023.  There is a problem
   when trying to reuse a port and connecting to the same system;
   TCP/IP requires about a 10 minute timeout on a IP:port/IP:port pair.
   The code that tried to do connections originally tried the ports in
   sequential order, leading to long delays.  Now it will try them in
   RANDOM order, and will try at most 'connect_try' ports at a time
   before admitting failure.

  Bug Fixes:
    Minor nit with lpc commands fussing about RemotePrinter values.
      (Reported and patch by: Martin Pahl <pahl@tnt.uni-hannover.de>)
    File descriptors are lost if the remote system that we are trying to send
    a job to doesn't like the printer name we are trying to use.
      (Reported by: George Lindholm <lindholm@ucs.ubc.ca>)
    Permissions checking for PRINTER=host,@netgroup was done incorrectly.
      checking now done by match_pr().
      (Reported by: Sergio Tessaris <tessaris@ictp.trieste.it>
        and Warren Marts <warren@nmt.edu>)
    Problems with Get_perms() when rereading the permissions database.
      The actual problem was trying to be too tricky and preallocate data
      structures.  When this was done incorrectly,  you had some very odd
      results when rereading the same database.
    LPR: when printing multiple files,  data files were duplicated.
      i.e. - dfA..., dfB..., ..., dfZ..., dfA...
      Fixed LPR/lpr_cpyjobs.c so that now we have dfA... dfZ, dfa..., dfz
      (Reported by: Simon Wilkinson <sxw@dcs.ed.ac.uk>)
    User detected a bug where the "-r" option to LPR (LPRng 3.2.6)
      actually removes files even if the job was not spooled successfully.
      my patch to fix this problem.  Updated LPR man page to reflect the dreaded
      -r (remove after printing) option.
      (Reported and Fixed by: Garrett D'Amore" <garrett@qualcomm.com>)
    Permissions checks for group did not check the group id, just the
      user name.
      (Reported and Fixed by:  Simon Wilkinson <sxw@dcs.ed.ac.uk>)
    Race conditions src/LPD/lpd_jobs.c between printer server
      and worker process caused a null pointer reference.
      (Reported and Fixed by: George Lindholm <lindholm@ucs.ubc.ca>)
    Checkpc did not use correct lockfile format.
      (Reported by: Jan Barte <yann@plato.uni-paderborn.de>)
    When routing a file,  the route Xnnnn information was not used.
      Updated Fix_control to use this information as per documentation.
      (Reported by: Patrick Powell <papowell@astart.com>)
    Control file not reparsed after 'control_filter' processing.
      It is now reparsed,  and only the new contents are sent
      to the destination.  This includes the data files.  The
      control file filter MUST remove excess data files.
    End of job accounting to a remote server was erroneously expecting
      an 'ACCEPT' reply. Fixed.
      (Reported by: Markus Fleck <fleck@informatik.uni-bonn.de>)

Release LPRng 3-2-6
    README.accounting, lpd.8, printcap.5 man pages - accounting file is
      documented as not being created.
      (Reported by: Christophe Kalt <kalt@research.bell-labs.com>)
    LPRM/LPD did not forward remove commands correctly.
      (Reported by: Paul Zablosky <zablosky@ucs.ubc.ca>)
    Permissions:  PRINTER attribute can now be a netgroup.  This allows
      things like:
       ACCEPT SERVICE=R,P PRINTER=@PRIP_printers REMOTEGROUP=@PRIP_users
       REJECT SERVICE=X,R,P PRINTER=@PRIP_printers
      makes management of printers... easier... I suppose.
      Updated lpd.perms.5 as well.
      (Suggested by: John R Lane <lanejohn@cps.msu.edu>)
    Removed mention of "co" flag (obsolete) from lpd.conf man page.
      (Reported by Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>)
    HP/UX version 10.x needs to use termiox IOCTL call to set
      hardware handshaking on.
      (Reported and patches supplied by:
        Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>)
    lpc printcap command now only needs STATUS (S) privileges.
       New DEFAULTQ protocol message added.  This allows lpc to request
       the default queue used by LPD.
    fix_bad_job flag now ignores duplicate control lines,  and replaces
       bad characters with blanks in control file.

Release LPRng 3-2-5
    configure:  now checks to see if inet_ntop() is in resolver
      library (-lresolv),  and includes it when doing checks for
      other functions.
    termclear now uses IS_LINUX instead of __linux__
      (Reported and fixed by: Horst <horst.fickenscher@it.erlm.siemens.de>)
    memory leak fix of 3-2-4 interacted with other code in unexpected
      manner - revised memory fix.
      (Reported and fixed by:  Patrick Powell <papowell@astart.com>)
    LPD/lpd_status.c - status display line length now controlled by
      max_status_line configuration/printcap variable,  which allows
      the maximum line length to be exceeded if desired.  Default is
      still 79.
    src/Makefile.in COMPILATION FLAG: STRICT_RFC1179
      default originate_port value is now 512 - 1022,
      rather than RFC1179's 721 - 731.  compiling with -DSTRICT_RFC1179
      sets the default to 721 - 731.

Release LPRng 3-2-4
    LPD - pursued and found an extremely minor memory leak that
      was exercised only under a very unusual set of conditions.
      (Reported and fixed by:  Patrick Powell <papowell@astart.com>)
    Batch of patches and errors: Tom Bertelson <tbert@pamd.cig.mot.com>
      include/portable.h - minor changes in SUNOS prototypes
      CHECKPC/checkpc_port.c - better check to see if setproctitle worked
      PAIR() macro has added guards for _PROTO_ problems
      rw_pipe() has a minor portability problem clean up.
    LPQ, LPR, LPRM option checks were done incorrectly.
      (Reported by: Scott Nelson <nelson@canopus.llnl.gov>)
    umask(0177) should really be umask(0077) to allow correct directory 
      permissions checking.
      (Reported and fixed by: Guy Geens <Guy.Geens@elis.rug.ac.be>)
    lpd - the lpc reread function sends a signal to the LPD server,
      which then calls 'Read_pc' from a signal handler.  This can cause
      problems.  In addition, there was a memory leak in the Read_pc()
      routine.
      (Reported by: Rainer Schoepf <schoepf@uni-mainz.de>)

Release LPRng 3-2-3
 BUG FIXES:
    src/Makefile(Makefile.in), man/Makefile.in did not do 'make install
      prefix=/xxxx' operations correctly.
      (Reported by: Chris O'Regan <chris@ECE.concordia.CA>)
    Get_remote_hostbyaddr() used host_ent when it was undefine/null.
      (Reported by: Carson Gaspar <carson@lehman.com>)
    Patch for HAVE_SIGLONGJMP did not include common/timeout.c and
      include/portable.h.
      (Reported and fixed by: Guy Geens <Guy.Geens@elis.rug.ac.be>)

Release LPRng 3-2-2
 BUG FIXES:
    Not freeing memory allocated by Expand_value().
    (Reported by: "Todd C. Miller" <Todd.Miller@cs.colorado.edu>)
    Added logging for non-job related operations.
    Added finer time resolution on job changes
      (Requested by: Chao-Wen Young <kiki@eng.dowjones.com>)
    Added LPDEST environment variable for  printer as well as PRINTER
      and NGPRINTER
      (Suggested by: Garrett D'Amore <garrett@qualcomm.com>)
    Moved Print_flush() to Print_abort().
      (Motivated by: Gerhard Schneider <gs@ilfb.tuwien.ac.at>)
    MONITOR/monitor.c had duplicate include references.  This caused some
      portability problems with systems that did not have 'guards' in their
      include files for multiple inclusion.
      (Reported by: John Perkins <john@cs.wisc.edu>)
    lpstat format fixes.
      (Reported and Fixes: Carson Gaspar <carson@lehman.com>)
    common/getqueue() rejects control files with duplicate remove lines -
      this is not a big problem,  so added code to ignore them.
      (Reported and Fixes: Frank Terhaar-Yonkers <fty@cisco.com>)

Release LPRng 3-2-1
    Baseline Release

Release LPRng 3-1-13
    Changed sleep() calls to plp_sleep(), which uses select mechanism,
      to avoid interactions with SIGALRM signal handler in Linux.
    In the waitchild() code,  the signal(SIGCHLD,SIG_IGN) caused
      some systems to automatically perform a 'wait()' on child
      processes.  The SIG_DFL only ignored the signal, and the
      waitpid() would then succeed.  Note that this action is implied
      by the POSIX standard wording for _exit().
    The code for job queue scanning will not report 0 length
      control files as errors until they are older than an hour.
    The LPD/lpq_status() now ignores jobs being transferred,
      and does not report their status.
    LPD/lpd_rcvjob() now allows multiple jobs to be transferred on a single
      connection.  This is a violation of RFC1179 but it is now done.
    Expanded \xx entries in Banner line, so that very strange
      filters that insisted on these characters would get them.
      If a banner line had these characters,  a \n is not appended.
    Bounce queue destinations no longer have to be printer@host,
      they can just be printer.  The default destination is the
      server host.
    CHECKPC/checkpc.c - To_root() interferred with Test_code();
      reordered code.
      (Reported by: Todd Rannow <rannow@msc.edu>)
    common/check_remotehost() - added checks for Is_server, moved some
      tests into LPD/lpd_status.c, LPD/lpd_remove.c
      (Reported by: Damon W Atkins <zdxa21@gascor.vic.gov.au>)
    Solaris 2.4 LPD server insists on sending REQ_START messages -
      and gets peeved when it gets an error.  Now messages are NOOPs.
      (Reported and fix suggested by: Jussi Eloranta <eloranta@voimax.voima.jkl.fi>)
    Read_fd_len_timeout() closed fd on timeout - this was not correct behaviour.
      (Reported by: Todd Rannow <rannow@msc.edu>)
    Clients (LPR, LPQ, LPC) were not expanding printcap %P, %H, etc., entries.
      (Reported by: Damon W Atkins <zdxa21@gascor.vic.gov.au>)

Release LPRng 3-1-12
    Check_remote modifications exposed logic error in various places-
      need checks for both RemotePrinter and RemoteHost, not just
      RemoteHost.

Release LPRng 3-1-11
    Missing check for Is_server in Check_remote() caused clients to
      not connect to LPD server.

Release LPRng 3-1-10
    LPR/lpr_cpyfiles() did not handle multiple copies of stdin
      correctly.
      (Reported and fixed by: Jens Thiel <thielj@uran.informatik.uni-bonn.)
    LPR and clients updated hold files.  Added checks for Is_server in the
      appropriate places.
      (Reported by: Lee Muh Hwa <cceleemh@dolphin.cc.nus.sg>)
    Problem with bad printer name detection.
      (Reported and fixed by: Martin Pahl <pahl@tnt.uni-hannover.de>)
    setstatus() was not sending STATUS information to the logger.
      (Reported by: Chao-Wen Young <kiki@eng.dowjones.com>)
    Bad non-existent printer,  printcap file misconfiguration code.
      (Reported and fixed by: Dirk Nitschke <ms3a512@math.uni-hamburg.de>)
    Documentation and man page editting - minor corrections, missing entries.
      (Comments and patches by: Florian La Roche <florian@knorke.saar.de>)

Release LPRng 3-1-9
    lpq -v format modified so Destination was printed correctly.
    Remove_job() did not remove all the data files or hold files.
    dofork() did not zero Tempfile->pathlen.
    LPR/lpr_cpyfiles() did not preallocate the job file array,
      leading to problems when realloc() was called.
    printcap(5) and lpd.conf(5) man page cleanup.
      (Done by: Florian La Roche <florian@knorke.saar.de>)

Release LPRng 3-1-8
    Print_job() did not use correct queue name.
    Man Pages did not get right version number.
    force_queuename not in printcap(5) man page.
      (Reported by: Guy Geens <guy.geens@elis.rug.ac.be>)
    In LPC, Queue_name is not NULL when getprinter() is called.
      (Reported by: Jussi Eloranta <eloranta@voimax.voima.jkl.fi>)
    The filter environment variable PRINTCAP_ENTRY now holds the
      printcap entry for the printer.  In conflict with some filters
      using PRINTCAP to hold the pathname of the /etc/printcap file.
      (Reported by: Guy Geens <guy.geens@elis.rug.ac.be>)
    waitchild() had an alternate wait3 implementation that turns
      out to be broken on some systems.  Force use of the waitpid()
      version.

Release LPRng 3-1-7
  New Functionality: poll_time configuration variable
    There is a small, but almost impossible to eliminate, race condition
    when a job is put into a busy queue.  If the server process checks to
    see if there is work to be done, and the job is put into the queue
    after that point,  then there is a possiblity that the server may
    exit with a job in the queue.  This can be solved by using semaphores,
    locks, etc., but is almost impossible to do in a portable and efficient
    manner. The 'poll_time#nnn' configuration entry has been added to
    allow the administrator to specify an interval at which the queues
    can be periodically checked for unprinted jobs.
    The default poll_time value is 6000, i.e. - 10 minutes.

  Bug Fixes:
    printcap.5 documents :mi: (spool directory space needed) as number
      but it is a string.  Fixed documentation.
      (Reported by: Jeff Bacon <bacon@twinight.org>)
    Install.txt, Install.ps - lp=host%port misdocumented.
      (Reported by: Jeff Bacon <bacon@twinight.org>)
    printjob.c - check to see if there is a filter; if not, shove
      file directly out.
      (Reported by: Guy Geens <guy@abacus.elis.rug.ac.be>)
    src/Makefile - SUID_ROOT_PERMS= 04755 -oroot should be -o root
      (Reported by: Dave Goldhammer <Dave.Goldhammer@Colorado.EDU>)
    POSIX uses LOGNAME environment variable - check this first, then
      USER for user information.
      (Suggested by: Todd C. Miller <Todd.Miller@cs.colorado.edu>)
    lpc now allows printer@host specification.
      (Reported by: Doug White <dwhite@gdi.uoregon.edu>)
    printer queue loop detection algorithm modified
      The code to detect print queue loops was too agressive, and gave
      false warnings about print queue loops. Now only checks for explicit
      loops.
      (Reported by: Yuji Shinozaki <yuji@cs.duke.edu>)
    Start_all() code did not check for a limit on the number of processes
      that would be started by the server.

Release LPRng 3-1-6
  Bug Fixes:
    The :direct_read: flag now works for bounce queues.  Tested with aps
      filter.  The aps filter distribution of globals/GLOBALS.sh has been
      modified to have defaults for various options that allows even a
      (possibly) misconfigured filter to produce some sort of output
      instead of dying with a strange error message.
    setstatus() was not putting \n on end of lines, but only when used
      on Solaris 4.1.4 with Sun's ACC compiler.  Compiler bug.  Rather
      than fix the compiler,  we (hopefully) modify the code.
      (Reported by: Reinhard Zierke <zierke@informatik.uni-hamburg.de>)
    LPSTAT simulation:
      Progress reporting too coarse.
      lpstat -s too verbose.
      lp now reports 'request id is ....'
      (Reported by: David Livingstone <davidl@scdes.cn.ca>)

Release LPRng 3-1-5

  New Functionality: PCNFSD compatibility
    PCNFSD - Public Domain version,  from Geoff Arnold (Geoff.Arnold@Sun.COM,
      geoff@East.Sun.COM).  Assumes that LPC will return list of
      printers,  indented one space.  (Fixed).
      Added README.pcnfsd as a guideline for users.
    LPRM now says 'dequeueing' (yech!) instead of 'removing' to make it
      consistent with lprm and PCNFSD implementations.
    PCNFSD distribution put into LPRng collection.

  Bug Fixes:
    cleanup() was causing early exits due to use of killpg();
      commands such as lpq |more would not work correctly.
      Fix was to suppress top level process from killing itself.
    autoconf bizzarness - src/Makefile.in now has ${prefix} entries
      to match the INSTALL documentation.  You can now do
      make prefix=xxx and software will be installed in xxx/bin
      Default directories made to conform with existing LPRng ones,
      not Linux/GNU ones.
    LPD/lpd_jobs: when a job is aborted, the return status is
      clobbered.  Now it is not clobbered.


Release LPRng 3-1-4

  New Functionality - :oh: entry does globmatch on FQDN host name.
    The :oh=*val*: entry can now be used to do matching on the
    FQDN host name.  This allows such things as defining classes
    of printers, i.e.:
      lp:oh=*lab1*:lp=pr1@server
      lp:oh=*lab2*:lp=pr2@server
    (Inspired by: Nathan Neulinger <nneul@umr.edu>)

  Bug Fixes:
    Debugging stuff added to Is_printable();  LPR/lpr.c and company had
      the control file generation fixed up so that lpr -K worked correctly
      when taking input from stdin; also when using it with lpr_bounce.
      (Reported by: Andrew Leahy <A.Leahy@st.nepean.uws.edu.au>)
    autoconf Version 2-12 has a bug and was not generating configuration
      files correctly;  fixed this and now the --exec_prefix option
      appears to work correctly.  To regenerate configure from configure.in,
      the following acgeneral.m4 file lines must be changed:
          .... original .....
          test "x$prefix" = xNONE && prefix=$ac_default_prefix
          # Let make expand exec_prefix.
          test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

          .... correct ......
          test "x$prefix" = xNONE && prefix=$ac_default_prefix
          # Let make expand exec_prefix.
          test "x$exec_prefix" = xNONE && exec_prefix="${prefix}"
    Permissions checking in Is_printable() was erroneous.
      (Reported by: Dirk Nitschke <ms3a512@math.uni-hamburg.de>)
    Find_non_colliding_job_number() did not check to see if job priority
      was available, and was generating bogus hold file names.  This only
      occurs when data files are sent first.
 
Release LPRng 3-1-3

  New Functionality - Kerberos authentication uses encryption
     Send encrypted and authenticated information by default.
       (Greateful thanks to: Ken Hornstein <kenh@cmf.nrl.navy.mil>)

  Bug Fixes:
    Fix_str(): missing null pointer check
      (Reported by: Christian Kuehnke" <Christian.Kuehnke@arbi.Informatik.Uni-Oldenburg.DE>)

    

Release LPRng 3-1-2

  New Functionality - glob matches for printer names:

    At USENIX97,  somebody mentioned that they wanted to have a 'wildcard'
    entry that would allow them to 'trap' all sorts of printers, and then
    do formatting based on the printer name.  I puzzled over this, until
    I realized that the combination of the :qq: (put queue name in job)
    and a wildcard match would do exactly what this person wanted.
    The more I thought about it,  more functionality seemed to be
    provided by this - you could match various arcane printer names
    against patterns, etc.

    Now when a job arrives and the LPD server is searching for the queue
    name, the search is done using a glob match.  Note that you
    cannot have a primary printer name with a GLOB character,  but it
    is allowed to have an alias with one. For example:

        pr1|pr*|all printers which start with pr
            :lp=pr1@host
            :qq
        pr2|*|wildcard match
            :lp=pr2@host
            :qq

  New Functionality - munging control files:

    There is now a 'control_filter' option that will cause the control
    file to be passed through a filter.  This takes place only when a job
    is transferred to a remote printer.  It was intended to be used by
    bounce queues whose destination required extremely whacko formats
    for their control files.  See README.bouncequeues for details.

  New Functionality - generating banner pages for remote printers:
    The :generate_banner: printcap option will now generate a banner
    page for remote print jobs and/or when using LPR and :lpr_bounce:
    is set.  The banner is generated by the banner printer specified
    by :bp: or the default banner printer.  If the :hl: (header or
    banner last) flag is set, it will be the last part of the job printed.

  New Functionality - spreading job numbers to avoid collisions:

    Some users have been encountering job number collisions when using the
    routing facility and making multiple copies.  The "spread_jobs" printcap
    and configuration variable now allows you to spread out job numbers
    by the indicated factor.  The job number is based on the process id;
        jobnumber = processid * spread_jobs;
    Under heavy use,  this value should be set to the expected maximum
    number of jobs copies that will be made.

  Fixes and Extensions:
    fixcontrol.c - badly formatted DEBUG message.
        (Reported by: Reinhard Zierke <zierke@informatik.uni-hamburg.de>)
    configure - cray-unicos is now just unicos in the system targets.
       In addition, HAVE_SYS_SIGLIST botches have been fixed.
    fix_create_dir() segment faulted
        (Reported by: Reinhard Zierke <zierke@informatik.uni-hamburg.de>)
    LINUX has undocumented (and in my opinion broken) gethostbyname()
        and gethostbyaddr() interactions.  The code that does lookup
        now performs extremely picky checks, copies, etc., to avoid
        problems with this.
        (Reported by: just about every LINUX user...)
    Makefile: install was missing a value.
        (Reported by: Doug White <dwhite@gdi.uoregon.edu>)
    :bk: (Backwards compatible) now forces short job names and
        short job numbers as well.
    LPC - lpq command now takes the last printer specified as its default.
        (Suggested by: Jeff Bacon <bacon@twinight.org>)
    IRIX and UNICOS compilation mods.
        (Suggested by: Paul Burry <rpburry@magi.com>)
    Aborted LPR caused 0 length files to be left in spool directory
    Multiple copies and routing interact
        (Andrew Leahy <A.Leahy@st.nepean.uws.edu.au>)
    config.sub now recognizes i686 as a proper machine type.
        (Reported by: Michel Robitaille <robitail@IRO.UMontreal.CA>)

Release LPRng 3-1-1

  New Functionality:

    Support for client to server and server to server authentication. 
    See README.authentication and lpd(8) man page, as well as
    README.pgp_authentication.  Currently, pgp is supported for
    client to server and server to server authentication; Kerberos
    is supported for client to server authentication.

    Printcap entries can contain the following:
       %a  - architecture
       %H  - fully qualified domain name of host
       %h  - shost host name
       %P  - printer (when in printcap entry)
       %R  - remote printer (when in printcap entry)
       %M  - remote host (when in printcap entry)
    This is the same as for the configuration information.  Note
    that these keys are marked by %; keys marked with $ such as $P
    are expanded only when used by filters.  Currently only the
    :sd: (spool directory),  :server_user:,  and :remote_user: (for
    authentication) are expanded.

    Support for lp(1) simulation (Solaris SystemV R4) print facilities
    now built in.  This is done by checking the name that the program
    is invoked with:
      lpr invoked as lp - simulates lp operation 
      lpq invoked as lpstat - simulates lpstat operation 
      lprm invoked as cancel - simulates cancel operation 
    Note that this is not full functionality,  but it will provide
    a usable interface for programs that need lp, lpstat, and clean.

    man pages updated and rewritten to reflect latest changes.

    IPV6 awareness is being planned for.  The permissions checking is
    now done assuming that information returned by gethostbyname()
    and/or gethostbyaddr() may be for IPV6.  Host names checking
    is done not only on the cannonical (main) host name, but also
    for aliases;  the IFIP permissions check has been added to allow
    access to the IP address reported by the accept() system call
    that reported a connection.  See README.lpd.perms for details.

    A new printcap flag, :direct_write: now passes a file descriptor
    to print filters.  This is backwards compatible with the old BSD
    filters,  but you lose the ability to monitor the printing
    process.  In addition,  you are stuck with 'send_timeout'
    seconds for printing a job,  which may not be suitable if a job
    hangs up on a printer.

    Makefiles compatible with the BSD make are now provided;  these
    are generated from the basic Makefiles using a simple conversion
    script.  Of course, the Makefiles were redone in order to make this
    feasible...

    LPR now can do filtering if the :lpr_bounce: flag is set.

  LPR Protocol Extensions:

    REQ_SECURE: an authenticated transfer of job and control information.
     See the details in the README.authenticate and lpd.8 man page.

    REQ_VERBOSE: provides a hideously detailed set of information about
     the print queues and their status.  This is of interest to persons
     who are trying to provide tracking for jobs and other information
     and need more than the status provided by the high level LPQ
     dumps.  The LPQ -v format now will generate this.

  LPQ and Status Generation
     LPQ now prints each queue status once.  In addition,  when getting
     status, LPD makes a valiant effort to avoid forking and creating
     processes.  This makes things much more easy on the system load.

  Source Code Reorganization:
    A major source code reorganization was done in order to support
    configuration management tools in a more effective way.

  System configuration and printcap initialization is now done by
    the values in the lpd.conf file,  which can contain printcap
    flags as well as configuration information.  This allows
    defaults to be set in a much simpler manner.

  Beta Testers:
    Pseudo Anonymous, <pseudo@erehwon.org>
    Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>
    Dirk Nitschke <nitschke@math.uni-hamburg.de>
    Paul Burry <rpburry@magi.com>
    Thierry.Besancon@lps.ens.fr (Thierry BESANCON)

  Fixes and Extensions:
    configure and Makefile support for CRAY (by Paul Burry <rpburry@magi.com>)
    using the lpc class facilities now prevents held class jobs from being
      printed.
      (Reported by: Chao-Wen Young <kiki@eng.dowjones.com>)
    gethostbyname() has a possible problem.  Added checks for
      parameters. 
      (Reported by: Jens Thiel <thielj@uran.informatik.uni-bonn.de>)
    printcap '@' operator did not set clear entries.
      (Reported by: Park Jae-hyon <jhpark@entropy.kaist.ac.kr>)
    filter error code 'JFAIL' now causes job removal.
      (Reported by: Norman R. McBride <N.R.McBride@city.ac.uk)
    SAMEUSER permission check was not working correctly.
      (Reported by: Carsten Benecke <benecke@informatik.uni-hamburg.de>)
    LPD now checks for the number of servers it has active;  Max_servers_active
      configuration variable sets this.  In addition,  uses the getrlimit()
      to determine real value if available.  This should throttle back
      problems when a lot of LPR connections are being made and the server
      proceeds to die or lose jobs.
    getconnection() now tries to open a connection with different
      originating ports.  This solves a problem with some systems that
      did not like LPRng originating connections from the same reserved
      ports.  Users encountering this difficulty might have to use
      a wider port range;  this can be done now by modifying the printcap
      entry for the printer.
    checkpc now has Is_server set to 1, so it should do the full
      server compatibility checks.
    Queuename not being set correctly.
      (Reported by: Thierry.Besancon <Thierry.Besancon@lps.ens.fr>)
    LPC now calls 'lpq' via a bombproofed system() call
      (Suggested by Paul Burry <rpburry@magi.com>).
    LPR now generates correct job names for more than 26 files.
      (Reported by: Guy Geens <ggeens@elis.rug.ac.be>)

Release LPRng 2-4-3
  New Functionality:
    Printcap Files
      The printcap reading and configuration file reading code
      now supports the following:
      1. you can have multiple :tc=name: references.
      2. printcap entries whose main name starts with a punctuation character
          is not used as a printer.  However,  it can be referenced by
          :tc=: entries.  For example,  the following shows how to
          use this facility.
  
      @filter:if=/bin/whatever:of=/bin/whatever
      @banner:sh:sb
      @spool:sd=/var/spool/%P
      p1:tc=@filter:tc=@banner:@spool
  
      In addition,  the following printcap entries have %P (printer),
      %h (short host name), and %H (Fully qualfied domain name of
      host) replaced by the current values before jobs are processed;
      other values are ignored and replaced by which space.  A %% is
      replaced by a single '%'.  The variables which are expanded are
      controlled by the flags value of the src/printcap.c/Pc_var_list[]
      array;  currently the following are expanded:
        :sd=: (spool directory)
    Device Locking:
      This code was originally put in place for systems where you might
      have multiple people trying to use a printing device.  The 'lk'
      flag now controls if you want to lock the IO device.  Default
      is no locking.

  Portability Fixes:
    Quicksort is not a stable sorting algorithm - if two entries are
    identical, then their position can be reversed.  The order of entries
    is important and needs to be preserved when reading information,
    so mergesort() is now used.

    The organization of the include files was causing problems with
    testing packages.  There is now one include file for each major
    functional component.  Global variables are now in a single file,
    and are the same for all packages.  The difference in size of
    the executables was minor.

  Bug Fixes:
    Printcap reading code: now handles forward references correctly.
     (Reported by:
       Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>)
    Ruthless purging of metacharacters passed to filters.  This includes
      quotes, backslashes,  and all other even vaugely funny characters.
      (Reported by:Bertrand Decouty-INRIA Rennes-France
        <Bertrand.Decouty@irisa.fr>)

Release LPRng 2-4-2
    Missing REMOTEGROUP check in permissions.c
      (Reported: Michel Robitaille <robitail@IRO.UMontreal.CA>)
    configure.in: Added more robust check for undefined functions
      on various systems,  added checks in source code for various
      variants: termclear.c, gethostinfo.c
      (Reported by: Doug White <dwhite@gdi.uoregon.edu>,
        Sven Rudolph <sr1@inf.tu-dresden.de>)
    LPQ: status line now too long, truncated it to 79 chars.
    LPD: time of day format changed to YY/MM/DD/HH:MM:SS
    LPC: autohold and noautohold command changed to 'holdall'
      and 'noholdall';  LPQ: autohold and holdall status reporting
      added.
    lockfile.c: Added #if !defined(LOCKDEV) code to not do locking
      on serial devices. 
      (Reported by: bennett@nomolog.nagoya-u.ac.jp (Bennett))
    Printcap printer names: primary printer names starting with
      punctuation are now treated as simply entries and not valid names.
      This means that they can be referenced as tc=@name, i.e.
        @name:if=/whatever
        prname:tc=@name
    Multiple Server Queues: ss/sv code reworked again - got rid of several
      race conditions,  lost files.
    Routing filters: added code to handle dropped jobs better.

Release LPRng 2-4-1
  minor problems with Makefiles, portability fixes.
   (Reported by: Michel Robitaille <robitail@IRO.UMontreal.CA>)
  malloclist.c error message format wrong.
   (Reported by: Jens Thiel <thielj@uran.informatik.uni-bonn.de>)

Release LPRng 2-3-14
  New Functionality:
    Jobs are now sorted by priority.
      (Reported by: syl@ecmwf.int (Lennart Sorth))
    LPC CLASS option added.  Classes of jobs can now be held and/or
      released.  lpc class printer A,B,C would release jobs with
      classes A,B,C; lpc class printer J=*form1*  would release jobs
      whose job name contained the form1 string.
      (Requested by: garyc@eng.dowjones.com (Gary Cender))
    Printcap and Configuration :send_failure_action:
      when a job fails to be printed or transferred, it is automatically
      retried :rt: (:send_try: or configuration send_try) times. A 0
      :rt: means infinite retries.  It may be desirable under various
      circumstances to have a method of dynmaically deciding if an error
      threshold is exceeded or some other action is needed.  The
      :send_failure_action: printcap and/or configuration variable specifies
      the default action when :rt: is exceeded.  It can have the following
      form:
        1. The string "success", "abort", "retry", "ignore", "hold"
           which will cause the job/spooler to treat as successful,
           abort, retry, ignore, or hold the job respectively.
        2. A filter of the form: |/filtername.  The filter is executed
           with the default set of filter options,  and the number of attempts
           is printed to its standard input.  It can print error messages
           to standard error, which are placed in the spool error log.
           The exit codes JSUCC (0), JFAIL (1 or 32), JABORT (2 or 33),
           and JREMOVE (3 or 34), JIGNORE (5 or 36), etc. will force
           removal as if successful, retry, etc. as for the text form.
    README.nis: new script for creating NIS (YP) databases.
      (Contributed by: Sven Rudolph <sr1@inf.tu-dresden.de>)
    LPF: modified the -T option, added -D (debug level option)
      (Contributed by: Sven Rudolph <sr1@inf.tu-dresden.de>)
    LPD cannot be started from inetd.  This functionality
      puts a very heavy load on the system and trying to make
      it function correctly was very difficult.
    Makefile: PREFIX variable defined, to allow overriding default
      prefix value.
      (Suggested by: Sven Rudolph <sr1@inf.tu-dresden.de>)
  Major Fixes:
    File Locking:
      The code for dealing with file locking and job name collision was not
      sufficient to handle the case where multiple jobs were being submitted
      simultaneously.  The new code uses the hold file for locking jobs,
      in addition to locking the control file.  When a job is submitted via
      LPR or forwarding,  the hold file is created, written with the
      receiving process PID,  and is then released.  When other processes
      try to submit a job,  they will lock the hold file, check for the running
      process, and then try anther job if the process is still delivering
      the job files.  When all of the job files are delivered,  the process
      will then write the hold file with -1, i.e. - a signal that all files
      have been delivered.  If a job is submitted by other means, i.e.-
      copied directly to the spool directory,  there is no guarantee that
      collisions can be avoided.  Note that sometimes hold files will
      be left in the spool queue, but these can be clean up periodically
      by using checkpc for example.
  Bug Fixes and/or Deficiencies:
    Added Hold_all variable that is controlled by LPC command -
      :ah: printcap entry cannot be overridden now.
      (Reported by: garyc@eng.dowjones.com (Gary Cender))
    LPD/lpd_control.c: STOP was killing off server;  now it prevents
      next job from being started.
    common/printjob.c/Fix_string() - missing check for 0 length string.
      (Zygo Blaxell <zblaxell@myrus.com>)
    Printing filter exit codes 1->5 are translated to JFAIL->JABORT
      This makes vintage filters compatible with LPRng.
    Find_key() can return a 0 value under extreme circumstances - 0 check
      added. (Reported by: Ron Roskens <roskens@cs.umn.edu>)
    lpr -l or lpr -b did not get IF filter invoked with -c option.
      (Reported by:Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>)
    trailers are not sent to printers; caused by premature close of output.
      (Reported and Fix by: Helmut Jarausch <jarausch@igpm.rwth-aachen.de>)
    permissions checking once again has a problem - if no match is found
      incorrect use of defaults.
      (Reported by: QingLong <qinglong@Bolizm.ihep.su>)
    LPQ: queue status not reported correctly.  Caused by a memory leak,
      and also incorrect buffer length specified to allocation routine.
      (Reported by: Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>)

Release LPRng 2-3-13
    Linux has inconsistent ncurses (curses.h) and termlib (termlib.h)
     definitions for tgetent().  Use only one.
      (Reported by Elliot Lee <sopwith@cuc.edu>)
    The 'printed 10% of 1000 bytes" message gets scambled when
      processed by other systems where the % is interpreted as a
      format character by printf.  Changed to 'percent' instead.
      (From: Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>)

Release LPRng 2-3-12
    waitchild.c does not enable the SIGCHLD signal.  This was causing
      problems when a child would die during a read/write operation and
      interrupt the read/write operation.
    checkpc - now checks to see if the LPD lockfile directory exists,
      and creates it if necessary.
    getopt.c - strdup() changed.
      (Reported by  Brad Greer <brad@cac.washington.edu>)
    src/Makefile.in - LOCK_DEV_CFLAGS -> LOCK_DEVS_CFLAGS
      (Reported by Klaus Guntermann
        <guntermann@iti.informatik.th-darmstadt.de>)
    LPD, lpr -p and :pr: filtering.  Documentation claims that LPD will
      filter 'p' format jobs through :pr: filter and :if: filter.  It was
      not doing it,  and now does.  However, when using a bounce queue,
      it will not filter :pr: formats unless a :pf: filter is present.
      (Reported by Scott Sutherland <scott@math.sunysb.edu>)
    :translate_format: printcap variable, and functionality added for
      bounce queues.  A bounce queue can now also modify the job file format
      using the :translate_format: printcap entry. For example,
      :translate_format=mfpl: would change m to f and p to l format
      job files.

Release LPRng 2-3-11
    MAJOR ADDITIONAL FUNCTIONALITY:
    Logger: filter error output is now written to the logger as well as
      status information.
    
    lpr -p and LPD: the pr filter support was not updated.  It now invokes the
      traditional 'pr' program correctly.
      (Reported by: K.D. Meyer" <meyer@uni-trier.de)
    LPD/lpd_control.c - reporting duplicate status line information.
      (Carl Hilton <chilton@dns2.sac.usace.army.mil>)
    LPR: exits with a nonzero error when 0 length job or invalid queue.
      (Paul Haldane)
    lpbanner.1 and lpraccnt.1 man pages created.
      (Carl Hilton <chilton@dns2.sac.usace.army.mil>)
    lpq -Pall - sendstatus() returned wrong status.

Release LPRng 2-3-10
    MAJOR ADDITIONAL FUNCTIONALITY:
    routing to multiple destinations, multiple copies, via a bounce queue
        A bounce queue can now route jobs to multiple destinations
        and/or make multiple copies of a job.  This action is controlled
        by the printcap/configuration variable router=filter.
        See README.routing and the LPD.8 manual page for details.

    Identifiers:
        The 'A' control file line is now used to store a 'unique' job
            identifier.  This follows a job through the system, and is
            used to identify a job.  It can also be used in LPRM and
            LPC messages.
        The :use_identifier: printcap and configuration variable controls
        the addition of this information to the control file.
    Job ID Wildcards:
        LPRM, LPC now take wildcard entries as well use job numbers and
        user IDs for jobs. (Updated LPRM, LPC man pages).
    Logger:
        Added code to record the actions of jobs passing through the
        system.  SetStatus messages now sent to a logger process as
        well as recorded in a status file. Added:
        printcap/configuration:
            logger_destination = host[%port][,(TCP|UDP)]
                host%port is destination host%port combination.
        configuration:
            default_logger_port = 560  - default port for logging
            default_logger_protocol = UPD  - default protocol for logging

    lpd_rcvjob.c - error message has a missing '%s' entry.
        (Brad Greer <brad@cac.washington.edu>)
    Link_read() in link_support.c - minor error - zero length read
      reported as error, not EOF condition.
    lpd: multiple copies (lpr -K option) were causing malformed job control
      files to be generated by LPD when it checked them.  Off by one problem
      with pointers fixed.
      (Reported by: Andrew Leahy <A.Leahy@st.nepean.uws.edu.au>,
        details of problem by Dirk Wrocklage <dirkw@uni-paderborn.de>)
    cleanup() - exited with erroneous error code when NOT sent a signal.
      (Reported by Ed Santiago <esm@lanl.gov>
        and Sven Rudolph <sr1@os.inf.tu-dresden.de>)
    HOST and REMOTEHOST permissions now can be netgroups, i.e. -
      HOST=@netgroup or REMOTEHOST=@netgroup will check to see
      if a host in in the netgroup.
    permissions.c - Mods by Geoff Ballinger <geoff@chemeng.ed.ac.uk>
      These modifications fixed a problem with checking for user
      permissions,  and now the permissions 'user' or 'remoteuser'
      is checked according to documentation.
    REMOTEUSER, REMOTEGROUP added to permissions checking.  Permissions
      checking now done in much more rigorous way.
    LPD/lpd_rcvjob.c - fixed up hold file removal on bad job submission.
    Setup_waitchild() - moved to Initialize(), done for all programs


Release LPRng 2-3-9
    killchild.c - minor bug on cleanup.  If cleanup called with 0
      argument, never killed off children.  Under very rare circumstances,
      this resulted in a OF filter process hanging up,  and never exiting.
    LPR: the -s option is now silently ignored.
      (Jon E. Ferguson" <jon@media.mit.edu>)
    ULTRIX has a sys/syslog.h and a syslog.h file, need to use sys/syslog.h
      (Per Foreby <perf@efd.lth.se>)
    Accounting Filters: the :as: (accounting start) filter returning JREMOVE
      did not cause the job to be removed. Fixed.
      (Reported by Panos Dimakopoulos <dimakop@cti.gr>)

Release LPRng 2-3-8
    lpr_makejob.c - not handling -w and -0 (font options) correctly.
      (Reported by Jens Thiel <thielj@athene.informatik.uni-bonn.de>)
    Comments in sendjob.c updated to reflect reality.
      (George Lindholm <lindholm@ucs.ubc.ca>)

Release LPRng 2-3-7
    lpd.conf default file - updated example configuration values
    Documentation miswordings, downright errors, and missing information
      corrections and comments added.
      (Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>)
    struct fd_set declarations changed to fd_set to make it compatible
      with POSIX.
      (Reported by Alan Shutko <ats@shep1.wustl.edu>)
    use_shorthost flag not working - fixed.
      (Bertrand Decouty-INRIA Rennes-France <Bertrand.Decouty@irisa.fr>)
    setup_filter.c - %h in an option string is now expanded to the short
      form of the host name.
    ROOT perms for filters - added the ROOT_PERMS_TO_FILTER_SECURITY_LOOPHOLE
      definition to the src/Makefile, modified common/setup_filter.c.
      Added comments to man/lpd.8. Comments by Patrick Powell, mods by
      (Jens Thiel <thielj@uran.informatik.uni-bonn.de>)

Release LPRng 2-3-6
    LPR/lpd_rcvjob.c - snprint() replaced by plp_snprintf()
    src/common/defaults.c - erroneous LD_LIBRARY_PATH= and PATH= values in
      configuration variables. 
      (Reported by Jens Thiel <thielj@athene.informatik.uni-bonn.de>)

 LPRng 2-3-5
    printcap.c - when lpd-perms array gets longer than 40kB or so,
      lpd crashes with an segmentation fault when it's getting started.
      fixed by: Dirk Wrocklage <dirkw@uni-paderborn.de>
    permissions.c, globmatch.c - updated error reporting, and added
      check for user's default group when checking GROUP permissions. 
      (Stefan Monnier" <stefan.monnier@lia.di.epfl.ch> and
      Ron Roskens <roskens@cs.umn.edu>) Also, changed strcmp to strcasecmp
      to make comparisons case insensitive.
    LPD/lpd_control.c - modified error message to better indicate failure.

    long job numbers - lpd_rcvjobs.c, cleantext.c, lpr_makejob.c, printcap.c
      added the capability to have long (6 digit) job numbers.  This is done
      by reformatting the job control file and the job file names.
      printcap :longnumber: and configuration longnumber=yes enables this.
      Note that :bk: (Backwards compatibility) overrides long numbers.
      If a queue is marked :bk: then it will attempt to shorten long numbers
      to produce a short number file.  This can be used with a bounce queue
      to produce files compatible with the older vintage systems.
      As a side effect, tightened up format checking of unlink entries,
      and other issues reported by the following folks.
      (Lennart.Sorth@ecmwf.int, Desmond Macauley <desmondm@eng.dowjones.com>)

    lprm - fixed the removal algorithm so that multiple tags select multiple
      jobs.  i.e. - lprm 1 2 3 removes jobs with numbers 1, 2, and 3.
      If you do lprm user, all jobs with the tag 'user' are deleted.
      This allows much easier job purging,  which is usually why you
      are using lprm...

    use_info_cache flag - printcap.c(Free_pc()) routine brutally wipes
      out all data now.  This will either force the reread or crash the
      process.
      (reported by Dirk Wrocklage <dirkw@uni-paderborn.de>)

    configuration variables: added default_format, default_priority
      to configuration as well as printcap variables. lpd.conf.5 and
      printcap.5 man pages have been updated.  Apparently they were never
      documented in man pages.
      (reported by Stefan Monnier <stefan.monnier@lia.di.epfl.ch>)

    common/sendjob.c:  error reporting for DATAFILE was incorrect.
      (reported Brad Greer <brad@cac.washington.edu>)

    :send_data_first: printcap and configuration variable added.
      causes data files to be sent to the destination first, before
      control files.  (Supports horrible spoolers that violates RFC1179)
      (suggested Brad Greer <brad@cac.washington.edu>)

    :connect_grace#nn: printcap and configuration variable added.
      Klaus Steingerger reports that some printers require a grace
      period between connection attempts.  This variable provides
      a suitable delay.  Also, the Clear_timeout() routine now
      restores the ORIGINAL signal handler.  This means you can
      only have one timeout pending at a time - which makes sense
      in this implementation.
      (reported and mods by Klaus Steinberger
       <Klaus.Steinberger@Physik.Uni-Muenchen.DE>)

    globmatch.c - a bug with checking for upper and lower case chars.
      (reported by Per Foreby <perf@efd.lth.se>)

Release LPRng 2-3-4
    typos in the documentation - fixed

Release LPRng 2-3-3
    getcfng.c - "use_info_cache" entry out of order.
     (Alan F Lundin <aflundi@sandia.gov>)

Release LPRng 2-3-3
    LPR and :qq: printcap entry,  use_queuename configuration information
    Added 'use_queuename = no' to the common/default.c file - the
    use_queuename will force control files to have the 'Qqueuename' entry
    placed into them.  The :bk: (backwards compatible) entry can be used
    to override this when sending to non-LPRng systems.  When receiving
    a job and use_queuename is TRUE,  then LPD will add the name of the
    spool queue to the control file.

Release LPRng 2-3-2
    common/defaults.c - removed :xt: from the printcap defaults.
    common/getcnfinfo.c - added "true", "all", "false" keywords for flags.
    common/termclear.c - for LINUX, added include <termios.h>
      (Avery Earle <ae@play.psych.mun.ca>)

Release LPRng 2-3-1
    printcap.5 :xt: entry updated
    bk, qq, and bounce queue filter interaction: printjob.c modified to
        add Queuename information for filters if :qq: option or Q entry
        in job file.

Release LPRng 2-3-0
    Minor rewording on printcap.5 man page.
    common/termclear.c - defined(solaris) changed to defined(SOLARIS)
        (Andrew Richards <physajr@phys.canterbury.ac.nz>)
    common/printcap.c, CHECKPC/checkpc.c - subtle bug when reading
        printcap information from a filter AND the 'oh=host' specified
        AND the host is not the current host.  Fixed.  In addition,
        checkpc will not create queue entries for queues not used/defined
        on the current host.
        (Dirk Wrocklage <dirkw@uni-paderborn.de>)

Release LPRng 2-2-9
    printcap.c - malformatted printcap entries ending with a \
    at the end of the file are now accepted.

Release LPRng 2-2-8
    LPR now uses a reasonable size buffer when copying files.

Release LPRng 2-2-7
    lpq:  back to the previous format!
      lpq -s - does the very short format
      lpq    - prints short form of detailed information
      lpq -llll... - each l doubles status information
    lpq.1 - man page updated.
    printcap, lpd.conf: send_failure_action - added a 'hold'
      keyword that will hold the job on error rather than deleting it.
      updated printcap.5, lpd.conf.5 man pages
    lpd_jobs.c - added checks for filter non-zero status exit.
    configure.in - printf("%s",sys_siglist[0]) added
      (<harlan.stenn@pfcs.com>)

Release LPRng 2-2-7
    lpq:  by default, a very very short format-  pr@host:(status stuff) NN jobs
        lpq -l  -  short, verbose format
        lpq -l -l or lpq -ll - longer format
    lprm: was not removing all jobs when 'lprm all' specified.
    lpr.1 man page: priority of jobs is A (highest) to Z (lowest)

Release LPRng 2-2-6
    lpr: -K option did not have ':' in getopt options string.
      (Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>)
    lpr: -# has been readded, in spite of my better judgement, to be
        compatible with antique LPR systems.
    lpd: 'sending job to...' message error
      (Dwaine C. Gonyier <virtual@panthra.catt.ncsu.edu>)
    printcap.c, getcnfginfo.c - ordering of parameters not alphabetical.
      (Ron Roskens <roskens@cs.umn.edu>)
    lpr, configuration - check_for_nonprintable code got mushed,  fixed
      now; the :xt: (check text) printcap flag added as well. man page fixed.
      (Ole Benner <olb@kom.auc.dk>)
    configure.in- library check fixed, added additional library check
      (Harlan.Stenn@pfcs.com)
    lpc - the 'lpc lpd xx' operation set the current printer to xx. Fixed.
      (Jos Backus <jos@oce.nl>)

Release LPRng 2-2-5
    ** changed the bqfilter flag to bq=destination_queue
        This now forces all input to be passed through the filter.
        Changes in the bq filter information as well.
    Bounce_filter: removes temporary bounce queue file on exit unless
        debugging is high level.  bounce queue file name is bfAnnnHost,
        i.e.- has same format as a job file.  This makes job related
        processing easier to debug.
    lpc - Updated queue status display
      lpc status now shows autohold status
      lpc noautohold now restarts printer on 'NOAUTOHOLD' command
    lprm with no options removes first removable job in queue
      This is compatible with BSD lprm functionality
    configure - GCC version checks moved to start of configuration
        added checks for sys/utsname.h, utsname.h
    common/gethostinfo.c - uses sys/utsname.h
        configure.in has check added for utsname.h
    lpd - printjob now checks for exit status of filters - should
        terminate now if filter has bad exit status.
        (Note: this may not be bombproof in all situations.)
    printcap and configuration - connect_retry was defined as connect_try
        documentation fixed as well.
    CHECKPC- checkpc -r -A nD now removes all job related files older than
          n Days.  This can be put into crontab and run periodically.
    printcap :ah: (autohold) now operational.  Note that LPC will
        override printcap default.  lpc status now indicates if autohold
        is on.

Release LPRng 2-2-4
    :bk: (backwards compatible) flag now causes removal of non-BSD compatible
        control file entries as well as modifying the order.
    :qq: (Queuename in control file) flag is now  overridden by :bk: flag.
        This will now generate Berkeley compatible job files.
    lpr - improved 'connnection failed' message format.
    accounting_server and accounting_check added for accounting.
        printcap.5, README.accounting,  and other documentation updated.

Release LPRng 2-2-3
    Once more the portability/bugfix Gods need yet another sacrifice.
        BSDI V2.1 setreuid() returns erroneous error codes - setuid.c
        fixed yet again...  I suspect other BSD derivatives to have same
        problem.  Sigh...
    cleanup() now unblocks signals before exiting.
    Print_open() - better status messages on open failure.

Release LPRng 2-2-2
    TESTSUPPORT: removed lpf generation
    Perms_check(): missing ntohl(HostIP), needed for host order of addresses.
    Lock_fd(): - saves errno error codes and returns them correctly
    Prefix_line in malloclist(): - copy now done in correct order
        fixes print queue bug.
    Accounting Filters:
        1. the filter command is not passed as an argument to the accounting
           filter.  This solves some problems with shell script filters,
           as the last filter command would have the form:
             filter -H... -a|filter |filter
        2. Accounting information now logged at start and end of job.
    GROUP Permissions: permissions.c now checks to see if a specified
        group exists first, using getgrnam(), then tries wildcard
        search next.
    Permissions: IP=host/netmask format updated- allow /n to be n bit mask
        i.e. - 130.191.163.12/16 -> 130.191.163.12/255.255.0.0

Release LPRng 2-2-1
    LPF filter: added source code to the LPRng main distribution.
        This provides a passthrough filter for most applications.
    README.printcap: updated to reflect use of lpf filter and
        banner printing
    LPRM/LPD: lpd restarts printing if the active job is removed.
    LPQ: more robust handling of bad printcap entries
    LPD: attempt to solve problems of filters which print to
        serial devices hanging because the device has pending
        output, has been sent a ^Q to stop output,  and has not
        received a ^S to restart.  Uses tcflush() to flush serial devices.
    LPR: added a 'use_shorthost' configuration and printcap variable
        to force the use of short host names for print job control and data
        files.  The code was present in LPR,  but not enabled.
        Update lpd.conf.5 and printcap.5 man pages.
    Debugging Flags: added keyword and flag capability.  For example:
        -Dthis,that@  can be used to set the 'this' flag and clear the
        that flag.  see common/parsedebug.c for details.
    NGPRINTER environment variable added. Used to override PRINTER environment
        variable.  Allows one format for PLP/LPR/Solaris, one for LPRng.
        (marty leisner@sdsp.mc.xerox.com)
    LPC: command of form 'status printer@host' was not formatted correctly.
        (Jarrod Douglas <jarrod@cs.curtin.edu.au>)
    man/printcat.5 - added a functional listing as well as alphabetical.
        (Sherwood Botsford <sherwood@space.ualberta.ca>)
    LPD, LPQ: added termination error messages to status output.
        Details for job failure now available.
    printcap :qq: and lpr -Q option now fully operational.
         lpr -Q or :qq: printcap field sets Qqueuename in job file;
         lpd bounce queue will add Qqueuename line to the control file.

Release LPRng 2-2-0
    Updated README files.
        README.1st     - overview
        README.install - much more complete
        README.lpd.conf - explains lpd.conf
        README.lpd.perms - lpd permissions structure listed
    man/lpr.1 - missing -k information added.
    man/lprm.1 - fixed typos
    man/lpd.perms.5 - lpd.conf documented
    DOC/Tutorial - added additional information
    DOC/Install - extended to include more testing and installation
        details.
    strdup() changed to plp_strdup() to avoid problems with C library.
    configure.in - check for sys_siglist[] improved.
    src/commmon/decodestatus.c - fixed problem with Solaris 2.5
        and sys_siglist[]
    Makefile - added default target to install default lpd.conf and
        lpd.perms files;  prototype files added as well.
    man/lpd.conf.5 man page added
    src/common/permission.c: added a SERVER key, to allow restriction
        to users on the server.
    checkpc - truncation now done on log, accounting, and status files.
    LP_SIMULATION - SVR4 simulation with lp.sh and lpstat.pl scripts

Release LPRng 2-1-3
    waitchild.c - race condition with malloc() in the SIGCHLD handler
      would result in rare, very very rare problems.  Data structures
      are now pre-allocated.
    LPD/lpd_jobs.c - WIFSTOPPED and WIFSIGNAL checks done improperly.
      Shows up in OSF1 based systems.  The test is now done correctly.
    AIX portability - added sys/select.h to include list
    LPQ status display modified to be consistent-
      Filter status:  -> Filter_status:
      Now all the comment and information lines have a : at the end
      of the first field.  This makes parsing by perl/awk, etc. simple
      Note that the Rank Owner ... line still does not have a colon
    joost@cadlab.de - minor fixes for Apollo DN4500 and portability
      TESTSUPPORT/Makefile.in, as well as minor fixes in portable.h


Release LPRng 2-1-2
    STATVFS typeo corrected in in configure.in, portable.h, freespace.c 
      (curt@ltpmail.gsfc.nasa.gov (Curt Tilmes))
    Missing VARARGS declaration for setstatus() in lp.h
      (Marc Baudoin <Marc.Baudoin@hsc.fr.net>)
    Makefile.in (in general) - fixed realclean mostlyclean targets
      (Paul Eggert <eggert@twinsun.com>)
    setproctitle() - check made in configure, and if not present
      the proctitle.c code is used. (Marc Baudoin <Marc.Baudoin@hsc.fr.net>)
    Makefiles - realclean and distclean targets did not remove Makefile
        (Paul Eggert <eggert@twinsun.com>)
    Missing read permissions on various files
        (Paul Eggert <eggert@twinsun.com>)
    configure.in (CFLAGS): Use a more accurate test to decide
      whether we are using GCC version 2.4.5 or earlier.  The old
      test didn't handle GCC snapshots correctly.
      (Paul Eggert <eggert@twinsun.com>)


Release LPRng 2-1-1
    CHECKPC- added test for the printcap 'ps' - printer status file
      - fixed up test for printer device, now ignores remote and filters
      - added 'checkpc -s' option to not create/check printer status file
    common/sendjob.c - Bounce Queue Filters are only invoked by the server;
        added a check for Interactive and printcap :bqfilter: flag BOTH
        set before invoking filter.  This prevents clients from invoking
        filters.

Release LPRng 2-1-0
    Added 'rs' (time between spool queue rescans) printcap entry
    Added 'oh' (option for host) printcap entry
    Added check for NULL printcap pointers.  Printcap files entirely
        consisting of comments and empty lines are now handled
        correctly.
    Added ntohl() and htonl() calls to fix IP addresses for permissions
        checking.  This showed up on X86 systems.

Release LPRng 2-0-9
    Patch to make sigsetjmp() work correctly on Solaris.  Sigh...

Release LPRng 2-0-8
    Solaris 2.5 requires sigsetjmp() and siglongjmp() for alarms and
        timeouts to work reliably.  Note that GCC now does not put out
        warnings about 'variables may not be restored after longjmp'
        C'est la vie, c`est le guerre...
    Documented getting permission database with a filters, allowing
        dynamic checking of a database.


Release LPRng 2-0-7
    Fixed up the setuid() code yet again - portablility issues on
        BSDI and FreeBSD - need to do a setuid() operation first.

Release LPRng 2-0-6
    Removed default non-blocking open() operations;
        added printcap 'nb' (Nonblocking_open) variable to allow
        nonblocking open for specific devices
    Updated man pages and DOC files to reflect new open() capabilities

Release LPRng 2-0-5
    getuserinfo() was not using the original RUID value.
    Fixed device locking again,  this time to do a fallback to
        fcntl() based locking if TIOCEXCL is not functioning
    Removed MFLAGS from Makefiles, also put in cleaner test for GNU Make
    The sleep() implementation on linux is defective; replaced
        by a plp_sleep() using select().

Release LPRng 2-0-4
    src/cleantext.c - Check_format() was too strict in checking
        hostnames - now allow '-' as well as . and _ in name.
    configure.in - SGI IRIX configuration needs SVR4 definition forced.
    added more specifics for solaris

Release LPRng 2-0-3
    - mostly portability fixes
    man/Makefile.in - removed $(FILES) targets
        did updates in a 'sane' manner
    Fixed missing declarations of functions for fussy compilers.
    Fixed CHECKPC/checkpc_port.c - SunOS4.1.4 has two versions of
        stty - /bin/stty and /usr/5bin/stty
        forced use of /bin/stty
    configure.in - added gcc version check,  fixed up CFLAGS
    HPUX portability kludges -
        1. O_NDELAY and O_NONBLOCK interact - removed one of them
        2. Need to use fcntl() after open to fix the non-blocking
            read operation.
    device locking now works on Solaris 5.4
    checkpc- added a couple of sanity check functions for internal
        tables - Check_pc_list() and Check_config_list()
        discovered a couple of entries in wrong order (bp was one)
        that prevented use of banner printing.

Release LPRng 2-0-2
    Modified configure to use config.guess; fixed config.guess as well.
        - config.guess did not recognized BSDI systems,  and exited
            with an error.
    Fixed configure.in to force library order if necessary.
    Ripped out several SVR4 dependencies; src/killchild.c
    Filters + Bounce Queues - added filtering capability
     printcap variables - bqfilter (flag)
     If a bounce queue (one that sends files to a remote printer/host)
     has filters speicified, and the :pqfilter: printcap flag is set,
     the data files will be passed through a filter,  if there is a
     filter for that format.  Updated printcap.5, lpd.8 documentation,
     as well as DOC/Intro.

Release LPRng 2-0-1
    configure.in -
        WARNING ** gcc version 2.4.5 and below
        The -O option produces erroneous code several places.
        configure.in has been modified to remove the -O option.
    configure.in - added explicit check for elf.h - now defines
        SVR4 if the file is present (see autoconf documentation
        for test).  Compatibilty check.  Updated CFLAGS with define
        for HPUX and uses the @CFLAGS@ edit in Makefiles.  This
        solves a problem when configure sets CFLAGS and the
        default GNU Make .o.c rule set needs to be used.
    LPRM: If a user has LPC CONTROL permissions, he can now remove
        jobs from a queue.
    Makefile.in, Makefile - Added various GNU compatible targets
        such as clean, dist, reallyclean, etc.
    Fixed the man/Makefile to better update the man pages when
        installing them.
    checkpc -T line : fixed up the STTY reporting to be more robust
        should work with SVR4 better.
    LPR: added locale initialization; printable checks now use
        8 bit characters if the locale has been enabled.
    O_NONBLOCK|O_NBLOCK - these both must be set on a SVR4 system to
        do a non-blocking open.  This might be considered a documentation
        feature in some circles.
    FreeBSD defines: various files have had #ifdefs for FreeBSD added.
    Accounting: modified the default accounting string to add the
        control file name;  allowed the accounting filter to exit
        with error status and write an error message.

Release LPRng 2-0-0
    Baseline Release Version

Release LPRng 1-2-6
    PERMISSIONS: permissions checking was defective- correct values now
     used.
    LPC: usage message updated
    Error reporting: connection permission errors reported to connecting
     system now.
    LPR: now reports server error msgs to user on STDERR.

Release LPRng 1-2-5
    PERMISSIONS: lpc operations split, 'C' are control, 'S' are status
     this allows 'lpc status' command to be used by non-privileged users
     Updated documentation to reflect this change as well.
    Updated lpq, lpc, lprm -V option to be less verbose
     by default;  -V -V will show copyright information.
     ("Marty Leisner" <leisner@sdsp.mc.xerox.com>)
    Control file format: allowed first 'N' line to appear before
     data file information, and stuck in middle of control file.
     This makes it compatible with other LPR implementations.  Sigh.
    If a filter is not available,  this is logged in status and the
     job is discarded.  This prevents a job with bad format information
     locking up the printer queue.
    Filter program lookup in printcap entry has been fixed to be a little
     more effective.
    Fixed checkpc and setproctitle() to work with FreeBSD
     (Richard Letts  R.J.Letts@salford.ac.uk University of Salford)

Release LPRng 1-2-4
    Harlan Stenn <Harlan.Stenn@pfcs.com>
    termclear.c - there is an interesting problem with termcap.h, curses.h,
      terminfo.h.  On some systems you do not want to include curses.h,
      but not terminfo.h and termcap.h.  I recommend putting guards in the
      terminfo.h include file so you can include it multiple times without
      redefinition problems.
    curt@ltpmail.gsfc.nasa.gov (Curt Tilmes)
      - removed O_NDELAY from various open statements
    Makefile.in - removed ${SRC}/src, etc. to allow compilation
      in separate directories.

Release LPRng 1-2-3
    Fixed lprm -a flag;  documentation error as well
    common/jobcontrol.c - erroneous error field update
    miscellaneous errors reported by users.
    SVR4 - added sys/systeminfo.h, sysinfo() call replace gethostinfo()
    printcap - added 'qq' (save queue name in job file)

Release LPRng 1-2-2
    This sounds ridiculous,  but there is yet ANOTHER problem with
    implementing portable file locking.  It turns out that some systems
    allow file locking only if the files are opened R/W, no APPEND.
    This is only a problem in pr_support.c;  the permutations and
    combinations of files, devices, etc., are too much to deal with
    algorithmically.  An new printcap flag 'lk' (lock LP device) is
    introduced to handle this.  By default, no file or device locking
    is done.

Release LPRng 1-2-1
    Martin Forssen: maf@dtek.chalmers.se or maf@math.chalmers.se
     - fixed an erroneous test in checkremote.c - missing data
     initialization in LPD/lpd_jobs.c, LPD/lpd_status.c
     - common/getqueue.c off by one error - LPD/lpd_remove.c - cfpp
     uninitialized in Get_queue_remove()
    hagberg@mail.med.cornell.edu (Eric Hagberg) A/UX portability
     fixes in portable.h Fixed lpr, lprm MAN pages;  fixed usage
    messages.  Added CONTROL permission checking for LPRM operation;
    i.e. - if you have CONTROL permission you also can remove files.

Release LPRng 1-2-0
    Documentation - DOC/Intro and DOC/Install 
    Filters: CTI-ifhp-1.1.1 lp-pipe-1.0.0  lp-support-1.0.0 psfilter-1.0.2
    Fixed a minor bug in LPD/lpd.c - geteuid() missing

   
Release LPRng 1-1-2

    Documentation (Introduction, and Installation) added
    psfilter-1.0.1 added to FILTERS
    Added test for signal.h to configure.in.
    reported by Martin Forssen <maf@math.chalmers.se>
      fixed missing bounds check in common/printcap.c,  put install-sh in
      directories needed (autoconf does not fix up $(INSTALL) correctly)
      lookup loop for remote hosts in common/checkremote.c
      Link_listened(void) missing in include/lp.h
    
Release LPRng 1-1-1

    Added lp,lpsched, lp-pipes support
    Fixed a bug in the job renumbering code in lpd_rcvjob.c; always started
    with 0, instead of next job in sequence.
    Fixed a bug in lpd_rcvjob.c, additional 0 ACKS being sent.
    Fixed a bug with the filter options;  added $0, $-, $'
    Fixed the default filter parameter list - accounting file at end

Release LPRng 1-1-0

    Cleaned up all sorts of minor problems with duplicate variables
        being declared in two places.
    Hopefully cleaned up the problems with Errormsg() not getting
     sys_nerr; sigh.
    Fixed accounting. Again. Sigh.
    Added (fixed) support for host%port
    Added install/test documentation.

    Added even more portability tests to checkpc. - device locking,
        stty, file locking.

Release LPRng 1Alpha9

    Accounting has been added.

    Fixed up a very very very rare problem with file locking by
    redoing some tests.

    Added the checkpc -T serial_line option 
    This performs a whole series of portability tests, all of which
    need to pass.

    Include file problems strick again: fixed up the right set.

Release LPRng 1Alpha8

    Sun Aug  6 11:07:51 PDT 1995 Patrick Powell

    Renamed files with pathnames greater than 14 chars to shorter ones;
    Antique file systems strike again.

    Added 'form' and 'hold queue' capability; modified the control and
    job files; Renamed the release name to be consistent with GNU standards.
    Fixed problem with compatibility between SUN and other systems.
    Added LPR -Q flag, LPR -k flag to make it work.

    Sun Jul 30 09:09:49 PDT 1995 Patrick Powell

    Discovered some problems with the job printing code in LPD/lpd_jobs.c,
    re-editted it and put in some stronger checks.

    Modified the spool control file format slightly.
    This did not work as well as I thought it would in the overall design;
    now the spool control file can have any number of different types
    of entries for future expansion, i.e.
    printing_disabled   1
    redirect            printer@host

    Several rather silly coding errors in various places that turned up
    when a code checkout program was run: if/then not being executed,
    etc. etc.

    Fixed up the configure.in file to use the old dnl, socket, etc. libraries.

    man/Makefile and src/Makefile modified to use INCLUDE=.. so that configure
    can be run from another directory.  This is very very strange autoconf 
    dependency,  but who cares, as long as it works.

    Fixed up a whole minor mess of writes and timeout interactions.  Who would
    have guessed at this interaction?  Created a couple of utility functions
    (Write_fd_str(), Write_fd_len()),  and timeout (Set_timeout(), Clear_timeout())
    routines.  These assume that writes will be done with timeouts;  all places
    where writes are done have been surrounded by Set_timeout, Clear_timeout.

Release LPRng 1Alpha7
Mon Jul 24 09:29:15 PDT 1995 Patrick Powell

    Changed the Makefile 'TARGET' name to avoid conflicts with other
    Makefiles... sigh...

    In link_support.c/Link_send(),  the original code was using
    several writes to send a line;  this has been modified to use
    a single write where possible.  Apparently some implementations
    of LPD code expect the command lines to be sent as a single
    TCP write operation, and do not look for the \n terminator.

    Removed the 'lorder/tsort' from Makefile, and hardcoded the
    library file order.  This provides a simple form of portability,
    but will require updates to the Makefile if a new library file
    is added.

    Added better tests for sys_errlist and sys_siglist definitions.

    Moved all of the configuration information to the root level;
    this fixes a bug with the autoconf code that cannot handle
    more than one level of directory structure.  You can now
    compile the LPRng software in another directory by using:
    cd LPRng.<version>; SRC=`pwd`; \
    cp configure $DEST; cd $DEST; configure --srcdir=$SRC; \
    make all

    Modified the top level Makefile to use the GNU Make -C directory
    capability.

    Fixed Send_job() to make it more robust in the face of protocol
    errors.  The numbers of times a job is retried is set by the
    Connection_retry value. 

    Modified the LPC status reporting to make it clearer.
    Removed a redundant error message.

Release LPRng 1Alpha6
Thu Jul 20 19:23:03 PDT 1995 Patrick Powell

    Reorganized the auto configuration code so that it is at the top
    level of the distribution.  Added top level MAKEFILE with directory
    recursion.

    Separated out default printcap and configuration initialization,
    put them in src/default.c

    Fixed up some minor 'lint' level errors.

    Update man pages.  Fix up installation so that VERSION information
      is put in the MAN page source.
    Editted MAN pages heavily in light of comments from people.

    Clean up some code in printcap.h, printcap.c, lp_config.h, getconfig.c

    Fixed a missing check for null string with STRCMP in src/getqueue.c.
    Considered using safestrcmp() for this reason; checked most places;
    safe or appear to be safe.

    Modified the format for LPQ status information,  added more detail
    about the printer status.

    Added -Pprinter option to LPD to simply start and run a spool queue
    server.  This allows debugging of filters much easier.

    Added bk-of-filter-options and bk-filter-options to provide compatibility
    with old style filters.

    Fixed up a lot of minor portability issues with Solaris2.4, using the
    SUN Soft C compiler.  Fixed fumble in gethostinfo.c - will die if
    it cannot find the local host name; this is very bad and should be
    immediately fatal instead of dying later.

    Fixup the the TESTSUPPORT/Makefile to be a little more intelligent.
    Also, put in guards to make sure that you have GNU Make.  This appears
    to be essential for sanity reasons alone.

Release LPRng 1Alpha5
Mon Jul 17 10:57:49 PDT 1995 Patrick Powell

    ********* BSDI *************
    Literally hundreds of questionable items were reviewed, fixed
    or modified.  The 'snprintf' function was renamed to 'plp_snprintf'
    in order to avoid conflict with the BSDI/GCC snprintf functions.
    Fixed up some questionable uses of snprintf, changed to sprintf.
    Discovered an incredibly vulgar behaviour in strncat(),  and
    fixed up its uses.  Strncpy will clobber all information in string;
    double checked its uses where possible.

Fri Jul 14 08:22:03 PDT 1995 Patrick Powell
    Fixed up configuration file reading. Was always using default
    values.

Fri Jul 14 08:23:06 PDT 1995 Patrick Powell
    LPD status reporting did not read the printcap 'st' status file.
    Now reads the file and reports information using short form or
    long form as needed.
