summaryrefslogtreecommitdiff
path: root/hlink.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2008-03-26 16:12:39 -0700
committerWayne Davison <wayned@samba.org>2008-03-26 16:12:39 -0700
commit487cb526158d2b3882d88106536509635b18f546 (patch)
tree5211f9f8bd19d98ef8fd905b1d4a7eab79b615ab /hlink.c
parent9793bbb3646cbaa816d074dc925a4f4f7d40089f (diff)
downloadrsync-487cb526158d2b3882d88106536509635b18f546.tar.gz
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.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/hlink.c b/hlink.c
index 536b571f..812c55f7 100644
--- a/hlink.c
+++ b/hlink.c
@@ -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: