Improved on the list-only fix and on the other similar checks that want
[rsync/rsync.git] / generator.c
index d6bf4fd..aaf831d 100644 (file)
@@ -515,7 +515,7 @@ static void do_delete_pass(void)
                rprintf(FINFO, "                    \r");
 }
 
-int unchanged_attrs(const char *fname, struct file_struct *file, statx *sxp)
+int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
 {
        if (preserve_perms && !BITS_EQUAL(sxp->st.st_mode, file->mode, CHMOD_BITS))
                return 0;
@@ -547,7 +547,7 @@ int unchanged_attrs(const char *fname, struct file_struct *file, statx *sxp)
 }
 
 void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statret,
-            statx *sxp, int32 iflags, uchar fnamecmp_type,
+            stat_x *sxp, int32 iflags, uchar fnamecmp_type,
             const char *xname)
 {
        if (statret >= 0) { /* A from-dest-dir statret can == 1! */
@@ -829,7 +829,7 @@ static int find_fuzzy(struct file_struct *file, struct file_list *dirlist)
  * 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,
-                        char *cmpbuf, statx *sxp, int itemizing,
+                        char *cmpbuf, stat_x *sxp, int itemizing,
                         enum logcode code)
 {
        int best_match = -1;
@@ -934,7 +934,7 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx,
  * handling the file, or -1 if no dest-linking occurred, or a non-negative
  * value if we found an alternate basis file. */
 static int try_dests_non(struct file_struct *file, char *fname, int ndx,
-                        char *cmpbuf, statx *sxp, int itemizing,
+                        char *cmpbuf, stat_x *sxp, int itemizing,
                         enum logcode code)
 {
        char lnk[MAXPATHLEN];
@@ -1124,7 +1124,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
        static int need_fuzzy_dirlist = 0;
        struct file_struct *fuzzy_file = NULL;
        int fd = -1, f_copy = -1;
-       statx sx, real_sx;
+       stat_x sx, real_sx;
        STRUCT_STAT partial_st;
        struct file_struct *back_file = NULL;
        int statret, real_ret, stat_errno;
@@ -1138,9 +1138,9 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                rprintf(FINFO, "recv_generator(%s,%d)\n", fname, ndx);
 
        if (list_only) {
-               if (S_ISDIR(file->mode)
+               if (S_ISDIR(file->mode) && inc_recurse
                 && ((!implied_dirs && !(file->flags & FLAG_XFER_DIR))
-                 || (inc_recurse && ndx != cur_flist->ndx_start - 1)))
+                 || ndx != cur_flist->ndx_start - 1))
                        return;
                list_file_entry(file);
                return;
@@ -1248,7 +1248,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
        }
 
        if (S_ISDIR(file->mode)) {
-               if (!implied_dirs && !(file->flags & FLAG_XFER_DIR))
+               if (inc_recurse && !implied_dirs && !(file->flags & FLAG_XFER_DIR))
                        goto cleanup;
                if (inc_recurse && ndx != cur_flist->ndx_start - 1) {
                        /* In inc_recurse mode we want ot make sure any missing
@@ -1832,7 +1832,7 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
        for (i = start; i <= end; i++, counter++) {
                file = flist->files[i];
                if (!S_ISDIR(file->mode)
-                || (relative_paths && !implied_dirs && !(file->flags & FLAG_XFER_DIR)))
+                || (inc_recurse && !implied_dirs && !(file->flags & FLAG_XFER_DIR)))
                        continue;
                if (verbose > 3) {
                        fname = f_name(file, NULL);