X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/6cbde57d8810d9889b650c49456fa843f76257c7..5e58e3f9cf3db5c3958fe6505eb59a2f814887fb:/generator.c diff --git a/generator.c b/generator.c index a4b9b0da..0a63f00d 100644 --- a/generator.c +++ b/generator.c @@ -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) - 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, 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)