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 assciated 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 exibit 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 enivronments:
  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 compliled 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/2005
  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/2005
  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 architechtures to communicate
  Minor performance enhancements

Version 1.0 
  Initial Release
