X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/4ccfd96cfee813f3855be5a902acc3d5cd0545a4..4875d6b64dd0ed8d451746cc0cc609cff36192bd:/receiver.c diff --git a/receiver.c b/receiver.c index 7f807d96..b6d30c02 100644 --- a/receiver.c +++ b/receiver.c @@ -56,29 +56,20 @@ extern struct filter_list_struct server_filter_list; * sending side. This is used by --delete-before and --delete-after. */ void delete_files(struct file_list *flist) { - struct file_list *dir_list; - char *argv[1], fbuf[MAXPATHLEN]; + char fbuf[MAXPATHLEN]; int j; - if (io_error && !(lp_ignore_errors(module_id) || ignore_errors)) { - rprintf(FINFO, - "IO error encountered -- skipping file deletion\n"); - return; - } - for (j = 0; j < flist->count; j++) { - if (!(flist->files[j]->flags & FLAG_DEL_START) - || !S_ISDIR(flist->files[j]->mode)) - continue; + struct file_struct *file = flist->files[j]; - argv[0] = f_name_to(flist->files[j], fbuf); - - if (!(dir_list = send_file_list(-1, 1, argv))) + if (!(file->flags & FLAG_DEL_HERE)) continue; - delete_missing(flist, dir_list, fbuf); + f_name_to(file, fbuf); + if (verbose > 1 && file->flags & FLAG_TOP_DIR) + rprintf(FINFO, "deleting in %s\n", safe_fname(fbuf)); - flist_free(dir_list); + delete_in_dir(flist, fbuf, file); } } @@ -343,16 +334,27 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, } file = flist->files[i]; + if (S_ISDIR(file->mode)) { + rprintf(FERROR, "[%s] got index of directory: %d\n", + who_am_i(), i); + exit_cleanup(RERR_PROTOCOL); + } stats.current_file_index = i; stats.num_transferred_files++; stats.total_transferred_size += file->length; cleanup_got_literal = 0; - if (local_name) - fname = local_name; - else - fname = f_name_to(file, fbuf); + fname = local_name ? local_name : f_name_to(file, fbuf); + + if (server_filter_list.head + && check_filter(&server_filter_list, fname, 0) < 0) { + rprintf(FERROR, "attempt to hack rsync failed.\n"); + exit_cleanup(RERR_PROTOCOL); + } + + if (verbose > 2) + rprintf(FINFO, "recv_files(%s)\n", safe_fname(fname)); if (dry_run) { if (!am_server && verbose) /* log the transfer */ @@ -362,9 +364,6 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, initial_stats = stats; - if (verbose > 2) - rprintf(FINFO, "recv_files(%s)\n", safe_fname(fname)); - if (read_batch) { while (i > next_gen_i) { if (f_in_name >= 0 && next_gen_i >= 0) @@ -382,13 +381,6 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, next_gen_i = -1; } - if (server_filter_list.head - && check_filter(&server_filter_list, fname, - S_ISDIR(file->mode)) < 0) { - rprintf(FERROR, "attempt to hack rsync failed.\n"); - exit_cleanup(RERR_PROTOCOL); - } - partialptr = partial_dir ? partial_dir_fname(fname) : fname; if (f_in_name >= 0) {