X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/beb51aa09ef9d5d10956a4c1fcf7cd4f4449d018..468d7668191980c337e37cd3980f80dcd8e9c0fd:/generator.c diff --git a/generator.c b/generator.c index b73e50a0..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; } @@ -668,7 +673,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, if (only_existing && statret == -1 && stat_errno == ENOENT) { /* we only want to update existing files */ if (verbose > 1) { - rprintf(FINFO, "not creating new file \"%s\"\n", + rprintf(FINFO, "not creating new %s \"%s\"\n", + S_ISDIR(file->mode) ? "directory" : "file", safe_fname(fname)); } return; @@ -722,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)); } @@ -732,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), @@ -824,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; @@ -905,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; } @@ -980,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; @@ -1038,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;