X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/2a5d5a8cc4ad251d8d29e45e4be3d9c39228715b..f3ab64d3a8b47395154a503f3f0084622d61d52d:/generator.c diff --git a/generator.c b/generator.c index 7e3ba7fb..3077a137 100644 --- a/generator.c +++ b/generator.c @@ -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; + int dlen, i, j; if (!flist) { while (cur_depth >= min_depth) @@ -226,6 +226,9 @@ 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... */ @@ -257,14 +260,16 @@ static void delete_in_dir(struct file_list *flist, char *fbuf, /* 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 ((j = 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); @@ -829,7 +834,9 @@ 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)) { @@ -912,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; } @@ -987,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; @@ -1045,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;