Version 4.10.2 - 4/5/2020
  Fixed security issue where using sha384 or sha512 would set encryption keys
    to all bytes 0
  When using ECDH key exchange with closed group membership, an incorrect
    signature would be applied to the ANNOUCE message, causing the session
    to fail.  Bug fixes.
  Relaxed server side checks on the type of key supplied by a client when not
    using public key signatures on all messages.  This will assist in the
    upgrade process to the upcoming version 5.0.
  Fixed various small memory leaks

Version 4.10.1 - 1/15/2020
  Previously the timestamp of received files would only be set in sync mode.
    This has been fixed to always set the timestamp.
  Status file result messages were not being printed in all cases.  Bug fixed.
  Reject non-encrypted CONG_CTRL and CC_ACK messages when using encryption.

Version 4.10 - 7/10/2019
  Allow specifying transmission rates of up to 1 Tbps.  This involved changing
    a number of variables tracking the rate from 32 bit to 64 bit types.  It
    also changed the tracking of wait times between data packet transmissions
    from microseconds to nanoseconds.
  Fixed a bug when getting the list of network interfaces in the event that
    an interface does not have an interface index number.

Version 4.9.11 - 5/13/2019
  The error check added in 4.9.10 on chdir wasn't checking the correct value,
    causing the client and proxy to not start in background mode.  Bug fixed.

Version 4.9.10 - 5/9/2019
  The initial CLR selection was picking the receiver with the lowest RTT
    instead of the higest.  Fixed to select the receiver with the highest RTT.
  While the server is sending, check for CTRL-C by the user at least once a
    second instead of waiting for a GRTT cycle if it is longer.
  Fixed rate calculation bug when TFMCC is specified with -R -1.
  Minor error checking / log format fixes

Version 4.9.9 - 2/17/2019
  Fixed handling of min_time in TFMCC mode

Version 4.9.8 - 8/29/2018
  When compiling with MSVC 2017, the IP_MTU_DISCOVER flag is defined but not
    implemented, resulting in errors when attempting to set it.  Added check 
    for the case if the flag is not implemented.
  Machines with a blank IP address for the first interface were getting a
    default UID of 0.  When this happens, check for a non-blank interface
    to derive the UID from.
  Cleaned up setting of key exchange random numbers to avoid aliasing violation

Version 4.9.7 - 5/27/2018
  Fixed delay in server sending thread causing transfer of large files to
    time out.  The block number to send was being incremented once per
    iteration of the main sending loop.  This main loop also locks and unlocks
    a mutex to update data shared by the receiving thread.  When a large
    number of consecutive blocks do not need to be sent, the lock/unlock
    cycles resulted in delays where no data was sent.  Changed to increment
    the block number until a block to send is found without reiterating 
    the main loop.

Version 4.9.6 - 4/17/2018
  When a response proxy sends a PROXY_KEY message, send it on all public
    multicast addresses, not just the first one

Version 4.9.5 - 12/16/2017
  Upated encryption module to support OpenSSL 1.1.x and 1.0.x.
    Removed support for OpenSSL 0.9.8
  Changed install directory of uftpd uftpproxyd to /usr/bin
  Added CPPFLAGS to makefile for build hardening as requested by Debian

Version 4.9.4 - 10/7/2017
  When initializing TFMCC loss history, use datapacketsize if no recent packets
    found or if counter wraps.  This fixes a divide-by-zero bug.
  Only run postreceive script when the incoming file has not yet been closed.
    This prevents the script from running twice if a duplicate DONE is received.
  Clarified documentation regarding incompatibility of temp dir and sync mode.

Version 4.9.3 - 1/21/2017
  Fixed a race condition in the server between the sending and receiving
    threads when building CONG_CTRL messages.  The receiving thread was
    not locking when placing messages on a queue.  Added proper locking.
  Minor updates to includes and typedefs to support 64-bit Windows builds.
    Now requires Visual Studio 2015 or higher.
  Changed manpage formatting and makefile options as suggested by Debian team.
  Added missing include for sys/time.h

Version 4.9.2 - 4/3/2016
  Under TFMCC when a client first experiences loss, it calculates the average
    packet size of the packets received either in the last GRTT or the last
    64K packets, whichever is less.  In the event the sequence number of the
    first lost packet is the same as the first packet received (which can
    happen due to wraparound), this wasn't being captures properly resulting
    in a divide by zero bug.  Made a fix to properly account for sequence
    number wraparound.
  When calculating the average packet size above, a cast was used that could
    result in a negative number being returned for this value.  Removed the
    offending cast.
  Fixed off-by-one bug when counting the number of DONE messages sent by the
    server before declaring clients as lost.

Version 4.9.1 - 3/15/2016
  A bug was introduced in 4.8.1 when a fix was made for received files having
    extra bytes appended when packets were received out of order.  When a
    file's size is an exact multiple of the block size, the last block was
    getting truncated.  Made a fix to account for this case.

Version 4.9 - 2/28/2016
  Added the -a option to the server, which specifies the maximum number of
    passes through transmitting a file before aborting any clients that have
    not yet received the entire file.
  When specifying TFMCC mode, the initial, minimum, and maximum rates were
    being read as bytes per second instead of the documented Kbps.  These
    fields are now being properly read as Kbps.
  In TFMCC mode, when the CLR received a CONG_CTRL message, it was responding
    with a CC_ACK before updating its RTT value, resulting in the CLR reporting
    an outdated RTT.  Made a fix to first update the RTT, then send the CC_ACK.

Version 4.8.1 - 2/4/2016
  When the last data block in the file arrived at the receiver out-of-order,
    additional null bytes were being appended to the end of the file.  This
    was due to a bug in calculating the current cache size.  Bug fixed.
  Clients normally check for sufficient free space before attempting to receive
    a file.  This was not working correctly when -t was specified.  Bug fixed.

Version 4.8 - 1/5/2016
  Added support for initial and minimum rates for TFMCC as well as a max rate.
    These may be specified as follows:
      -C tfmcc:min=min_rate:init=init_rate:max=max_rate
    See the man page for more details.
  Changed logging level for "invalid message" messages from level 1 to level 4.
    This should cut down on unnecessary log messages at lower levels.
  Fixed man page typos.

Version 4.7 - 5/16/2015
  Added group instance ID (i.e. restart number) to all log messages.
  Make sure that the client flushes the disk cache when a session is aborted.
    This wasn't being done previously, resulting in unnecessary retransmissions
    on the subsequent restart session.
  Previously, when a client registers via a proxy, the server added that client
    to the list of clients serviced by that proxy.  There was a bug that
    allowed a client sending back multiple registers to be added to this list
    multiple times, resulting in a buffer overrun if there are a large number
    of clients registering via a given proxy.  Fixed the bug by removing the
    list altogether, since the server doesn't really care which proxy a
    client registers via.

Version 4.6.1 - 3/15/2015
  At the start of the transfer phase with congestion control enabled, the
    server would sometimes select a client that had dropped out earlier in
    the session as the initial CLR, slowing down the file transfer.  Fixed.
  In restart mode for a partially sent file, the server sends a DONE right
    away before sending data to get NAKs from the clients.  The clients
    normally have a short delay before responding to a DONE to ensure that
    out of order data packets arrive.  In this case, since no data has been
    sent yet, the clients will now respond right away to avoid the unneeded
    delay.
  When the clients joins or leaves a multicast group, it checks to see if any
    other active sessions are using that group before doing so.  Fixed a bug
    that prevented the client from searching the whole list.

Version 4.6 - 12/30/2014
  Added the -F option to the client to print status info to a file.  Like
    the server's -s option, passing in @LOG mixes this info with the regular
    logging output.
  The client now prints the hostname/IP address where an ANNOUNCE originates
    from, which may be either the server itself or a proxy.  The -q option
    was added to prevent DNS lookups in the event it causes delays.
  Several spelling fixes in documentation and code comments.
  Fixed a memory leak in the fingerprint parsing routine.

Version 4.5.1 - 9/14/2014
  On the rare occasion a seek call made by the client errors or returns a
    file offset that was unexpected, a second call to seek is made to set the
    destination file offset to the proper place.  However, this second seek
    was jumping to the wrong place in the file.  This has been fixed, and
    a similar fix was made on the server as well.
  Allow the -s (status file) option on the server to take a special value of
    @LOG, which allows status info to be mixed with the regular logging output.
    This behavior is consistent with older versions that did this when sync
    mode was enabled.

Version 4.5 - 8/26/2014
  Added disk caching on the client, greatly improving high speed throughput.
    The cache size is controlled via the -c option.
  Changed logging levels on several log statements so that effectively
    level 0 is "error" and level 1 is "warning".  The default log level of 2
    will continue to contain semi-detailed logging.
  Increased client timeout for REG_CONF and DONE_CONF to 4*robust*grtt.
    This helps to prevent client from timing out too early.
  When the server receives a REGISTER or FILEINFO_ACK from a client and
    calculates its round trip time, enforce a lower limit of 0.01 seconds.
    This prevent client from timing out too quickly.
  Occurrences of SIGPIPE while writing to a log could result in an infinite
    loop.  SIGPIPE is now ignored, relying on normal error handling instead.

Version 4.4 - 7/22/2014
  Added max rate option to TFMCC implementation
  Added -U option to server to specify the server's UID
  Removed stale UFTP3 congestion control code

Version 4.3.1 - 7/3/2014
  Have clients send an ABORT for all active sessions on shutdown
  Fixed #ifs that enable dual mode sockets
  Removed -O0 from BSD section of makefile

Version 4.3 - 5/27/2014
  Added support for ECN (Explicit Congestion Notification) in the TFMCC
    implementation in the server and client.  Proxy support is forthcoming.
    See the man pages for known supported systems.
  Fixed warning in encrypt_openssl.c when compiling under FreeBSD x64.
  Explicitly enable dual mode IPv4/IPv6 sockets when IPv6 is used on systems
    that support it.

Version 4.2 - 5/12/2014
  Added distinct exit codes for various error conditions
  In client and proxy, check if private address is already in use before joining
  Fixed log rolling under Windows

Version 4.1.5 - 3/1/2014
  Fixed casting bug in server TFMCC operations when calculating client rate.
  Fixed server proxy bug where group round trip time was being read from
    client messages when it should only be read from server messages.

Version 4.1.4 - 12/5/2013
  During a restart session, a bug caused the full file to be resent on the
    first pass, and client wouldn't send back NAKs for the first session.
    This has been fixed.
  Fixed incorrect reading of client ID lists in DONE, DONE_CONF, and CONG_CTRL
    messages.
  Added group ID and file ID to server logging when timestamps are enabled.
  Added more warning checks for Linux and corrected warnings.
  Cleaned up error checking code for malloc and calloc calls.

Version 4.1.3 - 10/13/2013
  Since 4.0, compilation failed on MacOSX.  This has been fixed.

Version 4.1.2 - 8/20/2013
  Fixed client pathname checking that disallows ".." path elements.
  Server wasn't writing clients to the restart file that didn't send a
    COMPLETE message for the session.  Bug fixed.

Version 4.1.1 - 8/8/2013
  Fixed byte ordering issue in EXT_FREESPACE_INFO extension.

Version 4.1 - 7/30/2013
  Changed the way the server handles NAKs from the clients.  Instead of
    rewinding its current position as soon as NAKs are received, the server
    will wait until the end of the pass, then start a new pass.  This more
    closely resembles version 3.x behavior.
  Added special metafiles @DELETE:{filename}, which deletes filename on the
    client, and @FREESPACE, which reports the available free disk space on
    the client's primary destination directory.
  Upon receiving a FILEINFO, a client will abort if it doesn't have enough
    free disk space to receive the file.
  Added -S option to server to write parsable status information to a separate
    log file.  This information was previously available only with the -z
    option, and -z will no longer print this info without -S.
  Added -N option which specifies the maximum NAK percentage a client may
    report before potentially getting dropped.  Also added related -m option,
    which specifies the number of times a client can exceed the maximum NAK
    percentage before it is dropped.
  Reinstated the -W option, which specifies the maximum file transfer time as
    a percentage of the optimal time.
  Added -i option to client to allow moving files one at a time from the temp
    directory to the dest directory.  This option is necessary to prevent
    previously received files in dest from being deleted when full directories
    are received.
  Added -u option to server to specify outgoing UDP port number.
  Added log rolling to the server, client, and proxy.  The -g option specifies
    the max log file size in MB before rolling, and the -n option specifies
    the number of rolled log files to save.
  The server may now specify clients by their IPv4 name/address as well as
    their ID, assuming the clients in question use their IPv4 address as their
    ID, making for cleaner backward compatibility with version 3.x.
  Fixed several bugs in the TFMCC implementation:
    Fixed counter wraparound issue.
    Fixed crash when more than a few hundred clients are active.
    Fixed bug which caused rate to be set to 0.
  Fixed crash when sending an empty file.
  Added signal handlers in server so that it will save restart info if the
    user interrupts it.
  Fixed issue with printing of client IDs in server.
  Dependency fixes in makefile

Version 4.0 - 4/27/2013
  Added support for IPv6.  On systems that support dual stack IPv4/IPv6
    sockets, clients and proxies may listen on multicast groups for both
    IP versions.
  Dynamically determine round trip time to clients and base control message
    retransmissions and timeouts on that.  Old server timing options
    -A, -S, -a, -s, -r, -d, -W, and -m are no longer used, with -r and -s
    options repurposed to put constraints on round trip time calculations and
    control message retransmission counts.
  The server no longer waits for client responses in the middle of sending a
    file.  Multiple threads are used to send data packets while reading client
    responses, resulting in shorter overall transmission times.  Also, clients
    won't send back STATUS messages unless they require retranmissions of data
    packets, reducing to amount of back traffic the server must handle.
  Replaced simple congestion control scheme with TCP Friendly Multicast
    Congestion Control (TFMCC) as specified in RFC 4654.
  Upgraded available security protocols, including support for Elliptic Curve
    Diffe-Hellman key exchange, Elliptic Curve DSA signatures, AES in GCM
    and CCM authenticated modes, and SHA-384 and SHA-512 hashing.  As a result
    of this, the key fingerprinting algorithm has changed, so existing RSA
    keys will have different signatures.
  Clients and proxies are now always identified by a 32-bit ID instead of their
    local IPv4 address.  This ID will be derived from either the local IPv4 or
    IPv6 address if not explicitly specified.
  The format of the server list file on the client and the client/proxy list
    files on the server have changed as a result of the new method of
    identifying clients.  See the man pages for more details.
  Modified protocol to support the above new features and to be more
    extendable in the face of future upgrades.  While these changes break
    backward compatibility with 3.x versions, the added support for header
    extensions should prevent future instances of this.

Version 3.7.2 - 3/17/2013
  When a client aborts and isn't using a temp directory, delete the current file

Version 3.7.1 - 10/21/2012
  Fixed bug where clients would occasionally fail to register in open
    group mode if the client doesn't have a UID assigned.  First appeared
    in version 3.4.3.
  With a congestion control file in use, the speed wouldn't increase if
    the max_rate parameter was not specified in the congestion control
    config file.  First appeared in version 3.6.  Fixed.
  Under Windows, a postreceive script with a .bat extension wouldn't
    execute.  Bug fixed.

Version 3.7 - 6/28/2012
  Added the much-requested option to the client to run an external command
    upon receiving a file.  See the -s option.
  Increased the maximum number of recognized network interfaces to 100.
  Fixed data corruption bug caused by a file write error on the client.

Version 3.6.1 - 12/12/2011
  Reverted the change in 3.6 that allowed the client and proxy to bind
    only to one interface.  Doing so breaks multicast on UNIX-like systems.

Version 3.6 - 12/3/2011
  Added option (-N) to client and proxy to specify process priority.
    Default behavior change: prior to this release on UNIX-like systems,
      the client and proxy had a default nice() value of -20.  The new
      default is 0.
  Added max_rate parameter to congestion control config file.  Previously,
    with congestion control enabled, the initial rate would be the max rate.
    This parameter allows a max rate to be set separate from the initial rate.
  On client and proxy, if only interface is specified to -I (or if -I is not
    specified and only one non-loopback interface is detected), the
    client/proxy will bind only to that interface.  If more than one is
    specified or detected, it will bind to all interfaces.  Prior to this
    release, it would always bind to all interfaces.
  Explicitly disable MTU discovery on systems that support it.  Since the
    server specifies the MTU, it doesn't make sense to allow this.
  When using a congestion control file, it is reread at each DONE interval.
    This allows an external process to adjust the parameters on the fly based
    on network conditions or business rules.
  Fixed bug where a proxy wouldn't properly handle an ABORT from a client.
  Fixed bug that would cause all clients to abort on when max file transfer
    timeout was exceeded.
  Fixed server bug where -j wouldn't work if specified before -H.

Version 3.5.1 - 7/10/2011
  Send COMPLETE(rejected) instead of ABORT for file/path issues.
  Allow server to send broadcast packets.
  Improved memory management in server.
  Proxy wasn't propagating COMPLETE status upsteam.  Fixed.
  Filenames passed to server are no longer checked on startup.  They are
    instead checked as they are handled.
  Fixed proxy bug in open group mode where a client's address isn't detected.
  Fixed a few proxy bounds checking issues.

Version 3.5 - 6/17/2011
  Added sync mode - Incoming files won't overwrite existing files
    unless the existing file is older.  In this mode the server's output
    displays whether a file is copied, overwritten, or skipped, and also
    displays a count of each at the end of the session.  See -z on the server.
  Added sync preview mode - like sync mode, except no files are actually
    transferred.  The server displays the status of each file (copy,
    overwrite, or skip) had it actually been copied.  See -Z on the server.
  When using -D on the server to specify the destination file name, an
    absolute pathname may be specified.  Clients must be configured to
    allow incoming absolute pathnames.
  Allow clients to specify multiple destination directories.  The client will
    allow an incoming file with an absolute pathname if it matches at least
    one destination directory.
  Added a simple congestion control method controlled by a config file.
    See the -C option to the server.
  Added backup directory option to client.  If an incoming file would overwrite
    an existing file, the existing file is backed up.  See -A on the client.
  Added option to client to use an individual temp file for each incoming
    file as opposed to a temp directory for all files.  See -t on the client.
  Added configurable logging levels to server, client, and proxy.  See -x.
  Added ability to send proxy heartbeat messages from clients.  See -H and -h.
  Fixed bug where clients assigned a UID don't register properly.  
  Fixed crash when reading from config files with blank lines.

Version 3.4.3 - 4/23/2011
  Under Windows, allow use of the system key container for private keys.
    See -y on the server, and -m on the client and proxy for more details.
  Previously, when a client registered with a server in open group membership
    mode, it responded using the IP of the first network interface, which is
    not necessarily the interface the ANNOUNCE was received on.  The client
    now responds with a blank IP, telling the server/proxy to use the source
    IP of the incoming packet as the client's IP.
  Enabled NO_ENCRYPTION compile flag on Windows.

Version 3.4.2 - 3/29/2011
  Fixed error when passing "-Y none" to the server
  The pidfile option (-P) for the client and proxy didn't work under
    Windows.  It does now.
  Improved internal error checking.

Version 3.4.1 - 2/21/2011
  Fixed crash in Windows when receiving an empty file
  Extended the late register and late done timers to 1.5 times the old values.
    This gives clients a little extra time to send responses.
  Clients now send a COMPLETE in response to a FILEINFO for a directory or
    a symbolic link, eliminating an extra DONE/COMPLETE cycle.
  Clients may now accept a FILEINFO in lieu of a REG_CONF.  This eliminates
    a timing issue when a REG_CONF gets lost.

Version 3.4 - 12/18/2010
  Added new proxy mode: response proxy
    Used when servers have direct multicast accessibility to clients, but
      response aggregation is still desired.
  Fixed overflow bug when calculating packet rate with jumbo frames.
  Fixed server bug when checking maximum size of file exclusion list.
  Fixed bug in BSD systems where setting of DSCP/TOS value failed.
  Updated documentation regarding Windows support for DSCP/TOS.

Version 3.3.3 - 11/26/2010
  Added -Q option to server, client, and proxy to specify the DSCP
    (formerly TOS) in the IP header for all outgoing packets.
  Increased max announce time and status time from 10000 to 20000 ms.

Version 3.3.2 - 10/13/2010
  Added DESTDIR option to makefile to allow installs in fake root directories.
  Fixed overflow bug with session longer than 30 minutes.
  Added examples to man pages

Version 3.3.1 - 7/18/2010
  Added -i option to server to take list of file to send.
  Added -T option to server to always print timestamps.
  Fixed bug introduced in 3.3 where a single dropped REG_CONF
    results in a client not being able to register.
  Added makefile support for Darwin/OSX.
  Improved error handling.

Version 3.3 - 7/8/2010
  Added ability to restart failed file transfers (see server -f and -F).
  Removed timeout option from proxy (-o) and client (-t)
    The server specified status_time is used instead.
  Allow proxies to keep track of multiple pending messages at once.
  Added makefile flags to compile without encryption support.
  Fixed handling of snprintf return codes under Windows.
  Have proxies foward ABORTs after local handling.

Version 3.2.1 - 6/16/2010
  Under Windows, setting the root directory of a drive (c:\, d:\, etc.) as
    the destination directory caused errors.  Fixed.
  When trying to send unicast to a client behind a NAT, the client would
    reject the transfer because the IP specified by the server doesn't
    match the client's IP.  Clients will now always accept in unicast mode.

Version 3.2 - 5/30/2010
  Fixed compile bug on OSX (cleaned up signal setup)
  Added detection of non-multicast interfaces
  Added unique ID to clients and proxies.  This allows for distinguishing
    clients between different NATs that might have the same IP address.

Version 3.1 - 4/6/2010
  Added ability to send empty directories and symbolic links
    Added -l option to server to follow / not follow links
  Added -D option to server to specify destination file name
  Fixed client bug when receiving a file with the same name as an
    existing directory and vice versa

Version 3.0 - 3/11/2010
  Added SSL derived encryption.
    Uses RSA for host authentication and key exchange.
    Uses DES, Triple DES, AES-128, and AES-256 for data encryption.
  Ability to send multiple files or full directories at once.
  Clients may be listed in a file instead of the server command line.
  Added proxy daemon which allows:
    NAT traversal
    Aggregation of client responses
    Multicast tunneling
  Support for variable packet sizes.
  Removed latency levels in favor of more fine grained control.
  Support for source specific multicast.
  Protocol heavily altered to support new features.
  Code completely restructured and reformatted for ease of updates and support.

Version 2.10.3 - 1/21/2010
  Fixed ttl bug under Solaris where no value was valid
  Cleaned up handling of server timeout so an extra DONE request isn't sent
  Changed Windows sockets error messages to use proper system message strings

Version 2.10.2 - 11/3/2009
  The change in 2.10.1 that fixed the NAK issue caused a crash when sending
    or receiving empty files.  This has been fixed.
  When specifying the list of interfaces for the client to listen on, if the
    interfaces are listed by name only the first was used.  Bug fixed.
  Cleaned up more warnings on Windows

Version 2.10.1 - 8/20/2009
  Fix for last packet wait bug, introduced in 2.3
  Fix for NAKs with block counts a multiple of the section size
  Fixed ttl bug - now uses actual number instead of ascii value of the
    number.  This also results in the default ttl changing from 49 to
    the intended value of 1, so this may have an effect on existing apps.
    Thanks to Luc Tanguay for finding these bugs
  Cleaned up some warnings on Windows

Version 2.10 - 7/16/2009
  Added -B option to client and server to set UDP receive buffer size.
    Defaults to the old hardcoded value of 256K.
  Added -z option to server, which tells clients to make responses as
    small as possible.  This minimizes backtraffic when you have a
    large number of receivers.
  Adjusted timeouts to work together better.
  Server now exits if invalid hosts are specified.
  Fixed some minor logging bugs.

Version 2.9.2 - 6/20/2009
  Getting the list of network interfaces is no longer mandatory.  If
    there's a problem getting the list, and you don't pass -I to the
    client, it just uses the clients hostname interface as before
  Fixed bounds checking on the server's -R and -c options, and 
    increased the maximum valid value for -c to 60000 (60 seconds).
  Fixes to run properly under FreeBSD, including:
    Use signal(2) instead of sigset(2) for signal processing
    Use getifaddrs to get list of network interfaces
    Try a smaller value for the receive buffer if the first fails

Version 2.9.1 - 6/13/2009
  Allow the full 10000 receivers for closed group membership as well as
    open.  Multiple ANNOUNCE message are now sent to accommodate the
    longer lists.
  Minor modifications to compile under OpenVMS.
  Fallback to listening on the client's hostname interface if interface
    list contains no active non-loopback interfaces.
  Got rid of debug message on startup on Windows boxes.

Version 2.9 - 6/8/2009
  After numerous complaints from Linux users, the uftpd client now listens
    for multicast traffic on all non-loopback interfaces by default.  You
    can still restrict the interfaces using the -I option.
  The -I option for both the client and server will take interface names
    (ex. eth0, bge1, etc.) as well as hostnames or IPs.
  Broke out implementations in header files into separate source files
  Commoned up all UNIX-like makefiles

Version 2.8.1 - 5/18/2009
  Pidfile option to uftpd wasn't optional as documented.  It is now.
  Fixed bug in reporting of total time.  Was previously looking for newest
    end timestamp among all receivers, now only checking completed ones.

Version 2.8 - 4/26/2009
  Functionality change: Instead of the server sending a REG_CONF separately
    to each client, it sends one listing up to 300 clients, and more if
    required.  These are sent out before each subsequent ANNOUNCE and, in
    closed group mode, after receiving REGISTERS from all clients.  The
    handling of DONE_CONF messages also changed to work in a similar manner.
    As a result, the client side timeouts were increased to handle this.
  Added -c option to uftp to explicitly set client timeouts in milliseconds
    for both REG_CONF and DONE_CONF.  Useful for when the server expects
    to hear from a large number (>100) of receivers over a low speed link,
    meaning it could take the server several seconds to process them all.
    If this value is less than the time for the specified latency level,
    it is ignored.

Version 2.7.1 - 3/31/2009
  Added -P option to uftpd to write the daemon's pid to a pidfile.
  Added latency level 4 with values 2x that of level 3.
  Fixed bug when sending DONE to over 300 clients.
  Brought man pages up to date.
  Changed license to GPLv3.

Version 2.7 - 2/26/2009
  Added -n option to uftp to prevent name lookups of clients (a similar
    option exists in uftpd).  This happens for both open group membership,
    when clients register, and for closed group membership, when names are
    specified on the command line via -H.  For the latter to take effect, -n
    must appear before -H on the command line.
  Changed name of wait variable in uftp to get around conflict on OSX/BSD,
    and added OSX/BSD makefile.  Thanks to Jusin Venus for supplying these.

Version 2.6.6 - 1/16/2009
  Fixed logging output to display correctly on 64 bit systems

Version 2.6.5 - 12/18/2008
  Cleaned up a few more warnings

Version 2.6.4 - 12/16/2008
  Cleaned up some warnings, added -Wall to linux makefile

Version 2.6.3 - 7/29/2008
  Fixed the basename function for Windows, and made a proper makefile
    for Windows.  Thanks to Amol Deshpande for providing these.
  Removed the call to basename from uftpd, since it has no effect.

Version 2.6.2 - 7/28/2008
  Cleaned up the code a bit so file names/paths have a consistent size,
    fixed bounds checking on several buffers
  In-code max of 10000 receivers for open group membership, 100 for closed

Version 2.6.1 - 6/11/2007
  Fixed wait bug in uftp

Version 2.6 - 2/25/2007
  Changed all "short", "long", and "long long" types to the
    appropriate fixed size types (16, 32, and 64, respectively) for
    better compatibility between 32 bit and 64 bit environments.
  Man pages added for Unix/Linux systems.
  The -I option to uftpd is now optional.  It defaults to the
    interface associated with the client's hostname.

Version 2.5.3 - 10/27/2006
  In version 2.5.1, a fix was applied to uftpd to only close a file 
    if it was still open.  But apparently, the old line of code 
    that closes it outright wasn't removed (doh!).  It's gone now.

Version 2.5.2 - 10/26/2006
  Bug fixes in uftpd - the -n option was actually causing the opposite
    of the intended effect, and forgot to check for a null value from
    gethostbyaddr when looking up the sender's name.

Version 2.5.1 - 9/25/2006
  Fix in uftpd - don't close file if already closed.  On most OS's, 
    this isn't an issue, but under MS Visual Studio it caused a crash.
    Thanks to Mark Leavy for catching this one.
  Made a similar fix in uftp.  Actually, the file was never formally
    closed.  It is now.

Version 2.5 - 9/20/2006
  Allowed the -I option to uftpd to take multiple parameters separated
    by commas.  This allows you to listen for multicast traffic on
    multiple interfaces, and also allows you to receive data on one 
    interface and send responses back on another.

Version 2.4 - 9/16/2006
  Added -L option to uftp to allow output to go to a log file.  The
    default is to write to stderr.
  Modified all error routines in uftp to use logfunc.  This is how
    error logging is currently done in uftpd.

Version 2.3.1 - 7/25/2006
  Fixed to allow zero length files to be transferred.

Version 2.3 - 7/16/2006
  Fixed handling of large files in Windows
  Added descriptive error messages for Windows socket errors
  Functionality change: uftpd now runs in a single thread.  This not
    only resulted in a speed increase on most systems, but also gets
    back the functionality of receiving multiple files at once in unicast
    mode, which was lost in version 1.3.  It is also no longer necessary
    to have multiple sockets open on the same port, which caused an
    issue where multiple instances could be running on the same port.
    The code for uftpd was also restructured as a result, becoming
    more modular.
  Removed -s option from uftpd, since the conditions necessitating this
    option no longer exist.

Version 2.2 - 7/7/2006
  Added -n flag to uftpd prevent name lookups of transmitter.  This can
    eliminate issues with slow name lookups delaying registration.

Version 2.1.1 - 7/5/2006
  Fixed handling of -H option to uftp

Version 2.1 - 6/22/2006
  Made a few fixes specific to Linux machines:
  When calling select(3c) with a timeout, save off a copy of the timeout
    variable and reset it just before calling select.  This gets around
    Linux-specific behavior which modifies the timeout parameter after
    the call to indicate the amount of time left to wait.
  Added a -s option to uftpd.  Apparently, when multiple UDP sockets are 
    open on the same port in Linux, any packet arriving on this port gets 
    passed to ALL open sockets, regardless of whether or not the multicast 
    destination of the packet matches one of the multicast addresses the 
    socket is bound to.  This causes a slew of "invalid txID" or "invalid
    function: ANNOUNCE" messages that otherwise shouldn't show up.  The -s
    option will suppress these messages.  NOTE: This option should ONLY be
    used on Linux boxes (or other UNIX-like OS's that exhibit this behavior),
    as it could hide a real problem.  Windows and Solaris uses should NOT
    use this option.

Version 2.0 - 5/4/2006
  UFTP now runs under Windows!  It will compile under both Visual C++ 6.0 
    and Visual Studio .NET, and run on Windows 2000/XP.  No MFC or .NET 
    functionality was employed, only straight WIN32 calls.  A few major 
    changes under the hood made it possible to have one version of the 
    code that compiles in both environments:
  The receiver, uftpd, now uses multiple threads instead of multiple
    processes.  This was made necessary because Windows doesn't support
    the UNIX fork function, which makes an exact copy of the calling process.
  The logging functions in uftpd had to be modified to allow for a common
    interface for UNIX and Windows boxes.  
  Changed timing routines in uftp.  Previously, the gettimeofday function was
    used to get microsecond resolution timestamps.  Since Windows doesn't have
    this function, calls to this function in addition to calculations of 
    timestamp differences were hidden away behind #defines, so that UNIX boxes
    still call gettimeofday, and Windows boxes use QueryPerformanceCounter.
  Several other functions, including perror, usleep, link, were abstracted 
    behind #defines to allow for a common interface for UNIX and Windows.
    The Windows Sleep function only has millisecond timing, however it still
    allows for proper wait times between packet transmissions.
  Wrote my own versions of getopt and basename, since they don't exist in 
    Windows.  When compiled for UNIX, the built in OS functions are used.
  Currently, the Windows version of uftpd does not put itself in the 
    background.  A Command Prompt window will remain open, even without the 
    -d option.  This was a consequence of using main instead of WinMain for 
    the entry point to keep it consistent with UNIX.  This can be worked 
    around by calling uftpd with hidedos.exe, which is a utility program 
    created by LanDesk.  This utility can be found freely on several LanDesk 
    related forums.

Version 1.4.2 - 1/24/2006
  Bug fix - missing htons() call when assigning port in uftpd. Not a big deal
    for big-endian machines, BAD for little-endian machines.

Version 1.4.1 - 1/15/2006
  Added a few missing header files

Version 1.4 - 11/16/2005
  Added support for large (>2GB) files
  On second and subsequent passes, status requests are not sent for a 
    particular section if there were no NAKs for that section.  A status
    request is always sent for the last section, however.

Version 1.3 - 9/25/2005
  Add -l flag to uftp to set a predefined latency level 1-3 
    (1=low, 2=medium, 3=high (default))
    In prior versions, during the initial handshaking and when requesting
    NAK counts, the transmitter would wait 2 and 4 seconds respectively 
    before resending a request.  This is fine for a high latency link 
    (satellite, WAN) but not a low latency link (local LAN).  This setting
    allows for shorter waits to handle a variety of network latencies. 
    This flag should be omitted for backward compatibility 
  Functionality change: The parent uftpd process no longer forwards data
    to its children.  The children now receive the data directly from the
    transmitter.  This greatly improves high end throughput.  However, doing
    so relies on a multicast feature (allowing multiple UDP sockets to listen
    on the same port) that doesn't work in unicast.  Therefore, in order
    to retain the ability to receive files via unicast, uftpd cannot receive
    files via unicast and multicast at the same time.  When a request
    for a unicast transfer is received, it is accepted only if no other
    files are being received.  The parent uftpd then handles the file 
    directly and will not accept any other files until it is done.

Version 1.2 - 9/14/2005
  Improved error handling
  Improved cross-platform compatibility

Version 1.1 - 8/15/2005
  All integers in UFTP header converted to network byte order before
    sending, and converted back upon receiving, allowing machines with 
    different hardware architectures to communicate
  Minor performance enhancements

Version 1.0.1 - 6/19/2005
  Added missing extern declarations for optarg and optind
  Removed extra name lookup on server when reading -H

Version 1.0 - 12/17/2002
  Removed packet wait interval option (-W) to server
  Repurposed server -W option for transmssion weight option
    Dictates maximum file transfer time as a percentage of optimal time
  Added -m option to server to specify minimum transfer time
  Added -t option to client to specify session timeout time
    Replaced hardcoded timeouts

Version 0.9 - 4/4/2002
  Added -T option to client to receive files into a temp directory
  Changed permissions on created files
  Minor logging changes in server
  Fixed RND seeding

Version 0.8.1 - 11/19/2001
  Fixed endianness issues

Version 0.8 - 7/6/2001
  Initial public release

