================================================================================
* 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.
