Add some temp-name dot heuristics for OS X's sake. - Drop one leading '.' from the filename (before adding our own). - Drop one trailing '.' from a (possibly truncated) name prior to the .XXXXXX suffix being added. - Allow the temp-name to collapse to just the .XXXXXX suffix if the path is long enough to require that. Note that we don't try to remove multiple dots from a filename that actually has multiple consecutive dots, since we might as well learn early if the final name is going to fail or not.
More --timeout improvements, especially for the receiving side: - The receiver now sends keep-alive messages to the generator when it is actively doing work and hasn't sent anything recently. This ensures that the generator won't timeout if the receiver is working hard. - The perform_io() code has improved keep-alive participation. - Allow the sender to send some keep-alive messages, which ensures that if it is in a lull, it can probe the socket.
A major overhaul of I/O routines, creating perform_io(). Files-from data is now sent as multiplexed I/O so that it can mingle with any messages (such as debug output). Requires protocol 31. Protocol 31 no longer disables output verbosity in a couple instances that used to cause protocol issues. Got rid of MSG_* messages that have implied raw data that follows after them. We instead send a negative index value as a part of the raw data stream, which is guaranteed to be output together with the following data. This only affects the (in-progress) protocol 31 and the (self- contained) communication stream from the receiver to the generator. Added --debug=IO and improved --debug=FLIST. Some --debug=IO output requires --msgs2stderr to be used to see it (i.e. sending a message about sending a message would send another message, ad infinitum).
Create non-transferred files in a more atomic manner: If a symlink, device, special-file, or hard-linked file is replacing an existing non-directory, the new file is created using a temporary filename and then renamed into place. Also changed the handling of a cluster of hard-linked symlinks/devices/special-files to always ensure the first item in the cluster is correct, since it doesn't really save any significant work to try to find an existing correct item later in the cluster to link with.
More backup improvements: - Changed get_backup_name() to verify the backup path, and make any missing directories. This avoids accidental use of a symlink as a dir in a backup path, and gets rid of any other non-dirs that are in the way. It also avoids the need for various operations to retry after calling make_bak_dir(), simplifying several pices of code. - Changed create_directory_path() to make_path(), giving it flags that lets the caller decide if it should skip a leading slash or drop the trailing filename. - Mention when we create the backup directory, so the user is not caught unaware when rsync uses a directory they didn't expect. - Got rid of some dir-moving backup code that is not used. - Added a little more backup-debug output.