X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/f3ab64d3a8b47395154a503f3f0084622d61d52d..4d474ad51386138c7c09bcffa328cd98c4d8dddf:/generator.c diff --git a/generator.c b/generator.c index 3077a137..e46da847 100644 --- a/generator.c +++ b/generator.c @@ -186,7 +186,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 +210,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 +226,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 +249,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 +264,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 +282,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 +727,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 +838,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)); @@ -1194,8 +1195,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 +1245,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);