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