Got rid of the (unneeded) ./prepare_source instructions.
[rsync/rsync-patches.git] / acls.diff
index 937f793..94a7cd0 100644 (file)
--- a/acls.diff
+++ b/acls.diff
@@ -9,7 +9,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 
 --- old/Makefile.in
 +++ new/Makefile.in
 
 --- old/Makefile.in
 +++ new/Makefile.in
-@@ -25,15 +25,15 @@ VERSION=@VERSION@
+@@ -26,15 +26,15 @@ VERSION=@VERSION@
  .SUFFIXES:
  .SUFFIXES: .c .o
  
  .SUFFIXES:
  .SUFFIXES: .c .o
  
@@ -1218,7 +1218,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                        robust_unlink(fname); /* Just in case... */
 --- old/configure.in
 +++ new/configure.in
                        robust_unlink(fname); /* Just in case... */
 --- old/configure.in
 +++ new/configure.in
-@@ -482,6 +482,11 @@ if test x"$ac_cv_func_strcasecmp" = x"no
+@@ -515,6 +515,11 @@ if test x"$ac_cv_func_strcasecmp" = x"no
      AC_CHECK_LIB(resolv, strcasecmp)
  fi
  
      AC_CHECK_LIB(resolv, strcasecmp)
  fi
  
@@ -1230,7 +1230,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  dnl At the moment we don't test for a broken memcmp(), because all we
  dnl need to do is test for equality, not comparison, and it seems that
  dnl every platform has a memcmp that can do at least that.
  dnl At the moment we don't test for a broken memcmp(), because all we
  dnl need to do is test for equality, not comparison, and it seems that
  dnl every platform has a memcmp that can do at least that.
-@@ -746,6 +751,78 @@ AC_SUBST(OBJ_RESTORE)
+@@ -779,6 +784,78 @@ AC_SUBST(OBJ_RESTORE)
  AC_SUBST(CC_SHOBJ_FLAG)
  AC_SUBST(BUILD_POPT)
  
  AC_SUBST(CC_SHOBJ_FLAG)
  AC_SUBST(BUILD_POPT)
  
@@ -1366,7 +1366,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
        file->modtime = modtime;
        file->length = file_length;
  
        file->modtime = modtime;
        file->length = file_length;
-@@ -693,6 +713,11 @@ static struct file_struct *receive_file_
+@@ -695,6 +715,11 @@ static struct file_struct *receive_file_
                read_buf(f, sum, checksum_len);
        }
  
                read_buf(f, sum, checksum_len);
        }
  
@@ -1378,7 +1378,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
        return file;
  }
  
        return file;
  }
  
-@@ -942,6 +967,9 @@ static struct file_struct *send_file_nam
+@@ -944,6 +969,9 @@ static struct file_struct *send_file_nam
                                          unsigned short flags)
  {
        struct file_struct *file;
                                          unsigned short flags)
  {
        struct file_struct *file;
@@ -1388,7 +1388,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
        file = make_file(fname, flist, stp, flags,
                         f == -2 ? SERVER_FILTERS : ALL_FILTERS);
  
        file = make_file(fname, flist, stp, flags,
                         f == -2 ? SERVER_FILTERS : ALL_FILTERS);
-@@ -951,6 +979,15 @@ static struct file_struct *send_file_nam
+@@ -953,6 +981,15 @@ static struct file_struct *send_file_nam
        if (chmod_modes && !S_ISLNK(file->mode))
                file->mode = tweak_mode(file->mode, chmod_modes);
  
        if (chmod_modes && !S_ISLNK(file->mode))
                file->mode = tweak_mode(file->mode, chmod_modes);
  
@@ -1404,7 +1404,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
        maybe_emit_filelist_progress(flist->count + flist_count_offset);
  
        flist_expand(flist);
        maybe_emit_filelist_progress(flist->count + flist_count_offset);
  
        flist_expand(flist);
-@@ -958,6 +995,15 @@ static struct file_struct *send_file_nam
+@@ -960,6 +997,15 @@ static struct file_struct *send_file_nam
        if (file->basename[0]) {
                flist->files[flist->count++] = file;
                send_file_entry(file, f);
        if (file->basename[0]) {
                flist->files[flist->count++] = file;
                send_file_entry(file, f);
@@ -1430,7 +1430,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  extern int preserve_links;
  extern int preserve_devices;
  extern int preserve_specials;
  extern int preserve_links;
  extern int preserve_devices;
  extern int preserve_specials;
-@@ -84,6 +85,7 @@ extern long block_size; /* "long" becaus
+@@ -85,6 +86,7 @@ extern long block_size; /* "long" becaus
  extern int max_delete;
  extern int force_delete;
  extern int one_file_system;
  extern int max_delete;
  extern int force_delete;
  extern int one_file_system;
@@ -1438,7 +1438,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  extern struct stats stats;
  extern dev_t filesystem_dev;
  extern char *backup_dir;
  extern struct stats stats;
  extern dev_t filesystem_dev;
  extern char *backup_dir;
-@@ -316,22 +318,27 @@ static void do_delete_pass(struct file_l
+@@ -317,22 +319,27 @@ static void do_delete_pass(struct file_l
                rprintf(FINFO, "                    \r");
  }
  
                rprintf(FINFO, "                    \r");
  }
  
@@ -1471,7 +1471,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
             int32 iflags, uchar fnamecmp_type, char *xname)
  {
        if (statret >= 0) { /* A from-dest-dir statret can == 1! */
             int32 iflags, uchar fnamecmp_type, char *xname)
  {
        if (statret >= 0) { /* A from-dest-dir statret can == 1! */
-@@ -339,19 +346,23 @@ void itemize(struct file_struct *file, i
+@@ -340,19 +347,23 @@ void itemize(struct file_struct *file, i
                    : S_ISDIR(file->mode) ? !omit_dir_times
                    : !S_ISLNK(file->mode);
  
                    : S_ISDIR(file->mode) ? !omit_dir_times
                    : !S_ISLNK(file->mode);
  
@@ -1500,7 +1500,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
        } else
                iflags |= ITEM_IS_NEW;
  
        } else
                iflags |= ITEM_IS_NEW;
  
-@@ -604,7 +615,7 @@ void check_for_finished_hlinks(int itemi
+@@ -605,7 +616,7 @@ void check_for_finished_hlinks(int itemi
   * handling the file, -1 if no dest-linking occurred, or a non-negative
   * value if we found an alternate basis file. */
  static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
   * handling the file, -1 if no dest-linking occurred, or a non-negative
   * value if we found an alternate basis file. */
  static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
@@ -1508,8 +1508,8 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +                       char *cmpbuf, statx *sxp, int itemizing,
                         int maybe_ATTRS_REPORT, enum logcode code)
  {
 +                       char *cmpbuf, statx *sxp, int itemizing,
                         int maybe_ATTRS_REPORT, enum logcode code)
  {
-       int save_ignore_times = ignore_times;
-@@ -618,7 +629,7 @@ static int try_dests_reg(struct file_str
+       int best_match = -1;
+@@ -614,7 +625,7 @@ static int try_dests_reg(struct file_str
  
        do {
                pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
  
        do {
                pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
@@ -1518,7 +1518,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                        continue;
                switch (match_level) {
                case 0:
                        continue;
                switch (match_level) {
                case 0:
-@@ -626,16 +637,20 @@ static int try_dests_reg(struct file_str
+@@ -622,16 +633,20 @@ static int try_dests_reg(struct file_str
                        match_level = 1;
                        /* FALL THROUGH */
                case 1:
                        match_level = 1;
                        /* FALL THROUGH */
                case 1:
@@ -1542,7 +1542,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                continue;
                        best_match = j;
                        match_level = 3;
                                continue;
                        best_match = j;
                        match_level = 3;
-@@ -652,14 +667,14 @@ static int try_dests_reg(struct file_str
+@@ -646,14 +661,14 @@ static int try_dests_reg(struct file_str
        if (j != best_match) {
                j = best_match;
                pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
        if (j != best_match) {
                j = best_match;
                pathjoin(cmpbuf, MAXPATHLEN, basis_dir[j], fname);
@@ -1559,8 +1559,8 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                          cmpbuf, 1,
                                          itemizing && verbose > 1,
                                          code) < 0)
                                          cmpbuf, 1,
                                          itemizing && verbose > 1,
                                          code) < 0)
-@@ -668,8 +683,13 @@ static int try_dests_reg(struct file_str
-                               hard_link_cluster(file, ndx, itemizing, code);
+@@ -665,8 +680,13 @@ static int try_dests_reg(struct file_str
+                       }
                } else
  #endif
 -              if (itemizing)
                } else
  #endif
 -              if (itemizing)
@@ -1575,7 +1575,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                if (verbose > 1 && maybe_ATTRS_REPORT) {
                        rprintf(FCLIENT, "%s is uptodate\n", fname);
                }
                if (verbose > 1 && maybe_ATTRS_REPORT) {
                        rprintf(FCLIENT, "%s is uptodate\n", fname);
                }
-@@ -685,8 +705,13 @@ static int try_dests_reg(struct file_str
+@@ -682,8 +702,13 @@ static int try_dests_reg(struct file_str
                        }
                        return -1;
                }
                        }
                        return -1;
                }
@@ -1591,7 +1591,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                set_file_attrs(fname, file, NULL, 0);
                if (maybe_ATTRS_REPORT
                 && ((!itemizing && verbose && match_level == 2)
                set_file_attrs(fname, file, NULL, 0);
                if (maybe_ATTRS_REPORT
                 && ((!itemizing && verbose && match_level == 2)
-@@ -710,13 +735,18 @@ static int try_dests_non(struct file_str
+@@ -707,13 +732,18 @@ static int try_dests_non(struct file_str
                         enum logcode code)
  {
        char fnamebuf[MAXPATHLEN];
                         enum logcode code)
  {
        char fnamebuf[MAXPATHLEN];
@@ -1613,7 +1613,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                        continue;
                if (S_ISLNK(file->mode)) {
  #ifdef SUPPORT_LINKS
                        continue;
                if (S_ISLNK(file->mode)) {
  #ifdef SUPPORT_LINKS
-@@ -729,10 +759,10 @@ static int try_dests_non(struct file_str
+@@ -726,10 +756,10 @@ static int try_dests_non(struct file_str
  #endif
                                continue;
                } else if (IS_SPECIAL(file->mode)) {
  #endif
                                continue;
                } else if (IS_SPECIAL(file->mode)) {
@@ -1626,7 +1626,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                continue;
                } else {
                        rprintf(FERROR,
                                continue;
                } else {
                        rprintf(FERROR,
-@@ -763,7 +793,15 @@ static int try_dests_non(struct file_str
+@@ -760,7 +790,15 @@ static int try_dests_non(struct file_str
                        int changes = compare_dest ? 0 : ITEM_LOCAL_CHANGE
                                    + (link_dest ? ITEM_XNAME_FOLLOWS : 0);
                        char *lp = link_dest ? "" : NULL;
                        int changes = compare_dest ? 0 : ITEM_LOCAL_CHANGE
                                    + (link_dest ? ITEM_XNAME_FOLLOWS : 0);
                        char *lp = link_dest ? "" : NULL;
@@ -1643,7 +1643,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                }
                if (verbose > 1 && maybe_ATTRS_REPORT) {
                        rprintf(FCLIENT, "%s is uptodate\n", fname);
                }
                if (verbose > 1 && maybe_ATTRS_REPORT) {
                        rprintf(FCLIENT, "%s is uptodate\n", fname);
-@@ -775,6 +813,7 @@ static int try_dests_non(struct file_str
+@@ -772,6 +810,7 @@ static int try_dests_non(struct file_str
  }
  
  static int phase = 0;
  }
  
  static int phase = 0;
@@ -1651,7 +1651,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
  /* Acts on the_file_list->file's ndx'th item, whose name is fname.  If a dir,
   * make sure it exists, and has the right permissions/timestamp info.  For
  
  /* Acts on the_file_list->file's ndx'th item, whose name is fname.  If a dir,
   * make sure it exists, and has the right permissions/timestamp info.  For
-@@ -796,7 +835,8 @@ static void recv_generator(char *fname, 
+@@ -793,7 +832,8 @@ static void recv_generator(char *fname, 
        static int need_fuzzy_dirlist = 0;
        struct file_struct *fuzzy_file = NULL;
        int fd = -1, f_copy = -1;
        static int need_fuzzy_dirlist = 0;
        struct file_struct *fuzzy_file = NULL;
        int fd = -1, f_copy = -1;
@@ -1661,7 +1661,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
        struct file_struct *back_file = NULL;
        int statret, real_ret, stat_errno;
        char *fnamecmp, *partialptr, *backupptr = NULL;
        struct file_struct *back_file = NULL;
        int statret, real_ret, stat_errno;
        char *fnamecmp, *partialptr, *backupptr = NULL;
-@@ -852,6 +892,9 @@ static void recv_generator(char *fname, 
+@@ -849,6 +889,9 @@ static void recv_generator(char *fname, 
                } else if (!dry_run)
                        return;
        }
                } else if (!dry_run)
                        return;
        }
@@ -1671,16 +1671,16 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
        if (dry_run > 1) {
                statret = -1;
                stat_errno = ENOENT;
        if (dry_run > 1) {
                statret = -1;
                stat_errno = ENOENT;
-@@ -859,7 +902,7 @@ static void recv_generator(char *fname, 
+@@ -856,7 +899,7 @@ static void recv_generator(char *fname, 
                char *dn = file->dirname ? file->dirname : ".";
                if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) {
                        if (relative_paths && !implied_dirs
                char *dn = file->dirname ? file->dirname : ".";
                if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) {
                        if (relative_paths && !implied_dirs
--                       && safe_stat(dn, &st) < 0
-+                       && safe_stat(dn, &sx.st) < 0
+-                       && do_stat(dn, &st) < 0
++                       && do_stat(dn, &sx.st) < 0
                         && create_directory_path(fname) < 0) {
                                rsyserr(FERROR, errno,
                                        "recv_generator: mkdir %s failed",
                         && create_directory_path(fname) < 0) {
                                rsyserr(FERROR, errno,
                                        "recv_generator: mkdir %s failed",
-@@ -871,6 +914,10 @@ static void recv_generator(char *fname, 
+@@ -868,6 +911,10 @@ static void recv_generator(char *fname, 
                        }
                        if (fuzzy_basis)
                                need_fuzzy_dirlist = 1;
                        }
                        if (fuzzy_basis)
                                need_fuzzy_dirlist = 1;
@@ -1691,7 +1691,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                }
                parent_dirname = dn;
  
                }
                parent_dirname = dn;
  
-@@ -879,7 +926,7 @@ static void recv_generator(char *fname, 
+@@ -876,7 +923,7 @@ static void recv_generator(char *fname, 
                        need_fuzzy_dirlist = 0;
                }
  
                        need_fuzzy_dirlist = 0;
                }
  
@@ -1700,7 +1700,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                    keep_dirlinks && S_ISDIR(file->mode));
                stat_errno = errno;
        }
                                    keep_dirlinks && S_ISDIR(file->mode));
                stat_errno = errno;
        }
-@@ -897,8 +944,9 @@ static void recv_generator(char *fname, 
+@@ -894,8 +941,9 @@ static void recv_generator(char *fname, 
         * mode based on the local permissions and some heuristics. */
        if (!preserve_perms) {
                int exists = statret == 0
         * mode based on the local permissions and some heuristics. */
        if (!preserve_perms) {
                int exists = statret == 0
@@ -1712,7 +1712,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
        }
  
        if (S_ISDIR(file->mode)) {
        }
  
        if (S_ISDIR(file->mode)) {
-@@ -907,8 +955,8 @@ static void recv_generator(char *fname, 
+@@ -904,8 +952,8 @@ static void recv_generator(char *fname, 
                 * file of that name and it is *not* a directory, then
                 * we need to delete it.  If it doesn't exist, then
                 * (perhaps recursively) create it. */
                 * file of that name and it is *not* a directory, then
                 * we need to delete it.  If it doesn't exist, then
                 * (perhaps recursively) create it. */
@@ -1723,26 +1723,26 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                return;
                        statret = -1;
                }
                                return;
                        statret = -1;
                }
-@@ -917,7 +965,11 @@ static void recv_generator(char *fname, 
-                       dry_run++;
-               }
-               if (itemizing && f_out != -1) {
--                      itemize(file, ndx, statret, &st,
+@@ -920,7 +968,11 @@ static void recv_generator(char *fname, 
+                                       sr = -1;
+                               new_root_dir = 0;
+                       }
+-                      itemize(file, ndx, sr, &st,
 +#ifdef SUPPORT_ACLS
 +#ifdef SUPPORT_ACLS
-+                      if (preserve_acls && statret == 0)
++                      if (preserve_acls && sr == 0)
 +                              get_acl(fname, &sx);
 +#endif
 +                              get_acl(fname, &sx);
 +#endif
-+                      itemize(file, ndx, statret, &sx,
-                               statret ? ITEM_LOCAL_CHANGE : 0, 0, NULL);
++                      itemize(file, ndx, sr, &sx,
+                               sr ? ITEM_LOCAL_CHANGE : 0, 0, NULL);
                }
                if (statret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) {
                }
                if (statret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) {
-@@ -937,19 +989,19 @@ static void recv_generator(char *fname, 
+@@ -940,19 +992,19 @@ static void recv_generator(char *fname, 
                                return;
                        }
                }
 -              if (set_file_attrs(fname, file, statret ? NULL : &st, 0)
 +              if (set_file_attrs(fname, file, statret ? NULL : &sx, 0)
                                return;
                        }
                }
 -              if (set_file_attrs(fname, file, statret ? NULL : &st, 0)
 +              if (set_file_attrs(fname, file, statret ? NULL : &sx, 0)
-                   && verbose && code && f_out != -1)
+                   && verbose && code != FNONE && f_out != -1)
                        rprintf(code, "%s/\n", fname);
                if (delete_during && f_out != -1 && !phase && dry_run < 2
                    && (file->flags & FLAG_DEL_HERE))
                        rprintf(code, "%s/\n", fname);
                if (delete_during && f_out != -1 && !phase && dry_run < 2
                    && (file->flags & FLAG_DEL_HERE))
@@ -1761,7 +1761,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
        if (preserve_links && S_ISLNK(file->mode)) {
  #ifdef SUPPORT_LINKS
  
        if (preserve_links && S_ISLNK(file->mode)) {
  #ifdef SUPPORT_LINKS
-@@ -967,7 +1019,7 @@ static void recv_generator(char *fname, 
+@@ -970,7 +1022,7 @@ static void recv_generator(char *fname, 
                        char lnk[MAXPATHLEN];
                        int len;
  
                        char lnk[MAXPATHLEN];
                        int len;
  
@@ -1770,7 +1770,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                            && (len = readlink(fname, lnk, MAXPATHLEN-1)) > 0) {
                                lnk[len] = 0;
                                /* A link already pointing to the
                            && (len = readlink(fname, lnk, MAXPATHLEN-1)) > 0) {
                                lnk[len] = 0;
                                /* A link already pointing to the
-@@ -975,10 +1027,10 @@ static void recv_generator(char *fname, 
+@@ -978,10 +1030,10 @@ static void recv_generator(char *fname, 
                                 * required. */
                                if (strcmp(lnk, file->u.link) == 0) {
                                        if (itemizing) {
                                 * required. */
                                if (strcmp(lnk, file->u.link) == 0) {
                                        if (itemizing) {
@@ -1783,7 +1783,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                                       maybe_ATTRS_REPORT);
                                        if (preserve_hard_links
                                            && file->link_u.links) {
                                                       maybe_ATTRS_REPORT);
                                        if (preserve_hard_links
                                            && file->link_u.links) {
-@@ -991,9 +1043,9 @@ static void recv_generator(char *fname, 
+@@ -996,9 +1048,9 @@ static void recv_generator(char *fname, 
                        }
                        /* Not the right symlink (or not a symlink), so
                         * delete it. */
                        }
                        /* Not the right symlink (or not a symlink), so
                         * delete it. */
@@ -1795,7 +1795,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                statret = -1;
                } else if (basis_dir[0] != NULL) {
                        if (try_dests_non(file, fname, ndx, itemizing,
                                statret = -1;
                } else if (basis_dir[0] != NULL) {
                        if (try_dests_non(file, fname, ndx, itemizing,
-@@ -1009,7 +1061,7 @@ static void recv_generator(char *fname, 
+@@ -1015,7 +1067,7 @@ static void recv_generator(char *fname, 
                        }
                }
                if (preserve_hard_links && file->link_u.links
                        }
                }
                if (preserve_hard_links && file->link_u.links
@@ -1804,7 +1804,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                       itemizing, code, HL_SKIP))
                        return;
                if (do_symlink(file->u.link,fname) != 0) {
                                       itemizing, code, HL_SKIP))
                        return;
                if (do_symlink(file->u.link,fname) != 0) {
-@@ -1018,7 +1070,7 @@ static void recv_generator(char *fname, 
+@@ -1024,7 +1076,7 @@ static void recv_generator(char *fname, 
                } else {
                        set_file_attrs(fname, file, NULL, 0);
                        if (itemizing) {
                } else {
                        set_file_attrs(fname, file, NULL, 0);
                        if (itemizing) {
@@ -1812,9 +1812,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +                              itemize(file, ndx, statret, &sx,
                                        ITEM_LOCAL_CHANGE, 0, NULL);
                        }
 +                              itemize(file, ndx, statret, &sx,
                                        ITEM_LOCAL_CHANGE, 0, NULL);
                        }
-                       if (code && verbose) {
-@@ -1052,18 +1104,22 @@ static void recv_generator(char *fname, 
-                               itemizing = code = 0;
+                       if (code != FNONE && verbose) {
+@@ -1056,18 +1108,22 @@ static void recv_generator(char *fname, 
+                               code = FNONE;
                        }
                }
 +#ifdef SUPPORT_ACLS
                        }
                }
 +#ifdef SUPPORT_ACLS
@@ -1844,7 +1844,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                statret = -1;
                        if (verbose > 2) {
                                rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",
                                statret = -1;
                        if (verbose > 2) {
                                rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",
-@@ -1076,7 +1132,7 @@ static void recv_generator(char *fname, 
+@@ -1080,7 +1136,7 @@ static void recv_generator(char *fname, 
                        } else {
                                set_file_attrs(fname, file, NULL, 0);
                                if (itemizing) {
                        } else {
                                set_file_attrs(fname, file, NULL, 0);
                                if (itemizing) {
@@ -1852,8 +1852,8 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +                                      itemize(file, ndx, statret, &sx,
                                                ITEM_LOCAL_CHANGE, 0, NULL);
                                }
 +                                      itemize(file, ndx, statret, &sx,
                                                ITEM_LOCAL_CHANGE, 0, NULL);
                                }
-                               if (code && verbose)
-@@ -1088,12 +1144,12 @@ static void recv_generator(char *fname, 
+                               if (code != FNONE && verbose)
+@@ -1094,14 +1150,14 @@ static void recv_generator(char *fname, 
                        }
                } else {
                        if (itemizing)
                        }
                } else {
                        if (itemizing)
@@ -1863,13 +1863,15 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +                      set_file_attrs(fname, file, &sx, maybe_ATTRS_REPORT);
                        if (preserve_hard_links && file->link_u.links)
                                hard_link_cluster(file, ndx, itemizing, code);
 +                      set_file_attrs(fname, file, &sx, maybe_ATTRS_REPORT);
                        if (preserve_hard_links && file->link_u.links)
                                hard_link_cluster(file, ndx, itemizing, code);
+                       if (remove_source_files == 1)
+                               goto return_with_success;
                }
 -              return;
 +              goto cleanup;
        }
  
        if (!S_ISREG(file->mode)) {
                }
 -              return;
 +              goto cleanup;
        }
  
        if (!S_ISREG(file->mode)) {
-@@ -1127,7 +1183,7 @@ static void recv_generator(char *fname, 
+@@ -1135,7 +1191,7 @@ static void recv_generator(char *fname, 
        }
  
        if (update_only && statret == 0
        }
  
        if (update_only && statret == 0
@@ -1878,7 +1880,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                if (verbose > 1)
                        rprintf(FINFO, "%s is newer\n", fname);
                return;
                if (verbose > 1)
                        rprintf(FINFO, "%s is newer\n", fname);
                return;
-@@ -1136,18 +1192,18 @@ static void recv_generator(char *fname, 
+@@ -1144,20 +1200,20 @@ static void recv_generator(char *fname, 
        fnamecmp = fname;
        fnamecmp_type = FNAMECMP_FNAME;
  
        fnamecmp = fname;
        fnamecmp_type = FNAMECMP_FNAME;
  
@@ -1895,13 +1897,15 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 -              int j = try_dests_reg(file, fname, ndx, fnamecmpbuf, &st,
 +              int j = try_dests_reg(file, fname, ndx, fnamecmpbuf, &sx,
                                      itemizing, maybe_ATTRS_REPORT, code);
 -              int j = try_dests_reg(file, fname, ndx, fnamecmpbuf, &st,
 +              int j = try_dests_reg(file, fname, ndx, fnamecmpbuf, &sx,
                                      itemizing, maybe_ATTRS_REPORT, code);
-               if (j == -2)
+               if (j == -2) {
+                       if (remove_source_files == 1)
+                               goto return_with_success;
 -                      return;
 +                      goto cleanup;
 -                      return;
 +                      goto cleanup;
-               if (j != -1) {
+               }
+               if (j >= 0) {
                        fnamecmp = fnamecmpbuf;
                        fnamecmp = fnamecmpbuf;
-                       fnamecmp_type = j;
-@@ -1156,7 +1212,7 @@ static void recv_generator(char *fname, 
+@@ -1167,7 +1223,7 @@ static void recv_generator(char *fname, 
        }
  
        real_ret = statret;
        }
  
        real_ret = statret;
@@ -1910,7 +1914,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
        if (partial_dir && (partialptr = partial_dir_fname(fname)) != NULL
            && link_stat(partialptr, &partial_st, 0) == 0
  
        if (partial_dir && (partialptr = partial_dir_fname(fname)) != NULL
            && link_stat(partialptr, &partial_st, 0) == 0
-@@ -1175,7 +1231,7 @@ static void recv_generator(char *fname, 
+@@ -1186,7 +1242,7 @@ static void recv_generator(char *fname, 
                                rprintf(FINFO, "fuzzy basis selected for %s: %s\n",
                                        fname, fnamecmpbuf);
                        }
                                rprintf(FINFO, "fuzzy basis selected for %s: %s\n",
                                        fname, fnamecmpbuf);
                        }
@@ -1919,7 +1923,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                        statret = 0;
                        fnamecmp = fnamecmpbuf;
                        fnamecmp_type = FNAMECMP_FUZZY;
                        statret = 0;
                        fnamecmp = fnamecmpbuf;
                        fnamecmp_type = FNAMECMP_FUZZY;
-@@ -1184,7 +1240,7 @@ static void recv_generator(char *fname, 
+@@ -1195,7 +1251,7 @@ static void recv_generator(char *fname, 
  
        if (statret != 0) {
                if (preserve_hard_links && file->link_u.links
  
        if (statret != 0) {
                if (preserve_hard_links && file->link_u.links
@@ -1928,7 +1932,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                       itemizing, code, HL_SKIP))
                        return;
                if (stat_errno == ENOENT)
                                       itemizing, code, HL_SKIP))
                        return;
                if (stat_errno == ENOENT)
-@@ -1194,31 +1250,44 @@ static void recv_generator(char *fname, 
+@@ -1205,39 +1261,52 @@ static void recv_generator(char *fname, 
                return;
        }
  
                return;
        }
  
@@ -1968,6 +1972,15 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +              set_file_attrs(fname, file, &sx, maybe_ATTRS_REPORT);
                if (preserve_hard_links && file->link_u.links)
                        hard_link_cluster(file, ndx, itemizing, code);
 +              set_file_attrs(fname, file, &sx, maybe_ATTRS_REPORT);
                if (preserve_hard_links && file->link_u.links)
                        hard_link_cluster(file, ndx, itemizing, code);
+               if (remove_source_files != 1)
+-                      return;
++                      goto cleanup;
+         return_with_success:
+               if (!dry_run) {
+                       char numbuf[4];
+                       SIVAL(numbuf, 0, ndx);
+                       send_msg(MSG_SUCCESS, numbuf, 4);
+               }
 -              return;
 +              goto cleanup;
        }
 -              return;
 +              goto cleanup;
        }
@@ -1979,7 +1992,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                fnamecmp = partialptr;
                fnamecmp_type = FNAMECMP_PARTIAL_DIR;
                statret = 0;
                fnamecmp = partialptr;
                fnamecmp_type = FNAMECMP_PARTIAL_DIR;
                statret = 0;
-@@ -1242,17 +1311,21 @@ static void recv_generator(char *fname, 
+@@ -1261,17 +1330,21 @@ static void recv_generator(char *fname, 
          pretend_missing:
                /* pretend the file didn't exist */
                if (preserve_hard_links && file->link_u.links
          pretend_missing:
                /* pretend the file didn't exist */
                if (preserve_hard_links && file->link_u.links
@@ -2004,7 +2017,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                }
                if (!(back_file = make_file(fname, NULL, NULL, 0, NO_FILTERS))) {
                        close(fd);
                }
                if (!(back_file = make_file(fname, NULL, NULL, 0, NO_FILTERS))) {
                        close(fd);
-@@ -1263,7 +1336,7 @@ static void recv_generator(char *fname, 
+@@ -1282,7 +1355,7 @@ static void recv_generator(char *fname, 
                                full_fname(backupptr));
                        free(back_file);
                        close(fd);
                                full_fname(backupptr));
                        free(back_file);
                        close(fd);
@@ -2013,7 +2026,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                }
                if ((f_copy = do_open(backupptr,
                    O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600)) < 0) {
                }
                if ((f_copy = do_open(backupptr,
                    O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600)) < 0) {
-@@ -1271,14 +1344,14 @@ static void recv_generator(char *fname, 
+@@ -1290,14 +1363,14 @@ static void recv_generator(char *fname, 
                                full_fname(backupptr));
                        free(back_file);
                        close(fd);
                                full_fname(backupptr));
                        free(back_file);
                        close(fd);
@@ -2030,7 +2043,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
        }
  
        if (verbose > 2)
        }
  
        if (verbose > 2)
-@@ -1296,24 +1369,32 @@ static void recv_generator(char *fname, 
+@@ -1315,24 +1388,32 @@ static void recv_generator(char *fname, 
                        iflags |= ITEM_BASIS_TYPE_FOLLOWS;
                if (fnamecmp_type == FNAMECMP_FUZZY)
                        iflags |= ITEM_XNAME_FOLLOWS;
                        iflags |= ITEM_BASIS_TYPE_FOLLOWS;
                if (fnamecmp_type == FNAMECMP_FUZZY)
                        iflags |= ITEM_XNAME_FOLLOWS;
@@ -2068,7 +2081,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
        if (f_copy >= 0) {
                close(f_copy);
  
        if (f_copy >= 0) {
                close(f_copy);
-@@ -1326,6 +1407,13 @@ static void recv_generator(char *fname, 
+@@ -1345,6 +1426,13 @@ static void recv_generator(char *fname, 
        }
  
        close(fd);
        }
  
        close(fd);
@@ -2082,7 +2095,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  }
  
  void generate_files(int f_out, struct file_list *flist, char *local_name)
  }
  
  void generate_files(int f_out, struct file_list *flist, char *local_name)
-@@ -1385,6 +1473,8 @@ void generate_files(int f_out, struct fi
+@@ -1404,6 +1492,8 @@ void generate_files(int f_out, struct fi
         * notice that and let us know via the redo pipe (or its closing). */
        ignore_timeout = 1;
  
         * notice that and let us know via the redo pipe (or its closing). */
        ignore_timeout = 1;
  
@@ -2093,15 +2106,15 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
 --- old/hlink.c
 +++ new/hlink.c
  
 --- old/hlink.c
 +++ new/hlink.c
-@@ -25,6 +25,7 @@
+@@ -26,6 +26,7 @@
  extern int verbose;
  extern int verbose;
+ extern int do_xfers;
  extern int link_dest;
 +extern int preserve_acls;
  extern int make_backups;
  extern int link_dest;
 +extern int preserve_acls;
  extern int make_backups;
+ extern int remove_source_files;
  extern int stdout_format_has_i;
  extern int stdout_format_has_i;
- extern char *basis_dir[];
-@@ -143,15 +144,19 @@ void init_hard_links(void)
+@@ -145,15 +146,19 @@ void init_hard_links(void)
  
  #ifdef SUPPORT_HARD_LINKS
  static int maybe_hard_link(struct file_struct *file, int ndx,
  
  #ifdef SUPPORT_HARD_LINKS
  static int maybe_hard_link(struct file_struct *file, int ndx,
@@ -2125,7 +2138,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                                        ITEM_LOCAL_CHANGE | ITEM_XNAME_FOLLOWS,
                                        0, "");
                        }
                                        ITEM_LOCAL_CHANGE | ITEM_XNAME_FOLLOWS,
                                        0, "");
                        }
-@@ -166,13 +171,13 @@ static int maybe_hard_link(struct file_s
+@@ -168,13 +173,13 @@ static int maybe_hard_link(struct file_s
                        return -1;
                }
        }
                        return -1;
                }
        }
@@ -2141,16 +2154,16 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                    enum logcode code, int skip)
  {
  #ifdef SUPPORT_HARD_LINKS
                    enum logcode code, int skip)
  {
  #ifdef SUPPORT_HARD_LINKS
-@@ -207,7 +212,7 @@ int hard_link_check(struct file_struct *
+@@ -215,7 +220,7 @@ int hard_link_check(struct file_struct *
                                                 || st2.st_ino != st3.st_ino)
                                                        continue;
                                                statret = 1;
 -                                              st = &st3;
 +                                              sxp->st = st3;
                                                 || st2.st_ino != st3.st_ino)
                                                        continue;
                                                statret = 1;
 -                                              st = &st3;
 +                                              sxp->st = st3;
-                                               if (verbose < 2 || !stdout_format_has_i)
-                                                       itemizing = code = 0;
-                                               break;
-@@ -215,12 +220,16 @@ int hard_link_check(struct file_struct *
+                                               if (verbose < 2 || !stdout_format_has_i) {
+                                                       itemizing = 0;
+                                                       code = FNONE;
+@@ -225,12 +230,16 @@ int hard_link_check(struct file_struct *
                                        if (!unchanged_file(cmpbuf, file, &st3))
                                                continue;
                                        statret = 1;
                                        if (!unchanged_file(cmpbuf, file, &st3))
                                                continue;
                                        statret = 1;
@@ -2168,9 +2181,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 -                      maybe_hard_link(file, ndx, fname, statret, st,
 +                      maybe_hard_link(file, ndx, fname, statret, sxp,
                                        toname, &st2, itemizing, code);
 -                      maybe_hard_link(file, ndx, fname, statret, st,
 +                      maybe_hard_link(file, ndx, fname, statret, sxp,
                                        toname, &st2, itemizing, code);
-                       file->F_HLINDEX = FINISHED_LINK;
-               } else
-@@ -233,7 +242,7 @@ int hard_link_check(struct file_struct *
+                       if (remove_source_files == 1 && do_xfers) {
+                               char numbuf[4];
+@@ -248,7 +257,7 @@ int hard_link_check(struct file_struct *
  
  #ifdef SUPPORT_HARD_LINKS
  int hard_link_one(struct file_struct *file, int ndx, char *fname,
  
  #ifdef SUPPORT_HARD_LINKS
  int hard_link_one(struct file_struct *file, int ndx, char *fname,
@@ -2179,7 +2192,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                  int itemizing, enum logcode code)
  {
        if (do_link(toname, fname)) {
                  int itemizing, enum logcode code)
  {
        if (do_link(toname, fname)) {
-@@ -249,7 +258,11 @@ int hard_link_one(struct file_struct *fi
+@@ -264,7 +273,11 @@ int hard_link_one(struct file_struct *fi
        }
  
        if (itemizing) {
        }
  
        if (itemizing) {
@@ -2192,7 +2205,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                        ITEM_LOCAL_CHANGE | ITEM_XNAME_FOLLOWS, 0,
                        terse ? "" : toname);
        }
                        ITEM_LOCAL_CHANGE | ITEM_XNAME_FOLLOWS, 0,
                        terse ? "" : toname);
        }
-@@ -266,11 +279,12 @@ void hard_link_cluster(struct file_struc
+@@ -281,11 +294,12 @@ void hard_link_cluster(struct file_struc
  #ifdef SUPPORT_HARD_LINKS
        char hlink1[MAXPATHLEN];
        char *hlink2;
  #ifdef SUPPORT_HARD_LINKS
        char hlink1[MAXPATHLEN];
        char *hlink2;
@@ -2207,7 +2220,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                return;
        if (!(file->flags & FLAG_HLINK_TOL)) {
                while (!(file->flags & FLAG_HLINK_EOL)) {
                return;
        if (!(file->flags & FLAG_HLINK_TOL)) {
                while (!(file->flags & FLAG_HLINK_EOL)) {
-@@ -284,9 +298,13 @@ void hard_link_cluster(struct file_struc
+@@ -299,9 +313,13 @@ void hard_link_cluster(struct file_struc
                if (file->F_HLINDEX != SKIPPED_LINK)
                        continue;
                hlink2 = f_name(file, NULL);
                if (file->F_HLINDEX != SKIPPED_LINK)
                        continue;
                hlink2 = f_name(file, NULL);
@@ -2221,9 +2234,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +              if (preserve_acls)
 +                      free_acl(&sx);
 +#endif
 +              if (preserve_acls)
 +                      free_acl(&sx);
 +#endif
-               file->F_HLINDEX = FINISHED_LINK;
-       } while (!(file->flags & FLAG_HLINK_EOL));
- #endif
+               if (remove_source_files == 1 && do_xfers) {
+                       char numbuf[4];
+                       SIVAL(numbuf, 0, ndx);
 --- old/lib/sysacls.c
 +++ new/lib/sysacls.c
 @@ -0,0 +1,3240 @@
 --- old/lib/sysacls.c
 +++ new/lib/sysacls.c
 @@ -0,0 +1,3240 @@
@@ -5505,7 +5518,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +int sys_acl_free_qualifier(void *qual, SMB_ACL_TAG_T tagtype);
 --- old/log.c
 +++ new/log.c
 +int sys_acl_free_qualifier(void *qual, SMB_ACL_TAG_T tagtype);
 --- old/log.c
 +++ new/log.c
-@@ -582,8 +582,10 @@ static void log_formatted(enum logcode c
+@@ -615,8 +615,10 @@ static void log_formatted(enum logcode c
                        n[5] = !(iflags & ITEM_REPORT_PERMS) ? '.' : 'p';
                        n[6] = !(iflags & ITEM_REPORT_OWNER) ? '.' : 'o';
                        n[7] = !(iflags & ITEM_REPORT_GROUP) ? '.' : 'g';
                        n[5] = !(iflags & ITEM_REPORT_PERMS) ? '.' : 'p';
                        n[6] = !(iflags & ITEM_REPORT_OWNER) ? '.' : 'o';
                        n[7] = !(iflags & ITEM_REPORT_GROUP) ? '.' : 'g';
@@ -5518,17 +5531,6 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
                        if (iflags & (ITEM_IS_NEW|ITEM_MISSING_DATA)) {
                                char ch = iflags & ITEM_IS_NEW ? '+' : '?';
  
                        if (iflags & (ITEM_IS_NEW|ITEM_MISSING_DATA)) {
                                char ch = iflags & ITEM_IS_NEW ? '+' : '?';
---- old/mkproto.awk
-+++ new/mkproto.awk
-@@ -58,7 +58,7 @@ BEGIN {
-   next;
- }
--!/^OFF_T|^size_t|^off_t|^pid_t|^unsigned|^mode_t|^DIR|^user|^int|^char|^uint|^uchar|^short|^struct|^BOOL|^void|^time|^const|^RETSIGTYPE/ {
-+!/^OFF_T|^size_t|^off_t|^pid_t|^id_t|^unsigned|^mode_t|^DIR|^user|^int|^char|^uint|^uchar|^short|^struct|^BOOL|^void|^time|^const|^RETSIGTYPE/ {
-   next;
- }
 --- old/options.c
 +++ new/options.c
 @@ -47,6 +47,7 @@ int copy_dirlinks = 0;
 --- old/options.c
 +++ new/options.c
 @@ -47,6 +47,7 @@ int copy_dirlinks = 0;
@@ -5579,16 +5581,16 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
    rprintf(F,"     --no-OPTION             turn off an implied OPTION (e.g. --no-D)\n");
    rprintf(F," -r, --recursive             recurse into directories\n");
    rprintf(F," -R, --relative              use relative path names\n");
    rprintf(F,"     --no-OPTION             turn off an implied OPTION (e.g. --no-D)\n");
    rprintf(F," -r, --recursive             recurse into directories\n");
    rprintf(F," -R, --relative              use relative path names\n");
-@@ -303,6 +309,9 @@ void usage(enum logcode F)
-   rprintf(F," -H, --hard-links            preserve hard links\n");
+@@ -304,6 +310,9 @@ void usage(enum logcode F)
    rprintf(F," -p, --perms                 preserve permissions\n");
    rprintf(F," -E, --executability         preserve the file's executability\n");
    rprintf(F," -p, --perms                 preserve permissions\n");
    rprintf(F," -E, --executability         preserve the file's executability\n");
+   rprintf(F,"     --chmod=CHMOD           affect file and/or directory permissions\n");
 +#ifdef SUPPORT_ACLS
 +  rprintf(F," -A, --acls                  preserve ACLs (implies --perms)\n");
 +#endif
 +#ifdef SUPPORT_ACLS
 +  rprintf(F," -A, --acls                  preserve ACLs (implies --perms)\n");
 +#endif
-   rprintf(F,"     --chmod=CHMOD           change destination permissions\n");
    rprintf(F," -o, --owner                 preserve owner (super-user only)\n");
    rprintf(F," -g, --group                 preserve group\n");
    rprintf(F," -o, --owner                 preserve owner (super-user only)\n");
    rprintf(F," -g, --group                 preserve group\n");
+   rprintf(F,"     --devices               preserve device files (super-user only)\n");
 @@ -421,6 +430,9 @@ static struct poptOption long_options[] 
    {"no-perms",         0,  POPT_ARG_VAL,    &preserve_perms, 0, 0, 0 },
    {"no-p",             0,  POPT_ARG_VAL,    &preserve_perms, 0, 0, 0 },
 @@ -421,6 +430,9 @@ static struct poptOption long_options[] 
    {"no-perms",         0,  POPT_ARG_VAL,    &preserve_perms, 0, 0, 0 },
    {"no-p",             0,  POPT_ARG_VAL,    &preserve_perms, 0, 0, 0 },
@@ -5599,7 +5601,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
    {"times",           't', POPT_ARG_VAL,    &preserve_times, 1, 0, 0 },
    {"no-times",         0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
    {"no-t",             0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
    {"times",           't', POPT_ARG_VAL,    &preserve_times, 1, 0, 0 },
    {"no-times",         0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
    {"no-t",             0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
-@@ -1083,6 +1095,24 @@ int parse_arguments(int *argc, const cha
+@@ -1082,6 +1094,24 @@ int parse_arguments(int *argc, const cha
                        usage(FINFO);
                        exit_cleanup(0);
  
                        usage(FINFO);
                        exit_cleanup(0);
  
@@ -5624,7 +5626,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                default:
                        /* A large opt value means that set_refuse_options()
                         * turned this option off. */
                default:
                        /* A large opt value means that set_refuse_options()
                         * turned this option off. */
-@@ -1528,6 +1558,10 @@ void server_options(char **args,int *arg
+@@ -1523,6 +1553,10 @@ void server_options(char **args,int *arg
  
        if (preserve_hard_links)
                argstr[x++] = 'H';
  
        if (preserve_hard_links)
                argstr[x++] = 'H';
@@ -5645,7 +5647,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  extern struct stats stats;
  extern char *stdout_format;
  extern char *tmpdir;
  extern struct stats stats;
  extern char *stdout_format;
  extern char *tmpdir;
-@@ -347,6 +348,10 @@ int recv_files(int f_in, struct file_lis
+@@ -350,6 +351,10 @@ int recv_files(int f_in, struct file_lis
        int itemizing = am_server ? logfile_format_has_i : stdout_format_has_i;
        enum logcode log_code = log_before_transfer ? FLOG : FINFO;
        int max_phase = protocol_version >= 29 ? 2 : 1;
        int itemizing = am_server ? logfile_format_has_i : stdout_format_has_i;
        enum logcode log_code = log_before_transfer ? FLOG : FINFO;
        int max_phase = protocol_version >= 29 ? 2 : 1;
@@ -5656,7 +5658,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
        int i, recv_ok;
  
        if (verbose > 2)
        int i, recv_ok;
  
        if (verbose > 2)
-@@ -543,7 +548,16 @@ int recv_files(int f_in, struct file_lis
+@@ -553,7 +558,16 @@ int recv_files(int f_in, struct file_lis
                 * mode based on the local permissions and some heuristics. */
                if (!preserve_perms) {
                        int exists = fd1 != -1;
                 * mode based on the local permissions and some heuristics. */
                if (!preserve_perms) {
                        int exists = fd1 != -1;
@@ -5673,7 +5675,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +                                             dflt_perms, exists);
                }
  
 +                                             dflt_perms, exists);
                }
  
-               /* We now check to see if we are writing file "inplace" */
+               /* We now check to see if we are writing the file "inplace" */
 --- old/rsync.c
 +++ new/rsync.c
 @@ -32,6 +32,7 @@
 --- old/rsync.c
 +++ new/rsync.c
 @@ -32,6 +32,7 @@
@@ -5688,21 +5690,23 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
  /* This is only called when we aren't preserving permissions.  Figure out what
   * the permissions should be and return them merged back into the mode. */
  
  /* This is only called when we aren't preserving permissions.  Figure out what
   * the permissions should be and return them merged back into the mode. */
--mode_t dest_mode(mode_t flist_mode, mode_t cur_mode, int exists)
-+mode_t dest_mode(mode_t flist_mode, mode_t cur_mode, int dflt_perms,
+-mode_t dest_mode(mode_t flist_mode, mode_t stat_mode, int exists)
++mode_t dest_mode(mode_t flist_mode, mode_t stat_mode, int dflt_perms,
 +               int exists)
  {
 +               int exists)
  {
+       int new_mode;
        /* If the file already exists, we'll return the local permissions,
        /* If the file already exists, we'll return the local permissions,
-        * possibly tweaked by the --executability option. */
-@@ -115,55 +117,63 @@ mode_t dest_mode(mode_t flist_mode, mode
-                               cur_mode |= (cur_mode & 0444) >> 2;
+@@ -117,56 +119,65 @@ mode_t dest_mode(mode_t flist_mode, mode
+                               new_mode |= (new_mode & 0444) >> 2;
                }
                }
-       } else
--              cur_mode = flist_mode & ACCESSPERMS & ~orig_umask;
-+              cur_mode = flist_mode & ACCESSPERMS & dflt_perms;
-       if (daemon_chmod_modes && !S_ISLNK(flist_mode))
-               cur_mode = tweak_mode(cur_mode, daemon_chmod_modes);
-       return (flist_mode & ~CHMOD_BITS) | (cur_mode & CHMOD_BITS);
+       } else {
+-              /* Apply the umask and turn off special permissions. */
+-              new_mode = flist_mode & (~CHMOD_BITS | (ACCESSPERMS & ~orig_umask));
++              /* Apply destination default permissions and turn
++               * off special permissions. */
++              new_mode = flist_mode & (~CHMOD_BITS | dflt_perms);
+       }
+       return new_mode;
  }
  
 -int set_file_attrs(char *fname, struct file_struct *file, STRUCT_STAT *st,
  }
  
 -int set_file_attrs(char *fname, struct file_struct *file, STRUCT_STAT *st,
@@ -5713,6 +5717,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 -      STRUCT_STAT st2;
 +      statx sx2;
        int change_uid, change_gid;
 -      STRUCT_STAT st2;
 +      statx sx2;
        int change_uid, change_gid;
+       mode_t new_mode = file->mode;
  
 -      if (!st) {
 +      if (!sxp) {
  
 -      if (!st) {
 +      if (!sxp) {
@@ -5728,12 +5733,12 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +#ifdef SUPPORT_ACLS
 +              sx2.acc_acl = sx2.def_acl = NULL;
 +#endif
 +#ifdef SUPPORT_ACLS
 +              sx2.acc_acl = sx2.def_acl = NULL;
 +#endif
-               if (!preserve_perms && S_ISDIR(file->mode)
+               if (!preserve_perms && S_ISDIR(new_mode)
 -               && st->st_mode & S_ISGID) {
 +               && sx2.st.st_mode & S_ISGID) {
                        /* We just created this directory and its setgid
                         * bit is on, so make sure it stays on. */
 -               && st->st_mode & S_ISGID) {
 +               && sx2.st.st_mode & S_ISGID) {
                        /* We just created this directory and its setgid
                         * bit is on, so make sure it stays on. */
-                       file->mode |= S_ISGID;
+                       new_mode |= S_ISGID;
                }
 +              sxp = &sx2;
        }
                }
 +              sxp = &sx2;
        }
@@ -5772,7 +5777,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                ;
        else
  #endif
                ;
        else
  #endif
-@@ -173,43 +183,55 @@ int set_file_attrs(char *fname, struct f
+@@ -176,45 +187,57 @@ int set_file_attrs(char *fname, struct f
                                rprintf(FINFO,
                                        "set uid of %s from %ld to %ld\n",
                                        fname,
                                rprintf(FINFO,
                                        "set uid of %s from %ld to %ld\n",
                                        fname,
@@ -5813,6 +5818,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                updated = 1;
        }
  
                updated = 1;
        }
  
+       if (daemon_chmod_modes && !S_ISLNK(new_mode))
+               new_mode = tweak_mode(new_mode, daemon_chmod_modes);
++
 +#ifdef SUPPORT_ACLS
 +      /* It's OK to call set_acl() now, even for a dir, as the generator
 +       * will enable owner-writability using chmod, if necessary.
 +#ifdef SUPPORT_ACLS
 +      /* It's OK to call set_acl() now, even for a dir, as the generator
 +       * will enable owner-writability using chmod, if necessary.
@@ -5825,11 +5833,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +#endif
 +
  #ifdef HAVE_CHMOD
 +#endif
 +
  #ifdef HAVE_CHMOD
--      if ((st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS)) {
--              int ret = do_chmod(fname, file->mode);
-+      if ((sxp->st.st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS)) {
-+              mode_t mode = file->mode;
-+              int ret = do_chmod(fname, mode);
+-      if ((st->st_mode & CHMOD_BITS) != (new_mode & CHMOD_BITS)) {
++      if ((sxp->st.st_mode & CHMOD_BITS) != (new_mode & CHMOD_BITS)) {
+               int ret = do_chmod(fname, new_mode);
                if (ret < 0) {
                        rsyserr(FERROR, errno,
                                "failed to set permissions on %s",
                if (ret < 0) {
                        rsyserr(FERROR, errno,
                                "failed to set permissions on %s",
@@ -5839,7 +5845,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                }
                if (ret == 0) /* ret == 1 if symlink could not be set */
                        updated = 1;
                }
                if (ret == 0) /* ret == 1 if symlink could not be set */
                        updated = 1;
-@@ -222,6 +244,11 @@ int set_file_attrs(char *fname, struct f
+@@ -227,6 +250,11 @@ int set_file_attrs(char *fname, struct f
                else
                        rprintf(FCLIENT, "%s is uptodate\n", fname);
        }
                else
                        rprintf(FCLIENT, "%s is uptodate\n", fname);
        }
@@ -5853,7 +5859,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
 --- old/rsync.h
 +++ new/rsync.h
  
 --- old/rsync.h
 +++ new/rsync.h
-@@ -486,6 +486,15 @@ struct idev {
+@@ -492,6 +492,15 @@ struct idev {
  #define IN_LOOPBACKNET 127
  #endif
  
  #define IN_LOOPBACKNET 127
  #endif
  
@@ -5869,7 +5875,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  #define GID_NONE ((gid_t)-1)
  
  #define HL_CHECK_MASTER       0
  #define GID_NONE ((gid_t)-1)
  
  #define HL_CHECK_MASTER       0
-@@ -646,6 +655,17 @@ struct stats {
+@@ -653,6 +662,17 @@ struct stats {
  
  struct chmod_mode_struct;
  
  
  struct chmod_mode_struct;
  
@@ -5887,9 +5893,9 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  #include "byteorder.h"
  #include "lib/mdfour.h"
  #include "lib/wildmatch.h"
  #include "byteorder.h"
  #include "lib/mdfour.h"
  #include "lib/wildmatch.h"
-@@ -661,6 +681,16 @@ struct chmod_mode_struct;
+@@ -669,6 +689,16 @@ struct chmod_mode_struct;
  #define UNUSED(x) x __attribute__((__unused__))
  #define UNUSED(x) x __attribute__((__unused__))
+ #define NORETURN __attribute__((__noreturn__))
  
 +typedef struct {
 +    STRUCT_STAT st;
  
 +typedef struct {
 +    STRUCT_STAT st;
@@ -5915,15 +5921,15 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
       --no-OPTION             turn off an implied OPTION (e.g. --no-D)
   -r, --recursive             recurse into directories
   -R, --relative              use relative path names
       --no-OPTION             turn off an implied OPTION (e.g. --no-D)
   -r, --recursive             recurse into directories
   -R, --relative              use relative path names
-@@ -321,6 +321,7 @@ to the detailed description below for a 
-  -H, --hard-links            preserve hard links
+@@ -322,6 +322,7 @@ to the detailed description below for a 
   -p, --perms                 preserve permissions
   -E, --executability         preserve executability
   -p, --perms                 preserve permissions
   -E, --executability         preserve executability
+      --chmod=CHMOD           affect file and/or directory permissions
 + -A, --acls                  preserve ACLs (implies -p) [non-standard]
 + -A, --acls                  preserve ACLs (implies -p) [non-standard]
-      --chmod=CHMOD           change destination permissions
   -o, --owner                 preserve owner (super-user only)
   -g, --group                 preserve group
   -o, --owner                 preserve owner (super-user only)
   -g, --group                 preserve group
-@@ -746,7 +747,9 @@ quote(itemize(
+      --devices               preserve device files (super-user only)
+@@ -745,7 +746,9 @@ quote(itemization(
    permissions, though the bf(--executability) option might change just
    the execute permission for the file.
    it() New files get their "normal" permission bits set to the source
    permissions, though the bf(--executability) option might change just
    the execute permission for the file.
    it() New files get their "normal" permission bits set to the source
@@ -5934,7 +5940,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
    their special permission bits disabled except in the case where a new
    directory inherits a setgid bit from its parent directory.
  ))
    their special permission bits disabled except in the case where a new
    directory inherits a setgid bit from its parent directory.
  ))
-@@ -777,9 +780,11 @@ The preservation of the destination's se
+@@ -776,9 +779,11 @@ The preservation of the destination's se
  directories when bf(--perms) is off was added in rsync 2.6.7.  Older rsync
  versions erroneously preserved the three special permission bits for
  newly-created files when bf(--perms) was off, while overriding the
  directories when bf(--perms) is off was added in rsync 2.6.7.  Older rsync
  versions erroneously preserved the three special permission bits for
  newly-created files when bf(--perms) was off, while overriding the
@@ -5949,7 +5955,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  
  dit(bf(-E, --executability)) This option causes rsync to preserve the
  executability (or non-executability) of regular files when bf(--perms) is
  
  dit(bf(-E, --executability)) This option causes rsync to preserve the
  executability (or non-executability) of regular files when bf(--perms) is
-@@ -797,6 +802,15 @@ quote(itemize(
+@@ -796,6 +801,15 @@ quote(itemization(
  
  If bf(--perms) is enabled, this option is ignored.
  
  
  If bf(--perms) is enabled, this option is ignored.
  
@@ -5965,7 +5971,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  dit(bf(--chmod)) This option tells rsync to apply one or more
  comma-separated "chmod" strings to the permission of the files in the
  transfer.  The resulting value is treated as though it was the permissions
  dit(bf(--chmod)) This option tells rsync to apply one or more
  comma-separated "chmod" strings to the permission of the files in the
  transfer.  The resulting value is treated as though it was the permissions
-@@ -1378,8 +1392,8 @@ if the receiving rsync is at least versi
+@@ -1381,8 +1395,8 @@ if the receiving rsync is at least versi
  with older versions of rsync, but that also turns on the output of other
  verbose messages).
  
  with older versions of rsync, but that also turns on the output of other
  verbose messages).
  
@@ -5976,7 +5982,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  type of update being done, bf(X) is replaced by the file-type, and the
  other letters represent attributes that may be output if they are being
  modified.
  type of update being done, bf(X) is replaced by the file-type, and the
  other letters represent attributes that may be output if they are being
  modified.
-@@ -1428,7 +1442,11 @@ quote(itemize(
+@@ -1431,7 +1445,11 @@ quote(itemization(
    sender's value (requires bf(--owner) and super-user privileges).
    it() A bf(g) means the group is different and is being updated to the
    sender's value (requires bf(--group) and the authority to set the group).
    sender's value (requires bf(--owner) and super-user privileges).
    it() A bf(g) means the group is different and is being updated to the
    sender's value (requires bf(--group) and the authority to set the group).
@@ -6273,16 +6279,6 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +
 +#endif /* No ACLs. */
 +#endif /* _SMB_ACLS_H */
 +
 +#endif /* No ACLs. */
 +#endif /* _SMB_ACLS_H */
---- old/t_stub.c
-+++ new/t_stub.c
-@@ -79,3 +79,7 @@ struct filter_list_struct server_filter_
-     return NULL;
- }
-+ const char *who_am_i(void)
-+{
-+    return "test";
-+}
 --- old/testsuite/acls.test
 +++ new/testsuite/acls.test
 @@ -0,0 +1,34 @@
 --- old/testsuite/acls.test
 +++ new/testsuite/acls.test
 @@ -0,0 +1,34 @@
@@ -6443,10 +6439,11 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
      sed -e '/block2\.5/d' \
 --- old/testsuite/itemize.test
 +++ new/testsuite/itemize.test
      sed -e '/block2\.5/d' \
 --- old/testsuite/itemize.test
 +++ new/testsuite/itemize.test
-@@ -29,14 +29,14 @@ ln "$fromdir/foo/config1" "$fromdir/foo/
+@@ -29,15 +29,15 @@ ln "$fromdir/foo/config1" "$fromdir/foo/
  $RSYNC -iplr "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
  $RSYNC -iplr "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
+-cd+++++++ ./
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 ->f+++++++ bar/baz/rsync
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 ->f+++++++ bar/baz/rsync
@@ -6455,6 +6452,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 ->f+++++++ foo/config2
 ->f+++++++ foo/extra
 -cL+++++++ foo/sym -> ../bar/baz/rsync
 ->f+++++++ foo/config2
 ->f+++++++ foo/extra
 -cL+++++++ foo/sym -> ../bar/baz/rsync
++cd+++++++++ ./
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +>f+++++++++ bar/baz/rsync
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +>f+++++++++ bar/baz/rsync
@@ -6466,7 +6464,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 1 failed"
  
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 1 failed"
  
-@@ -48,10 +48,10 @@ chmod 601 "$fromdir/foo/config2"
+@@ -49,10 +49,10 @@ chmod 601 "$fromdir/foo/config2"
  $RSYNC -iplrH "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
  $RSYNC -iplrH "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
@@ -6481,7 +6479,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 2 failed"
  
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 2 failed"
  
-@@ -68,11 +68,11 @@ chmod 777 "$todir/bar/baz/rsync"
+@@ -69,11 +69,11 @@ chmod 777 "$todir/bar/baz/rsync"
  $RSYNC -iplrtc "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
  $RSYNC -iplrtc "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
@@ -6498,7 +6496,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 3 failed"
  
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 3 failed"
  
-@@ -97,15 +97,15 @@ $RSYNC -ivvplrtH "$fromdir/" "$todir/" \
+@@ -98,15 +98,15 @@ $RSYNC -ivvplrtH "$fromdir/" "$todir/" \
      | tee "$outfile"
  filter_outfile
  cat <<EOT >"$chkfile"
      | tee "$outfile"
  filter_outfile
  cat <<EOT >"$chkfile"
@@ -6523,7 +6521,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 5 failed"
  
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 5 failed"
  
-@@ -124,8 +124,8 @@ touch "$todir/foo/config2"
+@@ -125,8 +125,8 @@ touch "$todir/foo/config2"
  $RSYNC -iplrtH "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
  $RSYNC -iplrtH "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
@@ -6534,11 +6532,11 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 7 failed"
  
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 7 failed"
  
-@@ -134,15 +134,15 @@ $RSYNC -ivvplrtH --copy-dest="$lddir" "$
+@@ -135,15 +135,15 @@ $RSYNC -ivvplrtH --copy-dest=../ld "$fro
      | tee "$outfile"
  filter_outfile
  cat <<EOT >"$chkfile"
      | tee "$outfile"
  filter_outfile
  cat <<EOT >"$chkfile"
--.d..t.... ./
+-cd+++++++ ./
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -cf        bar/baz/rsync
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -cf        bar/baz/rsync
@@ -6547,7 +6545,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 -cf        foo/config2
 -hf        foo/extra => foo/config1
 -cL..T.... foo/sym -> ../bar/baz/rsync
 -cf        foo/config2
 -hf        foo/extra => foo/config1
 -cL..T.... foo/sym -> ../bar/baz/rsync
-+.d..t...... ./
++cd+++++++++ ./
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +cf          bar/baz/rsync
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +cf          bar/baz/rsync
@@ -6559,16 +6557,16 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 8 failed"
  
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 8 failed"
  
-@@ -150,11 +150,11 @@ rm -rf "$todir"
- $RSYNC -iplrtH --copy-dest="$lddir" "$fromdir/" "$todir/" \
+@@ -151,11 +151,11 @@ rm -rf "$todir"
+ $RSYNC -iplrtH --copy-dest=../ld "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
      | tee "$outfile"
  cat <<EOT >"$chkfile"
--.d..t.... ./
+-cd+++++++ ./
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -cd+++++++ foo/
 -hf        foo/extra => foo/config1
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -cd+++++++ foo/
 -hf        foo/extra => foo/config1
-+.d..t...... ./
++cd+++++++++ ./
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +cd+++++++++ foo/
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +cd+++++++++ foo/
@@ -6576,11 +6574,11 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 9 failed"
  
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 9 failed"
  
-@@ -181,15 +181,15 @@ $RSYNC -ivvplrtH --link-dest="$lddir" "$
+@@ -182,15 +182,15 @@ $RSYNC -ivvplrtH --link-dest="$lddir" "$
      | tee "$outfile"
  filter_outfile
  cat <<EOT >"$chkfile"
      | tee "$outfile"
  filter_outfile
  cat <<EOT >"$chkfile"
--.d..t.... ./
+-cd+++++++ ./
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -hf        bar/baz/rsync
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -hf        bar/baz/rsync
@@ -6589,7 +6587,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 -hf        foo/config2
 -hf        foo/extra => foo/config1
 -hL        foo/sym -> ../bar/baz/rsync
 -hf        foo/config2
 -hf        foo/extra => foo/config1
 -hL        foo/sym -> ../bar/baz/rsync
-+.d..t...... ./
++cd+++++++++ ./
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +hf          bar/baz/rsync
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +hf          bar/baz/rsync
@@ -6601,26 +6599,41 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 11 failed"
  
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 11 failed"
  
-@@ -197,10 +197,10 @@ rm -rf "$todir"
- $RSYNC -iplrtH --link-dest="$lddir" "$fromdir/" "$todir/" \
+@@ -198,10 +198,10 @@ rm -rf "$todir"
+ $RSYNC -iplrtH --dry-run --link-dest=../ld "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
      | tee "$outfile"
  cat <<EOT >"$chkfile"
--.d..t.... ./
+-cd+++++++ ./
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -cd+++++++ foo/
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -cd+++++++ foo/
-+.d..t...... ./
++cd+++++++++ ./
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +cd+++++++++ foo/
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 12 failed"
  
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +cd+++++++++ foo/
  EOT
  diff $diffopt "$chkfile" "$outfile" || test_fail "test 12 failed"
  
-@@ -228,14 +228,14 @@ filter_outfile
+@@ -209,10 +209,10 @@ rm -rf "$todir"
+ $RSYNC -iplrtH --link-dest=../ld "$fromdir/" "$todir/" \
+     | tee "$outfile"
+ cat <<EOT >"$chkfile"
+-cd+++++++ ./
+-cd+++++++ bar/
+-cd+++++++ bar/baz/
+-cd+++++++ foo/
++cd+++++++++ ./
++cd+++++++++ bar/
++cd+++++++++ bar/baz/
++cd+++++++++ foo/
+ EOT
+ diff $diffopt "$chkfile" "$outfile" || test_fail "test 13 failed"
+@@ -240,14 +240,14 @@ filter_outfile
  # TODO fix really-old problem when combining -H with --compare-dest:
  # missing output for foo/extra hard-link (and it might not be updated)!
  cat <<EOT >"$chkfile"
  # TODO fix really-old problem when combining -H with --compare-dest:
  # missing output for foo/extra hard-link (and it might not be updated)!
  cat <<EOT >"$chkfile"
--.d..t.... ./
+-cd+++++++ ./
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -.f        bar/baz/rsync
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -.f        bar/baz/rsync
@@ -6628,7 +6641,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 -.f        foo/config1
 -.f        foo/config2
 -.L        foo/sym -> ../bar/baz/rsync
 -.f        foo/config1
 -.f        foo/config2
 -.L        foo/sym -> ../bar/baz/rsync
-+.d..t...... ./
++cd+++++++++ ./
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +.f          bar/baz/rsync
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +.f          bar/baz/rsync
@@ -6637,22 +6650,22 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
 +.f          foo/config2
 +.L          foo/sym -> ../bar/baz/rsync
  EOT
 +.f          foo/config2
 +.L          foo/sym -> ../bar/baz/rsync
  EOT
- diff $diffopt "$chkfile" "$outfile" || test_fail "test 14 failed"
+ diff $diffopt "$chkfile" "$outfile" || test_fail "test 15 failed"
  
  
-@@ -243,10 +243,10 @@ rm -rf "$todir"
+@@ -255,10 +255,10 @@ rm -rf "$todir"
  $RSYNC -iplrtH --compare-dest="$lddir" "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
  $RSYNC -iplrtH --compare-dest="$lddir" "$fromdir/" "$todir/" \
      | tee "$outfile"
  cat <<EOT >"$chkfile"
--.d..t.... ./
+-cd+++++++ ./
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -cd+++++++ foo/
 -cd+++++++ bar/
 -cd+++++++ bar/baz/
 -cd+++++++ foo/
-+.d..t...... ./
++cd+++++++++ ./
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +cd+++++++++ foo/
  EOT
 +cd+++++++++ bar/
 +cd+++++++++ bar/baz/
 +cd+++++++++ foo/
  EOT
- diff $diffopt "$chkfile" "$outfile" || test_fail "test 15 failed"
+ diff $diffopt "$chkfile" "$outfile" || test_fail "test 16 failed"
  
 --- old/uidlist.c
 +++ new/uidlist.c
  
 --- old/uidlist.c
 +++ new/uidlist.c
@@ -6719,7 +6732,7 @@ latest ACL-enabling patch to send files to an older ACL-enabled rsync.
                for (i = 0; i < flist->count; i++)
 --- old/util.c
 +++ new/util.c
                for (i = 0; i < flist->count; i++)
 --- old/util.c
 +++ new/util.c
-@@ -1555,3 +1555,31 @@ int bitbag_next_bit(struct bitbag *bb, i
+@@ -1468,3 +1468,31 @@ int bitbag_next_bit(struct bitbag *bb, i
  
        return -1;
  }
  
        return -1;
  }