X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/83a8ca7b14483826c85f7cc0e0e38ed9ce387d83..fd2598022cc10ce4f28019f5c0cb1816cd9311a4:/generator.c diff --git a/generator.c b/generator.c index b209812d..7c329f24 100644 --- a/generator.c +++ b/generator.c @@ -97,7 +97,7 @@ extern char *backup_dir; extern char *backup_suffix; extern int backup_suffix_len; extern struct file_list *cur_flist, *first_flist, *dir_flist; -extern struct filter_list_struct server_filter_list; +extern struct filter_list_struct daemon_filter_list; int ignore_perishable = 0; int non_perishable_cnt = 0; @@ -557,10 +557,13 @@ static void do_delete_pass(void) for (j = 0; j < cur_flist->used; j++) { struct file_struct *file = cur_flist->sorted[j]; - if (!(file->flags & FLAG_CONTENT_DIR)) + f_name(file, fbuf); + + if (!(file->flags & FLAG_CONTENT_DIR)) { + change_local_filter_dir(fbuf, strlen(fbuf), F_DEPTH(file)); continue; + } - f_name(file, fbuf); if (verbose > 1 && file->flags & FLAG_TOP_DIR) rprintf(FINFO, "deleting in %s\n", fbuf); @@ -1268,19 +1271,21 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, return; } - if (skip_dir && is_below(file, skip_dir)) { - if (is_dir) - file->flags |= FLAG_MISSING_DIR; + if (skip_dir) { + if (is_below(file, skip_dir)) { + if (is_dir) + file->flags |= FLAG_MISSING_DIR; #ifdef SUPPORT_HARD_LINKS - else if (F_IS_HLINKED(file)) - handle_skipped_hlink(file, itemizing, code, f_out); + else if (F_IS_HLINKED(file)) + handle_skipped_hlink(file, itemizing, code, f_out); #endif - return; - } else + return; + } skip_dir = NULL; + } - if (server_filter_list.head) { - if (check_filter(&server_filter_list, fname, is_dir) < 0) { + if (daemon_filter_list.head) { + if (check_filter(&daemon_filter_list, FLOG, fname, is_dir) < 0) { if (is_dir < 0) return; #ifdef SUPPORT_HARD_LINKS @@ -1312,8 +1317,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, statret = -1; stat_errno = ENOENT; } else { - dry_missing_dir = NULL; const char *dn = file->dirname ? file->dirname : "."; + dry_missing_dir = NULL; if (parent_dirname != dn && strcmp(parent_dirname, dn) != 0) { if (relative_paths && !implied_dirs && do_stat(dn, &sx.st) < 0) { @@ -1409,7 +1414,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, statret = -1; } if (dry_run && statret != 0) { - dry_missing_dir = file; + if (!dry_missing_dir) + dry_missing_dir = file; file->flags |= FLAG_MISSING_DIR; } real_ret = statret; @@ -1477,8 +1483,12 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, } } else if (delete_during && f_out != -1 && !phase - && BITS_SETnUNSET(file->flags, FLAG_CONTENT_DIR, FLAG_MISSING_DIR)) - delete_in_dir(fname, file, &real_sx.st.st_dev); + && !(file->flags & FLAG_MISSING_DIR)) { + if (file->flags & FLAG_CONTENT_DIR) + delete_in_dir(fname, file, &real_sx.st.st_dev); + else + change_local_filter_dir(fname, strlen(fname), F_DEPTH(file)); + } goto cleanup; } @@ -2172,16 +2182,18 @@ void generate_files(int f_out, const char *local_name) f_name(fp, fbuf); ndx = cur_flist->ndx_start - 1; recv_generator(fbuf, fp, ndx, itemizing, code, f_out); - if (delete_during && dry_run < 2 && !list_only) { - if (BITS_SETnUNSET(fp->flags, FLAG_CONTENT_DIR, FLAG_MISSING_DIR)) { + if (delete_during && dry_run < 2 && !list_only + && !(fp->flags & FLAG_MISSING_DIR)) { + if (fp->flags & FLAG_CONTENT_DIR) { dev_t dirdev; if (one_file_system) { uint32 *devp = F_DIR_DEV_P(fp); dirdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp)); } else dirdev = MAKEDEV(0, 0); - delete_in_dir(f_name(fp, fbuf), fp, &dirdev); - } + delete_in_dir(fbuf, fp, &dirdev); + } else + change_local_filter_dir(fbuf, strlen(fbuf), F_DEPTH(fp)); } } for (i = cur_flist->low; i <= cur_flist->high; i++) {