================================================================================
* 1.9.31, 2002-12-29

### BUGFIXES
- On non-BSD systems, only the first timeout was ever detected. Found and
  fixed by Richard van der Hoff.
- General signal handling fixes.
- Fix build when no system PCRE lib is available. Fix detection of
  -lpcre outside the system library path.
- When fetchnews is restarted after a crash that prevented updating the active
  file, only print one "..as 12345 in de.test" line per group when storing the
  article.
- Only fork() in fetchnews if fork() really works. Some systems (AmigaOS) only
  support vfork(), which is not sufficient.

================================================================================
* 1.9.30, 2002-12-04

### BUGFIXES
- Fix subtle and rare unterminated loop (100% CPU hang) bug in doarticle(). It
  can only strike when an ARTICLE, HEAD, STAT or BODY command in Message-ID
  syntax accesses a crossposted article AFTER a GROUP command and if the group
  name given there is part of another group's name that the article was
  crossposted to. Credits to Jan Knutar for a detailed bug report.
- Only consider groups (after LIST or NEWGROUPS) that match the
  only_groups_pcre, if one is configured. This avoids offering groups that are
  never fetched.
- Detect and report write errors when writing the new active ("groupinfo")
  file.
- Whitelist STAT command for NewsCache versions 0.99.18, 0.99.19, 0.99.2?.,
  1.1.*
- RPMs built from the included .spec file now install a "config" and "filters"
  file, both are marked "noreplace". This should prevent these files from
  being lost when a SuSE RPM is replaced by one built from this file.
- Leafnode will delete duplicate newsgroups from its active file. This process
  is case-blind. Some badly maintained upstream servers have the same
  newsgroup more than once, but only differing in capitalization. Leafnode
  will prefer the group with LESS upper-case characters.
- Fix maxage = 0 regression of leafnode 1.9.21. maxage = 0 seems not to be in
  wide use...

### WORKAROUNDS
- Blacklist STAT for servers that contain "NNTP news cache" in their
  greetings, reported to be necessary for NTL (UK) by Robert Marshall.

### CHANGES
- Leafnode now ships with a leafnode.cron.daily file. See INSTALL.
- Leafnode now ships with a filters.example file that was taken from the SuSE
  7.3 RPM.

### DOCUMENTATION
- The newsq manual page was reworked and is more comprehensive now.
- README-FQDN was corrected in respect to the dfncis.de host name.
- FAQ has information on the Red Hat inetd vs. xinetd issue.

================================================================================
* 1.9.29, 2002-10-23

### BUGFIXES

- Fix fetchnews SIGSEGV that happens when new groups are added. Thanks
  to Ken Shan for tracking the bug and sending a patch.
- Work with multiple upstreams that have the same server name, but
  different ports.

================================================================================
* 1.9.28, 2002-10-21

### BUGFIXES

- MacOS X 10.1 build has been fixed now (works on sourceforge Compile
  Farm at least). The fixes of 1.9.25 did not work.

### CHANGES

- There is now a leafnode-version program that just prints the version.
- Configuration file errors are now printed with the line number.
- New server-specific option: only_groups_pcre, to restrict the groups
  that are fetched from or posted to a specific server.
- The build environment has been rebuilt with automake 1.7.1 and
  autoconf 2.54.

================================================================================
* 1.9.27, 2002-09-24

### BUGFIXES

- Leafnode no longer goes into an infinite loop if your interface list
  as returned by ioctl(...SIOCGIFCONF...) is longer than 2047 bytes.
  This was a show-stopper bug without workaround (except unconfiguring
  interfaces or disabling IPv6, which is usually not an option).

  The bug was less likely to strike on home computers (except routers),
  as these tend to have less interfaces. More likely to strike bigger
  IPv6-enabled BSD servers.

- Type issues on 64-bit machines (time_t is int) have been fixed.

- RPM build: the spec file has been revamped, the documentation
  directory now has proper permissions again.

- Leafnode builds again on non-IPv6 machines such as Solaris 2.6.

### CHANGES

- Robustness: The allowstrangers option is now "stronger", enabling it
  defeats the "is the client on a local IP" check altogether -- to allow
  for workarounds should further bugs in this check strike us.

- Documentation: The FAQ has been converted to DocBook XML and updated,
  and the TROUBLESHOOTING document that carried only two items has been
  merged into the FAQ. It comes now as plain text, HTML and PDF. The
  CREDITS file has been updated.

================================================================================
* 1.9.26, 2002-09-20

### GENERAL

- Add missing documentation LIESMICH-daemontools

### BUGFIXES

- Fix paths in UNINSTALL-daemontools
- fetchnews will no longer try to fork in -P (postonly) mode. (The bogus
  error messages around this were reported by Jan Knutar.)
- fetchnews synchronizes child and parent when handing over the lock
  file, to prevent bogus error messages.
- texpire will now skip over lost+found in the top directory and log
  chdir/opendir errors. (Bug reported by William Grinolds.)
  /var/spool/news must still be one file system and cannot be a Coda
  file system.

### CHANGES

- newsq now prints a start banner and an explicit "the queue is empty"
  if it is

================================================================================
* 1.9.25, 2002-08-30

### DEDICATION

- Although only a symbolic measure and no consolation to any victim,
  this version is dedicated to all the people in the flooded areas of
  Central and Eastern Europe, particularly Austria, the Czech republic
  and Germany, where many cities have been drowned by the Moldau,
  Danube, Elbe and other rivers rivers that have turned into torrential
  currents by severe rainfall; whole cities in Saxony, Saxony-Anhalt and
  Brandenburg and the Northwestern Czech republic had to be abandoned
  temporarily.  The material damage is immeasurable, and the personal
  damage considerable.

  Protection of the environment is important and everybody's task.

### INCOMPATIBLE

- Leafnode's LIST EXTENSIONS reply no longer starts with leading
  whitespace. The current NNTP draft no longer wants whitespace there.
- Leafnode's [X]HDR <header> <message-id> commands now return
  the message-ID in front of the header, which is in conformance with
  RFC-2980 but contradicts draft-ietf-nntpext-base-15.txt which has
  expired on 2002-07-15 (which requires the article number to be
  printed, which is not available before GROUP or which is not in unison
  when the article is crossposted).

### GENERAL

- Fix "configured hostname not accepted" issue: Leafnode now reads the
  configuration file before validating the hostname or creating the lock
  file, so the hostname configuration option becomes actually effective.
- The lsort program is no longer installed. When updating from a
  previous version, then please remove it (the default location is
  /usr/local/sbin) -- it is only used (with explicit path) when you type
  "make update" and is not needed later.
- Documentation updates, including tcpserver/daemontools instructions.
- Build files have been regenerated with automake 1.6.2 (autoconf 2.53)
- A tighter integration of the included PCRE directory into the build
  process.
- German documentation is back.
- Fix some PCRE compile issues.
- The paths of the FILES sections of the manpages should now be correct.
- The FAQ file now ships.
- MacOS X 10.1/Darwin build fixes for -twolevel_namespace issue. We pass
  -flat_namespace to the linker.
- Easier first-time installation: A script to aid setting up leafnode
  when daemontools and tcpserver are present.

### nntpd

- Fix reading interface information on systems that have sa_len in
  struct sockaddr, such as FreeBSD. Leafnode would erroneously refuse
  connections from IPv4 clients on these machines when IPv6 interfaces
  were configured.
- New allow_8bit_headers configuration option (default off) to accept
  unencoded 8-bit data (seems to be common in dk.* and no.* hierarchies)
- Fix lots of minor bugs that splint turned up.
- Fix some minor XHDR issues.
- Fix LIST ACTIVE.TIMES (did not work at all and returned bogus data).
- Add HDR support (same as XHDR, basically).
- Redo the HELP output.
- List HDR in LIST EXTENSIONS reply.
- Fix crash when the client terminates the connection right after a POST
  command.  Not exploitable, reported and fixed by Fabrizio Tironi.

### fetchnews

- when updating the active file fails, set a flag to try downloading the
  whole active file again on the next run and keep the old active data
  to avoid losing group lo/hi marks.
- new server-specific option "noactive = 1" to defeat downloading the
  full active file (newsgroups list) from this server. Courtesy of Mark
  Brown of Debian.

================================================================================
* 1.9.24, 2002-07-10

### INCOMPATIBLE CHANGES:
- See all "incompatible changes" sections below.

### GENERAL

- there will be no more prereleases or release candidates. people don't
  test them.

### nntpd

- no longer crashes and disconnects when a client (slrn) sends "XOVER" before
  "GROUP". Makes leafnode compatible again with slrn.
- address resolver fixed when IPv6 enabled
- fix ARTICLE/STAT/HEAD/BODY commands with implicit number ("current
  article pointer"

================================================================================
* 1.9.23, 2002-07-08

### INCOMPATIBLE CHANGES:

- If you update to 1.9.23 and have articles in your out.going queue, fetchnews
  will no longer post these. To fix, do: chmod u+x /var/spool/news/out.going/*

- Access from outside the local networks (as figured from IP and netmasks of the
  local interfaces) is now denied by default. To restore the old behaviour,
  check README and config.example for a new option "allowstrangers" and how to
  enable it. Read config.example closely! Using this is deliberately difficult.

- When a client posts, syntax and semantics of the Message-ID header are
  checked. These tests are essential to avoid Message-ID collisions. You can
  still switch off Message-ID generation in your news reader and let leafnode
  generate a Message-ID.

- Spooldir may only contain characters from the POSIX portable path name
  character set. These are: the small and capital latin letters a through z, the
  ten digits 0 through 9 and the individual characters ".", "-", "_", "/".

### KNOWN BUGS

- Leafnode does not handle embedded NUL characters in news correctly.

### GENERAL

- The README now contains a new section "DEBUGGING".
- The INSTALL file now has an xinetd config example.
- The FQDN "linux.local" is now also rejected.
- Fetchnews will no longer try to post articles that nntpd is still receiving.
- Bugfixes, compile warnings fixed, memory leaks fixes, possible crashes fixed.
- Treating folded headers has improved.

- NEWGROUPS now really works, even across fetchnews -f. fetchnews -f is
  now less harmful to the group low/high marks.

- There is now documentation on the fully-qualified domain name issue, in text,
  pod and HTML format. See the README.FQDN* files.

- There is a new configuration option: "nopost" (server-specific). Set
  "nopost=1" just below the server line to avoid posting to the server in
  question.

- Article number treatment has improved. This should fix "pseudo article not
  displayed" issues for good.

- Most leafnode programs no longer see incomplete lines. Incomplete lines are
  lines without trailing LF character.

- When a leafnode program recreates a directory in the spool dir, the owner is
  now properly set to "news".

### fetchnews

- Fetchnews now filters on original header lines, rather than regenerated lines.

- Will exit with code 2 when it could not connect to at least one upstream
  server.

### nntpd

- The client timeout is now configurable, patch courtesy of Jonathan Larmour.
- No longer confuse clients with "400 Service discontinued" messages on timeout.

- No longer resolve the local listening address to a name and use that
  as fqdn (broke Message-ID generation). Reported by Andreas Muck.

- Posts with 8-bit or control data in headers or malformatted
  headers are now rejected. These articles are malformatted. (illegal!)
  Only broken newsreaders generate such headers.

- Better logging when groups are subscribed to; set debugmode = 1 in
  your config file to enable, and look for "markinterest:" in the log.

- POST now suggests a Message-ID.

### texpire

- Expire groups that are not in the group.info. (This will happen when news
  groups are removed upstream and the active file is re-fetched.)

- Set groupexpire for a particular group to -1 to let texpire ignore it.  Think
  of this as an archive function. Patch courtesy of Andreas Meininger.

================================================================================
* 1.9.22, 2002-04-19
general:
- Fix the hostname qualification logic.
- No longer use fnmatch(), but use wildmat() instead. That's well-tried
  in leafnode 2.0b.

fetchnews:
- Fix the broken NewsCache workaround.

========================================================================
* 1.9.21, 2002-04-08
INCOMPATIBLE CHANGES:
- leafnode never fetches articles that would be expired right away as
  per the current expire/groupexpire settings. Add "clamp_maxage = 0" to
  your configuration to restore the old behaviour.

general:
- no longer segfaults when the groupinfo file is empty (when the
  upstream servers are all unreachable).
- gets time zone offset against GMT right.
- overview handling now detects when articles are removed from the
  "middle" of a group (i. e. which are not low or high water mark)

applyfilter:
- no longer trashes the article high water mark.

fetchnews:
- leafnode never fetches articles that would be expired right away as
  per the current expire/groupexpire settings.
- can recover state information from a SERVERINFO~ file left behind by a
  previous incomplete fetchnews run.

========================================================================
* 1.9.20, 2002-03-25
INCOMPATIBLE CHANGES:
- leafnode REQUIRES a valid fully qualified domain name now,
  localhost.localdomain is invalid! Fix your /etc/hosts if leafnode
  programs refuse to run.
- running leafnode without access control (such as tcpd from Wietse
  Venema's tcp_wrappers package or xinetd/tcpserver's native access
  control) is officially deprecated.
- leafnode no longer tries to post the article to all your servers, but
  only to one, to prevent moderators from getting posts to moderated
  groups more than once. Move your most reliable news servers first in
  the configuration file.

General:
- new locking scheme, prevents groupinfo corruption, the old locking
  scheme was totally ineffective
- manual pages now contain proper paths to programs or files
- pattern matching has been fixed
- no more timezone messups in logs or generated Date: headers (backport
  from 2.0beta)
- memory and file descriptor leaks have been fixed
- some more parts of NNTP chatter are subject to timeout handling
- the included PCRE package was updated to v3.5 (but better, get PCRE
  3.9 or newer and install that prior to configuring and installing
  leafnode)
- maintainer builds now need ./configure --enable-maintainer-mode.
  Results in faster compilation for end users.

fetchnews:
- can now safely post to NewsCache servers, 1.9.19 and older would
  discard all upstream posts to NewsCache servers because NewsCache lies
  about the availability of an article in STAT <Message-ID>. We use HEAD
  now. (workaround backported from leafnode 2.0beta)
- upstream posts are now deleted as soon as they have successfully been
  posted.
- fetchnews -P no longer segfaults
- SIGPIPE now updates groupinfo and overview information, it would kill
  fetchnews before.
- log port number in "connected to" log message
- Mark Brown's workaround to "no groups available" problem with
  authentication failures, but after authentication failures and fixing
  username/password in the configuration file, run fetchnews -f once

leafnode (nntpd):
- buffer underrun fixed when the command consisted only of whitespace.
  Bug fix by Ralf Wildenhues.
- log our and the peer's address (to hint someone he should really use
  tcpd or something similar, and to overcome "I did not order this news
  group" reports)
- now mark the correct article for download in delaybody mode if the
  news reader sends BODY or ARTICLE <message-id>. (only affects
  crossposted articles).
- XOVER 1- now works on pseudogroups
- XOVER -n is now supported (came for free with the previous fix ;)
- STAT/HEAD/BODY/ARTICLE with "current article pointer" now work for
  pseudo groups
- exits with 503 error message to the client if the own hostname is not
  configured properly

newsq:
- add a new -f option to show the failed.postings queue.

texpire:
- the man page has been finally fixed to document that we expire
  individual articles, not threads.

Changes which are more technical and less visible:
- article numbers are now unsigned long almost everywhere
- out-of-memory conditions detected properly
- non-exploitable buffer overruns fixed
- line reading function is rock solid now, no more getaline
  crashes
- mkstemp is now robust against broken implementations that
  do not look at the umask
- some tuning took place, some fprintf have been replaced by fputs
- mkstemp function updated from leafnode 2.0beta

========================================================================
* 1.9.19 and prior: see ChangeLog. A separate NEWS file was not kept.

 vim:tw=78:ai:com=f\:-:
