X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/15164c0aa9336f5001a011a83cf4e8acb1c41799..7a16e12207b65010dc2f0c05dc87a9690c9ed87b:/generator.c diff --git a/generator.c b/generator.c index a4a54a05..262ffe23 100644 --- a/generator.c +++ b/generator.c @@ -249,19 +249,24 @@ 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); /* If an item in dirlist is not found in flist, delete it * from the filesystem. */ for (i = dirlist->count; i--; ) { - if (!dirlist->files[i]->basename) + struct file_struct *fp = dirlist->files[i]; + if (!fp->basename) continue; - if (flist_find(flist, dirlist->files[i]) < 0) { - int mode = dirlist->files[i]->mode; - f_name_to(dirlist->files[i], delbuf); + 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; } @@ -723,6 +728,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, 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)); } @@ -733,6 +740,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, #ifdef SUPPORT_LINKS if (safe_symlinks && unsafe_symlink(file->u.link, fname)) { if (verbose) { + if (the_file_list->count == 1) + fname = f_name(file); rprintf(FINFO, "ignoring unsafe symlink %s -> \"%s\"\n", full_fname(fname), @@ -825,10 +834,14 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, return; } - if (preserve_hard_links && hard_link_check(file, ndx, HL_CHECK_MASTER)) + if (preserve_hard_links + && hard_link_check(file, ndx, fname, statret, &st, + itemizing, code, HL_CHECK_MASTER)) return; if (!S_ISREG(file->mode)) { + if (the_file_list->count == 1) + fname = f_name(file); rprintf(FINFO, "skipping non-regular file \"%s\"\n", safe_fname(fname)); return; @@ -906,12 +919,14 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, if (hard_link_one(file, ndx, fname, -1, &st, fnamecmpbuf, 1, itemizing && verbose > 1, - code) == 0) + code) == 0) { + if (preserve_hard_links + && file->link_u.links) { + hard_link_cluster(file, ndx, + itemizing, + code); + } return; - if (verbose) { - rsyserr(FINFO, errno, "link %s => %s", - full_fname(fnamecmpbuf), - safe_fname(fname)); } match_level = 2; } @@ -981,7 +996,9 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, } if (statret != 0) { - if (preserve_hard_links && hard_link_check(file, ndx, HL_SKIP)) + if (preserve_hard_links + && hard_link_check(file, ndx, fname, statret, &st, + itemizing, code, HL_SKIP)) return; if (stat_errno == ENOENT) goto notify_others; @@ -1039,7 +1056,9 @@ prepare_to_open: full_fname(fnamecmp)); pretend_missing: /* pretend the file didn't exist */ - if (preserve_hard_links && hard_link_check(file, ndx, HL_SKIP)) + if (preserve_hard_links + && hard_link_check(file, ndx, fname, statret, &st, + itemizing, code, HL_SKIP)) return; statret = real_ret = -1; goto notify_others;