The uid & gid are now stored using an id_pair structure.
[rsync/rsync.git] / generator.c
index 32f0dde..0a63f00 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");
@@ -324,10 +325,10 @@ int unchanged_attrs(struct file_struct *file, STRUCT_STAT *st)
         && (st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS))
                return 0;
 
-       if (am_root && preserve_uid && st->st_uid != file->uid)
+       if (am_root && preserve_uid && st->st_uid != file->ids->uid)
                return 0;
 
-       if (preserve_gid && file->gid != GID_NONE && st->st_gid != file->gid)
+       if (preserve_gid && file->ids->gid != GID_NONE && st->st_gid != file->ids->gid)
                return 0;
 
        return 1;
@@ -350,17 +351,17 @@ void itemize(struct file_struct *file, int ndx, int statret, STRUCT_STAT *st,
                if (preserve_perms
                 && (file->mode & CHMOD_BITS) != (st->st_mode & CHMOD_BITS))
                        iflags |= ITEM_REPORT_PERMS;
-               if (preserve_uid && am_root && file->uid != st->st_uid)
+               if (preserve_uid && am_root && file->ids->uid != st->st_uid)
                        iflags |= ITEM_REPORT_OWNER;
-               if (preserve_gid && file->gid != GID_NONE
-                   && st->st_gid != file->gid)
+               if (preserve_gid && file->ids->gid != GID_NONE
+                   && st->st_gid != file->ids->gid)
                        iflags |= ITEM_REPORT_GROUP;
        } else
                iflags |= ITEM_IS_NEW;
 
        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, NULL, NO_FILTERS))) {
+               if (!(back_file = make_file(fname, NULL, NULL, 0, NO_FILTERS))) {
                        close(fd);
                        goto pretend_missing;
                }
@@ -1363,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;