X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/f3ab64d3a8b47395154a503f3f0084622d61d52d..bdedced84b7f446f818efd4d25b8985285a50009:/generator.c diff --git a/generator.c b/generator.c index 3077a137..76367842 100644 --- a/generator.c +++ b/generator.c @@ -59,8 +59,8 @@ extern int csum_length; extern int ignore_times; extern int size_only; extern OFF_T max_size; -extern int io_timeout; extern int io_error; +extern int allowed_lull; extern int sock_f_out; extern int ignore_timeout; extern int protocol_version; @@ -89,8 +89,6 @@ extern int backup_suffix_len; extern struct file_list *the_file_list; extern struct filter_list_struct server_filter_list; -int allowed_lull = 0; - static int deletion_count = 0; /* used to implement --max-delete */ @@ -186,7 +184,7 @@ static int delete_item(char *fname, int mode, int flags) if (do_rmdir(fname) == 0) { if (!(flags & DEL_TERSE)) log_delete(fname, mode); - } else if (errno != ENOTEMPTY && errno != ENOENT) { + } else if (errno != ENOTEMPTY && errno != EEXIST && errno != ENOENT) { rsyserr(FERROR, errno, "delete_file: rmdir %s failed", full_fname(fname)); return -1; @@ -210,7 +208,7 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, struct file_list *dirlist; char delbuf[MAXPATHLEN]; STRUCT_STAT st; - int dlen, i, j; + int dlen, i; if (!flist) { while (cur_depth >= min_depth) @@ -226,9 +224,6 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, if (allowed_lull) maybe_send_keepalive(); - if (file->flags & FLAG_MOUNT_POINT) - return; - if (file->dir.depth >= MAXPATHLEN/2+1) return; /* Impossible... */ @@ -252,8 +247,12 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, if (link_stat(fbuf, &st, keep_dirlinks) < 0) return; - if (one_file_system && file->flags & FLAG_TOP_DIR) - filesystem_dev = st.st_dev; + if (one_file_system) { + if (file->flags & FLAG_TOP_DIR) + filesystem_dev = st.st_dev; + else if (filesystem_dev != st.st_dev) + return; + } dirlist = get_dirlist(fbuf, dlen, 0); @@ -263,13 +262,12 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, struct file_struct *fp = dirlist->files[i]; if (!fp->basename) continue; - if ((j = flist_find(flist, fp)) < 0) { + if (flist_find(flist, fp) < 0) { int mode = fp->mode; f_name_to(fp, delbuf); if (delete_item(delbuf, mode, DEL_FORCE_RECURSE) < 0) break; - } else if (fp->flags & FLAG_MOUNT_POINT) - flist->files[j]->flags |= FLAG_MOUNT_POINT; + } } flist_free(dirlist); @@ -282,7 +280,8 @@ static void do_delete_pass(struct file_list *flist) char fbuf[MAXPATHLEN]; int j; - if (dry_run > 1) /* destination doesn't exist yet */ + if (dry_run > 1 /* destination doesn't exist yet */ + || list_only) return; for (j = 0; j < flist->count; j++) { @@ -726,16 +725,6 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, return; } - if (max_size && file->length > max_size) { - if (verbose > 1) { - if (the_file_list->count == 1) - fname = f_name(file); - rprintf(FINFO, "%s is over max-size\n", - safe_fname(fname)); - } - return; - } - if (preserve_links && S_ISLNK(file->mode)) { #ifdef SUPPORT_LINKS if (safe_symlinks && unsafe_symlink(file->u.link, fname)) { @@ -847,6 +836,16 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, return; } + if (max_size && file->length > max_size) { + if (verbose > 1) { + if (the_file_list->count == 1) + fname = f_name(file); + rprintf(FINFO, "%s is over max-size\n", + safe_fname(fname)); + } + return; + } + if (opt_ignore_existing && statret == 0) { if (verbose > 1) rprintf(FINFO, "%s exists\n", safe_fname(fname)); @@ -1144,10 +1143,11 @@ notify_others: void generate_files(int f_out, struct file_list *flist, char *local_name) { - int i, lull_mod; + int i; char fbuf[MAXPATHLEN]; int itemizing, maybe_PERMS_REPORT; enum logcode code; + int lull_mod = allowed_lull * 5; int need_retouch_dir_times = preserve_times && !omit_dir_times; int need_retouch_dir_perms = 0; int save_only_existing = only_existing; @@ -1155,9 +1155,6 @@ void generate_files(int f_out, struct file_list *flist, char *local_name) int save_do_progress = do_progress; int save_make_backups = make_backups; - allowed_lull = read_batch ? 0 : (io_timeout + 1) / 2; - lull_mod = allowed_lull * 5; - if (protocol_version >= 29) { itemizing = 1; maybe_PERMS_REPORT = log_format_has_i ? 0 : PERMS_REPORT; @@ -1194,8 +1191,11 @@ void generate_files(int f_out, struct file_list *flist, char *local_name) : "enabled"); } - if (protocol_version < 29) - ignore_timeout = 1; + /* Since we often fill up the outgoing socket and then just sit around + * waiting for the other 2 processes to do their thing, we don't want + * to exit on a timeout. If the data stops flowing, the receiver will + * notice that and let us know via the redo pipe (or its closing). */ + ignore_timeout = 1; for (i = 0; i < flist->count; i++) { struct file_struct *file = flist->files[i]; @@ -1241,10 +1241,6 @@ void generate_files(int f_out, struct file_list *flist, char *local_name) ignore_times = 1; make_backups = 0; /* avoid a duplicate backup for inplace processing */ - /* We expect to just sit around now, so don't exit on a timeout. - * If we really get a timeout then the other process should exit. */ - ignore_timeout = 1; - if (verbose > 2) rprintf(FINFO,"generate_files phase=%d\n",phase);