Version 5.0.3 - 12/17/2023 A memory leak fix in the prior version wasn't applied correctly, resulting in an invalid memory access causing a crash. Bug fixed. Version 5.0.2 - 11/8/2023 Fixed bug that caused crash when a CLIENT_KEY arrived out of order Fixed option handling on Windows when an argument is missing Version 5.0.1 - 8/2/2022 On very low speed transfers (<10Kbps) sessions would time out due to a very large interpacket transmission interval. Fixed by putting a lower limit on the advertised GRTT of of the interpacket transmission interval. Sending of ABORT messages on early shutdown would sometimes fail due to OpenSSL cleanup functions running before application cleanup. Changed the ordering of atexit() handlers to ensure OpenSSL cleanup happens last. Fixed missing timestamp update when clients read CONG_CTRL messages Fix to GRTT handling on server to ensure it doesn't fall below minumim. Fixed bypassed checking of existing files on client for backup Various logging fixes Version 5.0 - 4/22/2020 Major security updates. The key exchange and key derivation algorithms were modified and supported algorithms were pruned using TLS 1.3 as a basis. This includes: - HKDF used in multiple stages for key derivation from raw shared secrets. - Included addtional context in key derivation and signatures to protect against replay attacks and downgrade attacks. - Reduced set of supported EC curves to those supported by TLS 1.3 - Removed RSA key exchange which does not provide perfect forward secrecy. All key exchanges now use ECDH. - Removed support for SHA-1 hashes in key exchanges. - Supported symmetric ciphers are AES in AEAD mode (GCM or CCM). - Increased supported RSA key sizes Encrypted sessions are now enabled by default. It can be disabled by specifying "none" for the key type in the server's -Y option. Backward compatibility retained for version 4.x in clients and proxies. When communicating with a 4.x server, only allow algorithms and key exchange modes permitted in the new version. Clients and proxies no longer need to use signature keys that match the type and size used by the server. As a result, the -k and -K options to the client now only accept a single key instead of multiple. The proxy still supports multiple keys for 4.x compatibility, however only the first key listed is used for any version 5.x session. Proxies now send their keys in a separate message instead of injecting them in the ANNOUNCE sent by the server. This allows clients to be fully aware of proixes and allows them to authenticate servers and proxies separately. Format of client's server list modified to specify the proxy that a server communicates through. Fingerprints listed in this file now always specify the server as opposed to having the proxy's key in some cases. Added -R option to client to specify a list of proxies along with their public key fingerprints. The old use of -R to specify a version 4.x response proxy has moved to -r. Previously, using -S in the client or proxy to specify a server list would automatically enable source specific multicast (SSM). The use of SSM is now enabled separately via the -o option on both the client and proxy. Fixed a bug that caused ECDSA signatures created on Linux with curve secp521r1 from being verified successfully on Windows. Fixed cleanup on clients and proxies to prevent occasional crashes on shutdown under Windows. Update timstamps in messages to use 64-bit microseconds since the epoch, addressing Y2038 issues. 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