X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/25ff04417e4b4fa0aeb44e0b1576a01021aa1650..4875d6b64dd0ed8d451746cc0cc609cff36192bd:/receiver.c diff --git a/receiver.c b/receiver.c index 09df2602..b6d30c02 100644 --- a/receiver.c +++ b/receiver.c @@ -21,7 +21,6 @@ #include "rsync.h" extern int verbose; -extern int recurse; extern int delete_after; extern int csum_length; extern struct stats stats; @@ -61,11 +60,16 @@ void delete_files(struct file_list *flist) int j; for (j = 0; j < flist->count; j++) { - if (!(flist->files[j]->flags & FLAG_DEL_START) - || !S_ISDIR(flist->files[j]->mode)) + struct file_struct *file = flist->files[j]; + + if (!(file->flags & FLAG_DEL_HERE)) continue; - delete_in_dir(flist, f_name_to(flist->files[j], fbuf)); + f_name_to(file, fbuf); + if (verbose > 1 && file->flags & FLAG_TOP_DIR) + rprintf(FINFO, "deleting in %s\n", safe_fname(fbuf)); + + delete_in_dir(flist, fbuf, file); } } @@ -289,7 +293,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, if (delay_updates) { int sz = (flist->count + 7) / 8; - if (!(delayed_bits = new_array(char, sz))) + if (!(delayed_bits = new_array(uchar, sz))) out_of_memory("recv_files"); memset(delayed_bits, 0, sz); } @@ -330,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 */ @@ -349,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) @@ -369,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) { @@ -586,7 +591,7 @@ int recv_files(int f_in, struct file_list *flist, char *local_name, } } - if (delete_after && recurse && !local_name && flist->count > 0) + if (delete_after && !local_name && flist->count > 0) delete_files(flist); if (verbose > 2)