diff options
author | Wayne Davison <wayned@samba.org> | 2008-03-26 16:12:39 -0700 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2008-03-26 16:12:39 -0700 |
commit | 487cb526158d2b3882d88106536509635b18f546 (patch) | |
tree | 5211f9f8bd19d98ef8fd905b1d4a7eab79b615ab /hlink.c | |
parent | 9793bbb3646cbaa816d074dc925a4f4f7d40089f (diff) | |
download | rsync-487cb526158d2b3882d88106536509635b18f546.tar.gz rsync-487cb526158d2b3882d88106536509635b18f546.tar.bz2 rsync-487cb526158d2b3882d88106536509635b18f546.zip |
Fixed the discovery of a prior finished hard-link when the entry
is old enough that it is no longer in the flist data.
Diffstat (limited to 'hlink.c')
-rw-r--r-- | hlink.c | 32 |
1 files changed, 14 insertions, 18 deletions
@@ -249,17 +249,13 @@ static char *check_prior(struct file_struct *file, int gnum, int *prev_ndx_p, struct file_list **flist_p) { struct file_struct *fp; - struct file_list *flist; struct ht_int32_node *node; int prev_ndx = F_HL_PREV(file); while (1) { - if (prev_ndx < 0) { - *prev_ndx_p = prev_ndx; - *flist_p = NULL; - return NULL; - } - if ((flist = flist_for_ndx(prev_ndx)) == NULL) + struct file_list *flist; + if (prev_ndx < 0 + || (flist = flist_for_ndx(prev_ndx)) == NULL) break; fp = flist->files[prev_ndx - flist->ndx_start]; if (!(fp->flags & FLAG_SKIP_HLINK)) { @@ -270,20 +266,20 @@ static char *check_prior(struct file_struct *file, int gnum, F_HL_PREV(file) = prev_ndx = F_HL_PREV(fp); } - node = hashtable_find(prior_hlinks, gnum, 0); - assert(node != NULL && node->data); - - if (CVAL(node->data, 0) == 0) { + if ((node = hashtable_find(prior_hlinks, gnum, 0)) != NULL) { + assert(node->data != NULL); + if (CVAL(node->data, 0) != 0) { + *prev_ndx_p = -1; + *flist_p = NULL; + return node->data; + } /* The prior file must have been skipped. */ - F_HL_PREV(file) = prev_ndx = -1; - *prev_ndx_p = prev_ndx; - *flist_p = NULL; - return NULL; + F_HL_PREV(file) = -1; } - *prev_ndx_p = prev_ndx; - *flist_p = flist; - return node->data; + *prev_ndx_p = -1; + *flist_p = NULL; + return NULL; } /* Only called if FLAG_HLINKED is set and FLAG_HLINK_FIRST is not. Returns: |