Decided to hold off on the potential memory savings of indexed
[rsync/rsync.git] / generator.c
index afa56a2..fb0bc2d 100644 (file)
@@ -217,14 +217,13 @@ static int delete_item(char *fname, int mode, int flags)
  * call will append names onto the end, but the old dir value will be restored
  * on exit). */
 static void delete_in_dir(struct file_list *flist, char *fbuf,
-                         struct file_struct *file)
+                         struct file_struct *file, STRUCT_STAT *stp)
 {
        static int min_depth = MAXPATHLEN, cur_depth = -1;
        static void *filt_array[MAXPATHLEN/2+1];
        static int already_warned = 0;
        struct file_list *dirlist;
        char delbuf[MAXPATHLEN];
-       STRUCT_STAT st;
        int dlen, i;
 
        if (!flist) {
@@ -261,13 +260,10 @@ static void delete_in_dir(struct file_list *flist, char *fbuf,
        dlen = strlen(fbuf);
        filt_array[cur_depth] = push_local_filters(fbuf, dlen);
 
-       if (link_stat(fbuf, &st, keep_dirlinks) < 0 || !S_ISDIR(st.st_mode))
-               return;
-
        if (one_file_system) {
                if (file->flags & FLAG_TOP_DIR)
-                       filesystem_dev = st.st_dev;
-               else if (filesystem_dev != st.st_dev)
+                       filesystem_dev = stp->st_dev;
+               else if (filesystem_dev != stp->st_dev)
                        return;
        }
 
@@ -294,6 +290,7 @@ static void delete_in_dir(struct file_list *flist, char *fbuf,
 static void do_delete_pass(struct file_list *flist)
 {
        char fbuf[MAXPATHLEN];
+       STRUCT_STAT st;
        int j;
 
        if (dry_run > 1 /* destination doesn't exist yet */
@@ -310,9 +307,13 @@ static void do_delete_pass(struct file_list *flist)
                if (verbose > 1 && file->flags & FLAG_TOP_DIR)
                        rprintf(FINFO, "deleting in %s\n", fbuf);
 
-               delete_in_dir(flist, fbuf, file);
+               if (link_stat(fbuf, &st, keep_dirlinks) < 0
+                || !S_ISDIR(st.st_mode))
+                       continue;
+
+               delete_in_dir(flist, fbuf, file, &st);
        }
-       delete_in_dir(NULL, NULL, NULL);
+       delete_in_dir(NULL, NULL, NULL, NULL);
 
        if (do_progress && !am_server)
                rprintf(FINFO, "                    \r");
@@ -360,7 +361,7 @@ void itemize(struct file_struct *file, int ndx, int statret, STRUCT_STAT *st,
 
        iflags &= 0xffff;
        if ((iflags & SIGNIFICANT_ITEM_FLAGS || verbose > 1
-         || (xname && *xname)) && !read_batch) {
+         || log_format_has_i > 1 || (xname && *xname)) && !read_batch) {
                if (protocol_version >= 29) {
                        if (ndx >= 0)
                                write_int(sock_f_out, ndx);
@@ -715,10 +716,12 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx,
                 || !unchanged_attrs(file, &st))
                        continue;
                if (S_ISLNK(file->mode)) {
+#ifdef SUPPORT_LINKS
                        if ((len = readlink(fnamebuf, lnk, MAXPATHLEN-1)) <= 0)
                                continue;
                        lnk[len] = '\0';
                        if (strcmp(lnk, file->u.link) != 0)
+#endif
                                continue;
                } else {
                        if (!IS_DEVICE(st.st_mode) || st.st_rdev != file->u.rdev)
@@ -892,7 +895,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                        rprintf(code, "%s/\n", fname);
                if (delete_during && f_out != -1 && !phase && dry_run < 2
                    && (file->flags & FLAG_DEL_HERE))
-                       delete_in_dir(the_file_list, fname, file);
+                       delete_in_dir(the_file_list, fname, file, &st);
                return;
        }
 
@@ -1195,7 +1198,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                        close(fd);
                        return;
                }
-               if (!(back_file = make_file(fname, NULL, NO_FILTERS))) {
+               if (!(back_file = make_file(fname, NULL, NULL, 0, NO_FILTERS))) {
                        close(fd);
                        goto pretend_missing;
                }
@@ -1267,7 +1270,6 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
        close(fd);
 }
 
-
 void generate_files(int f_out, struct file_list *flist, char *local_name)
 {
        int i;
@@ -1364,7 +1366,7 @@ void generate_files(int f_out, struct file_list *flist, char *local_name)
        }
        recv_generator(NULL, NULL, 0, 0, 0, code, -1);
        if (delete_during)
-               delete_in_dir(NULL, NULL, NULL);
+               delete_in_dir(NULL, NULL, NULL, NULL);
 
        phase++;
        csum_length = SUM_LENGTH;
@@ -1430,6 +1432,7 @@ void generate_files(int f_out, struct file_list *flist, char *local_name)
                 * modified-time values. */
                for (i = 0; i < flist->count; i++) {
                        struct file_struct *file = flist->files[i];
+
                        if (!file->basename || !S_ISDIR(file->mode))
                                continue;
                        if (!need_retouch_dir_times && file->mode & S_IWUSR)