(moved from hard_link_cluster()) that checks the inode/dev of an
existing file and either does nothing (when properly linked), or
removes the existing file before calling hard_link_one().
- Changed hard_link_check() so that it checks if the master item is
marked with FINISHED_LINK (in its hlindex int), and if so, it
finishes the current file by calling maybe_hard_link() (and
marking it as finished too). Otherwise it marks the item as
skipped by setting hlindex to SKIPPED_LINK.
- Fixed the outputting of an error in hard_link_one() so that the
message is always output when the caller did not request "terse"
processing.
- Changed hard_link_cluster() so that it marks the master item with
FINISHED_LINK and then links only the skipped items (marking them
with FINISHED_LINK too).
when sending a single file.
- Made a couple variable improvements in link_idev_data().
- Got rid of the non-NULL check of hlink_list in init_hard_links()
because is enough to just check file->link_u.links these days.
pointers.
- Made hard_link_one() non-static so that the generator can call it.
Improved it to do itemized output.
- Replaced do_hard_links() with hard_link_cluster(), which changes
the hard-linking from a post-transfer loop into a per-cluster
operation that occurs incrementally as the transfer updates (or
finds unchanged) one item in the cluster.
- The realloc in init_hard_links() might fail if the list is empty
(which can happen if there are no regular files in the transfer).
I changed the code to free the list in that case.
files up to 2^64 bytes in size. Now I just need to find enough disk
space to test this :-)
The 64 bit offset code only works if off_t is 64 bits (or bigger!) on
both ends of the link. If one end tries to send a file greater than
2^31 in size and the other end doesn't support it then rsync will
abort.
This commit also cleans up some static declarations so they are in a
unitinitialised segment to save load time.
in 3 ways:
1) the realloc is done on a list of pointers, not a list of structures
2) only the basename of the file is now kept in the file struct an a
util function f_name() is now used to access the full name when
required.
3) pointers to directory names are re-used
hopefully I haven't broken anything. This will need lots of testing.