Changes in 6.0:
	*** IMPORTANT: See note about tcpwrappers below ***

	The TFTP windowsize option (RFC 7440) is now supported. The
	--windowsize and --window-bytes options to tftpd can be used
	to limit the permitted window size.

	If pthreads are available, tftpd now performs I/O in a
	separate thread, to avoid transfer slowdowns due to I/O
	bottlenecks.

	Support for tcpwrappers has been dropped. Use kernel-level
	firewalling if per-IP client access control is
	desired. tcpwrappers has not been widely used for some time,
	so this should only affect a small number of users in the
	first place.

	The --timeout option is now also supported when running
	standalone.

	The --pidfile option is now also supported when not running
	standalone.

	Fix the --stderr option with --secure.

	Do not fail a transfer because the client requested unknown
	options.

	Add the --reject-all option to disable RFC 2347 option
	negotiation completely.

	The client now supports the blksize and windowsize options.

	Add support for long command line options to the client.

	Add interactive blocksize and windowsize commands to the client.

	tftpd now supports multiple --address arguments to bind to
	multiple addresses. Furthermore, if --address is given a
	domain name that resolves to multiple addresses, tftpd will
	bind to all those addresses.

	tftpd can now use systemd socket activation with the
	--systemd option.  The service accepts the descriptors passed
	by systemd and remains in the foreground; --address and
	--systemd cannot be used together.

	The default UDP service used for listeners without an explicit
	port can now be overridden with --service, --port, or -S.  The
	--ports alias is also available for --port-range, and --chroot
	is an alias for --secure.

	tftpd now builds correctly when IPv6 support is disabled with
	--disable-ipv6.

	Improve validation of tftp -c commands: an empty or missing
	command now fails with a usage error instead of entering
	interactive mode or crashing. If -c is passed a single
	argument, it is split into tokens as if it had been entered
	from the interactive command line.

	Improve diagnostics for invalid wildcard listener addresses.

	Fix handling of jump labels in the rewrite file.

	Handle binding to an address which has not yet been configured
	on platforms which support it. This can avoid race conditions
	during startup.

	Various configure and make improvements (see ./configure --help).


Changes in 5.4:
	*** Read the man page for important details ***

	Much stricter validation of path names when operating in
	non-chroot mode.

	The remap engine now allows labels/jump targets for more
	complex, multi-step rule processing.

	The remap engine can now probe for the existence of a file.

	New "gg" modifier to the "r" remapping rule.

	Cleaner handling of restricted user namespaces on Linux.

	Source code cleanups.

	Add --enable-werror configure option.

	Fix several security-relevant bugs in path validation
	(tftpd/path.c): an uninitialized buffer read and a broken
	path tokenizer could let a crafted or unlucky request bypass
	path restrictions or crash the daemon.

	Fix buffer overflows in the tftp client: an unbounded strcpy()
	when building requests, an out-of-bounds write when putting
	multiple files to a remote directory, and an unbounded write
	into the interactive command-line argument array.

	Fix an out-of-bounds read while scanning request fields in
	tftpd, and an incorrect address family used when creating the
	per-transfer socket on platforms without recvmsg().

	Fix the --map-steps option, which rejected all valid numeric
	arguments due to an inverted validity check.

	Fix the \x remap macro returning the wrong substitution
	length, which could corrupt or drop its expansion in remap
	rules.

	Fix synchnet() passing the wrong nfds argument to select(),
	which silently disabled its protection against the Sorcerer's
	Apprentice retransmit bug.

	Fix tftpd failing to build/link on platforms lacking
	recvmsg()/msghdr::msg_control support.

	Fix several portability library bugs: a dup2() fallback with
	incorrect semantics (removed as obsolete), a heap buffer
	overflow and build failure in the getaddrinfo() fallback, a
	build failure in the inet_ntop() fallback, a file descriptor
	leak in daemon() on dup2() failure, and undefined pointer
	arithmetic in getopt_long().

	Add IPv6 support on MacOS X.

	Fix groff formatting warnings in the tftp and tftpd man pages.


Changes in 5.3:
	Allow separate IPv4 and IPv6 remapping rules.

	Properly convert IPv6-mapped IPv4 addresses as IPv4 during
	remapping.

	Better detection of local addresses, trying to ensure that
	the proper response address is used for a multihomed host.


Changes in 5.2:
	Fix breakage on newer Linux when a single interface has
	multiple IP addresses.


Changes in 5.1:
	Add -P option to write a PID file.  Patch by Ferenc Wagner.

	Bounce the tftpd_log socket in standalone mode, in case the
	tftpd_log daemon has been restarted.  Patch by Ferenc Wagner.

	Build fixes.

	Fix handling of block number wraparound after a successful
	options negotiation.

	Fix a buffer overflow in option parsing.


Changes in 5.0:
	Try to on platforms with getaddrinfo() without AI_ADDRCONFIG or
	AI_CANONNAME.

	Implement the "rollover" option, for clients which want block
	number to rollover to anything other than zero.

	Correctly disable PMTU in standalone mode.  Patch by Florian
	Lohoff.


Changes in 0.49:
	Add IPv6 support.  Patch by Karsten Keil.

	Support systems with editline instead of readline.

	Support long options in the server.


Changes in 0.48:
	Unbreak -l -s in the server, which was broken in 0.47.


Changes in 0.47:
	Add -L option to the server to run standalone without
	detaching from the shell.

	Parallel make fix.


Changes in 0.46:
	Minor portability improvements.


Changes in 0.45:
	Add -l (literal) option to the client, to override the special
	treatment of the colon (:) character as a hostname separator.


Changes in 0.44:
	Allow the client to specify a range of local port numbers,
	just like the server can.

	Fix sending SIGHUP to update the regular expression table.


Changes in 0.43:
	Fix double-free error on ^c in client.

	Try to deal with clients that send TFTP requests to broadcasts
	(apparently some recent Sun boxes do this instead of using the
	address told by DHCP.  Bad Sun!  Bad Sun!)

	Portability fixes.


Changes in 0.42:
	Try to disable path MTU discovery for TFTP connections (it's
	useless anyway.)

	Add a hack to allow the admin to specify a range of local port
	numbers to use.

	Fix local IP number handling on systems which present
	IP_RECVDSTADDR in recvmsg().


Changes in 0.41:
	Fix bug by which patterns of the form \U\1 weren't converted
	correctly.


Changes in 0.40.1:
	Solaris build fix.


Changes in 0.40:
	Fix bug which would cause "r" remapping rules to be
	incorrectly rejected.


Changes in 0.39:
	Support Perl-style \U...\E and \L...\E, as well as allow
	matching rules to be inverted (execute if rule *doesn't*
	match.)

	Fix a timeout bug.

	Add an RPM spec file.


Changes in 0.38:
	Portability fixes.


Changes in 0.37:
	Fix a pathology where a client sending ACKs for the wrong
	packet can prevent proper retransmission.


Changes in 0.36:
	Portability fixes.


Changes in 0.35:
	Add an option to control the maximum value of blksize
	negotiated.

	Removed workaround for obsolete Cygwin problem.

	Don't use getopt() -- the -c option doesn't work correctly
	since it depends on the ordering of arguments and options.  It
	is now possible to do:

	tftp -m binary hostname -c get filename

	This was previous possible by doing:

	tftp -m binary -c get hostname:filename

	... but it seemed that was counterintuitive to people.

	Somewhat improved configure scripts.


Changes in 0.34:
	Additional Solaris gcc compiler bug workarounds; these
	actually make the code somewhat cleaner.


Changes in 0.33:
	Even better error messages.

	Work around a suspect Solaris gcc bug.

	Configuration fix: readline needs termcap.

	Support running the tftp client from the command line.  For
	example:

		tftp -m binary -c get hostname:file


Changes in 0.32:
	Better error messages; including the capability to send a
	custom error message to the client when hitting an "a" rule in
	a remapping table.


Changes in 0.31:
	Put in a check to make sure xinetd (in particular) doesn't
	pass us an IPv6 socket.

	Fix some problems related to timeout negotiation.

	Allow the user to set the default timeout speed.


Changes in 0.30:
	(Hopefully) better timeout algorithm.

	Add a "utimeout" option; like "timeout" but in microseconds.

	Change the log level of client-side errors to LOG_WARNING.

	autoconf portability improvements.

	Minor bugfixes.


Changes in 0.29:
	Posixly correctness.

	Now compiles and runs on Win32 systems using Cygwin
	(http://www.cygwin.com/).
	(<http://www.cygwin.com/>).

	Fixed a bug which could cause a standalone server to exit with
	a "recvfrom: Interrupted system call" log message if signals
	arrive at a particularly inopportune moment.

	Fix a macro substitution bug (thanks to Richard Nyberg.)


Changes in 0.28:
	Fix stupid one-liner bug which broke standalone mode (-l).


Changes in 0.27:
	Make the Digital Unix 4.0F platform work again.  Thanks to
	Alan Sundell for helping out with this platform!

	Make the AIX 4.3 platform work again.  Thanks to Josef Siemes
	for helping out with this platform!

	Allow replacement patterns to include the IP address of the
	requesting host (\i).

	Allow relying on Unix permissions rather than o+r magic if the
	-p option is specified.  As part of this, set all groups if
	initgroups() is specified on the platform.

	Clean up race conditions inherited from the BSD source base.


Changes in 0.26:
	Fix the configuration process so tftpd doesn't end up
	depending on readline, which apparently could happen on some
	platforms before.

	Make parallel builds (make -j) work correctly.

	Improve parsing of the "connect" command in the tftp client.

	Add a -V option to both tftp and tftpd to print the version
	number on stdout and immediately exit.

	Add a -v option to tftp to start out in verbose mode.

	Rewrite the man pages using standard "man" troff macros.

	Enable the (limited) use of readline on systems which don't
	have readline/history.h.

	Support compiling under MacOS X with fink (see
	<http://fink.sourceforge.net/>).  Thanks for Justin Hallett
	and Eric Eslinger for their help in getting this working!


Changes in 0.25:
	Fixed Sorcerer's Apprentice bug in both the client and the
	server.  These bugs were inherited from the original BSD code.


Changes in 0.24:
	Fix bugs in both client and server dealing with block number
	wraparound, usually manifesting themselves as failure to
	handle files over 32 MB in size.

	Officially make the client a part of the tftp-hpa project.


Changes in 0.23:
	Correct memory overwrite bug in the tftp client when compiled
	with readline.


Changes in 0.22:
	Even more portability improvements: FreeBSD and
	Tru64/Digital Unix.

	Fix tsize option on systems on which off_t is "long long".

	Support large files on systems which need _LARGE_FILE_BITS or
	similar.

	Some source cleanups; change to autoconf 2.52.

	Add support for readline command-line editing in tftp.


Changes in 0.21:
	Support running in standalone mode, without inetd.

	Even more portability improvements.  Now known to compile and
	run on Linux, Solaris 5, 5.1, 6, 7 and 8, and AIX.  Reports of
	success or failure on other modern systems always appreciated.

	Clean and modernize some really ugly old code.

	Fix a potential illegal memory access when running in "totally
	insecure mode" - no -s, no directories listed.


Changes in 0.20:
	Portability improvements.  Now known to compile and run on
	Solaris 8.


Changes in 0.19:
	Fork before performing tcpwrappers check.

	Don't rely on nonstandard bsd_signal() function, instead
	require that the platform has sigaction().  This is 2001,
	after all.  This may resolve some potential portability
	problems.

	Log a message if memory allocation fails, instead of dying
	silently.

	Clean up the main dispatch loop.

	Use <sysexits.h> for exit codes, if it exists.

	Add support for debugging remapping rulefiles; if logging with
	-vvv tftpd will log all rules actions.

	Correct the error code issued by an "abort" rule.


Changes in 0.18:
	Support (almost) arbitrary filename remappings via regular
	expression-based rulesets.

	Added -v option for more verbose logging.


Changes in 0.17:

	Add support for tcpwrapper checking (/etc/hosts.allow;
	/etc/hosts.deny) in tftpd.

	Compile correctly on glibc 2.1.2.

	Add -u option to specify the user id to run as (default
	"nobody".)

	Operate in "daemon mode" as long as we keep getting requests.
	This should speed up handling large amounts of requests at
	once, as can happen when a client starts up, and avoids inetd
	misconfiguration problems.


Changes in 0.16:

	Correct massive lossage from 0.15: apparently 0.15 was based
	on an out-of-date CVS repository, somehow.

	Fix for ACKs in TFTP PUT; patch by Roger Venning.


Changes in 0.15:

	If the operating system allows, try to obtain the local
	address used for the request packet, and reply using the same
	local IP address.  Some embedded TFTP clients are (probably
	incorrectly) picky about this.


Changes in 0.14:

	Hacks to signal handling to avoid "zombie servers."


Changes in 0.13:

	Added the non-standard option "blksize2".  The "blksize"
	option is limited in its usability, since TFTP is designed to
	be implemented in a ROM, and ROM code might find it painful to
	deal with packets that don't meet certain alignment
	restrictions.

	The "blksize2" option tells the server that the block size
	must be a power of 2 to be usable to the client.  The server
	SHALL respond with a block size that is a power of two, up to
	a maximum of 32768, or reject the option.  Furthermore, the
	server SHALL grant a block size that is no smaller than 512
	bytes unless the client explicitly requested a smaller block
	size.  If the client request both options, the server MAY
	accept one or the other, but not both.  At some point I will
	probably write up an IETF draft for this option.


General information on the tftp-hpa series:

The core software was taken from OpenBSD (CVS source as of
1999-09-21).  I believe this was the most secure source base available
at the time I obtained this code, and it included support for the -s
and -c options.

The un-BSD-ized Makefiles and a lot of the configure macros were taken
from netkit-tftp-0.10 by David Holland; I also followed this example
and modernized the code style throughout.

Patches by Markus Gutschke and Gero Kuhlmann were the basis for the
option negotiation as well as the "blksize" and "tsize" option
support, although I made a fair amount of mostly stylistic changes to
their code.

Adding the -r option (disable a specific option), the "timeout"
option, converting to using autoconf for setup, and any additions
listed in the Changes list above, has all been my own code, as are any
bugs introduced in the merge.
