X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/25ff04417e4b4fa0aeb44e0b1576a01021aa1650..462c51d9a1ac30a92150f290cc5c4353e86118b8:/receiver.c diff --git a/receiver.c b/receiver.c index 09df2602..e129b1dc 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; @@ -57,15 +56,29 @@ 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) { - char fbuf[MAXPATHLEN]; + struct file_list *dir_list; + char *argv[1], 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; - delete_in_dir(flist, f_name_to(flist->files[j], fbuf)); + argv[0] = f_name_to(flist->files[j], fbuf); + + if (!(dir_list = send_file_list(-1, 1, argv))) + continue; + + delete_missing(flist, dir_list, fbuf); + + flist_free(dir_list); } } @@ -289,7 +302,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); } @@ -586,7 +599,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)