+
+ if (DEBUG_GTE(HLINK, 2)) {
+ rprintf(FINFO, "hlink for %d (%s,%d): leader is %d (%s)\n",
+ ndx, f_name(file, NULL), gnum, prev_ndx, prev_name);
+ }
+
+ if (link_stat(prev_name, &prev_st, 0) < 0) {
+ if (!dry_run || errno != ENOENT) {
+ rsyserr(FERROR_XFER, errno, "stat %s failed", full_fname(prev_name));
+ return -1;
+ }
+ /* A new hard-link will get a new dev & inode, so approximate
+ * those values in dry-run mode by zeroing them. */
+ memset(&prev_st, 0, sizeof prev_st);
+ }
+
+ if (statret < 0 && basis_dir[0] != NULL) {
+ /* If we match an alt-dest item, we don't output this as a change. */
+ char cmpbuf[MAXPATHLEN];
+ stat_x alt_sx;
+ int j = 0;
+ init_stat_x(&alt_sx);
+ do {
+ pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
+ if (link_stat(cmpbuf, &alt_sx.st, 0) < 0)
+ continue;
+ if (link_dest) {
+ if (prev_st.st_dev != alt_sx.st.st_dev
+ || prev_st.st_ino != alt_sx.st.st_ino)
+ continue;
+ statret = 1;
+ if (stdout_format_has_i == 0
+ || (!INFO_GTE(NAME, 2) && stdout_format_has_i < 2)) {
+ itemizing = 0;
+ code = FNONE;
+ if (INFO_GTE(NAME, 2) && maybe_ATTRS_REPORT)
+ rprintf(FCLIENT, "%s is uptodate\n", fname);
+ }
+ break;
+ }
+ if (!unchanged_file(cmpbuf, file, &alt_sx.st))
+ continue;
+ statret = 1;
+ if (unchanged_attrs(cmpbuf, file, &alt_sx))
+ break;
+ } while (basis_dir[++j] != NULL);
+ if (statret == 1) {
+ sxp->st = alt_sx.st;
+#ifdef SUPPORT_ACLS
+ if (preserve_acls && !S_ISLNK(file->mode)) {
+ free_acl(sxp);
+ if (!ACL_READY(alt_sx))
+ get_acl(cmpbuf, sxp);
+ else {
+ sxp->acc_acl = alt_sx.acc_acl;
+ sxp->def_acl = alt_sx.def_acl;
+ alt_sx.acc_acl = alt_sx.def_acl = NULL;
+ }
+ }