From 541b23d144e655036b6c3f2cbb7c4aec2f4c599e Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Thu, 15 Dec 2005 23:00:02 +0000 Subject: [PATCH] When compare-dest/link-dest/copy-dest are in effect, we now check if the file we're about to hard-link to the leader is present in one of the dest dirs -- if it is, we adjust the text we output accordingly. --- hlink.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/hlink.c b/hlink.c index 5c4cec04..1669da16 100644 --- a/hlink.c +++ b/hlink.c @@ -22,8 +22,10 @@ extern int dry_run; extern int verbose; +extern int link_dest; extern int make_backups; extern int log_format_has_i; +extern char *basis_dir[]; extern struct file_list *the_file_list; #ifdef SUPPORT_HARD_LINKS @@ -184,13 +186,38 @@ int hard_link_check(struct file_struct *file, int ndx, char *fname, safe_fname(f_name(file))); } if (head_file->F_HLINDEX == FINISHED_LINK) { - STRUCT_STAT st2; + STRUCT_STAT st2, st3; char *toname = f_name(head_file); if (link_stat(toname, &st2, 0) < 0) { rsyserr(FERROR, errno, "stat %s failed", full_fname(toname)); return -1; } + if (statret < 0 && basis_dir[0] != NULL) { + char cmpbuf[MAXPATHLEN]; + int j = 0; + do { + pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname); + if (link_stat(cmpbuf, &st3, 0) < 0) + continue; + if (link_dest) { + if (st2.st_dev != st3.st_dev + || st2.st_ino != st3.st_ino) + continue; + statret = 1; + st = &st3; + if (verbose < 2 || !log_format_has_i) + itemizing = code = 0; + break; + } + if (!unchanged_file(cmpbuf, file, &st3)) + continue; + statret = 1; + st = &st3; + if (unchanged_attrs(file, &st3)) + break; + } while (basis_dir[++j] != NULL); + } maybe_hard_link(file, ndx, fname, statret, st, toname, &st2, itemizing, code); file->F_HLINDEX = FINISHED_LINK; -- 2.34.1