X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/c9ec460807a53af0f1e2a4c51619c473f972da19..e73eed8563d21ef9ce83725cb09a3c2e14a40dbe:/generator.c diff --git a/generator.c b/generator.c index 8ee5a09c..438d940b 100644 --- a/generator.c +++ b/generator.c @@ -43,7 +43,6 @@ extern int preserve_specials; extern int preserve_hard_links; extern int preserve_perms; extern int preserve_times; -extern int omit_dir_times; extern int uid_ndx; extern int gid_ndx; extern int delete_mode; @@ -554,7 +553,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre { if (statret >= 0) { /* A from-dest-dir statret can == 1! */ int keep_time = !preserve_times ? 0 - : S_ISDIR(file->mode) ? !omit_dir_times + : S_ISDIR(file->mode) ? preserve_times > 1 : !S_ISLNK(file->mode); if (S_ISREG(file->mode) && F_LENGTH(file) != sxp->st.st_size) @@ -882,7 +881,7 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx, if (!hard_link_one(file, fname, cmpbuf, 1)) goto try_a_copy; if (preserve_hard_links && F_IS_HLINKED(file)) - finish_hard_link(file, fname, &sxp->st, itemizing, code, j); + finish_hard_link(file, fname, ndx, &sxp->st, itemizing, code, j); if (itemizing && (verbose > 1 || stdout_format_has_i > 1)) { itemize(cmpbuf, file, ndx, 1, sxp, ITEM_LOCAL_CHANGE | ITEM_XNAME_FOLLOWS, @@ -924,7 +923,7 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx, } #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) - finish_hard_link(file, fname, &sxp->st, itemizing, code, -1); + finish_hard_link(file, fname, ndx, &sxp->st, itemizing, code, -1); #endif return -2; } @@ -1052,7 +1051,7 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx, return j; } if (preserve_hard_links && F_IS_HLINKED(file)) - finish_hard_link(file, fname, NULL, itemizing, code, -1); + finish_hard_link(file, fname, ndx, NULL, itemizing, code, -1); } else #endif match_level = 2; @@ -1344,7 +1343,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, itemize(fname, file, ndx, 0, &sx, 0, 0, NULL); #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) - finish_hard_link(file, fname, &sx.st, itemizing, code, -1); + finish_hard_link(file, fname, ndx, &sx.st, itemizing, code, -1); #endif if (remove_source_files == 1) goto return_with_success; @@ -1371,8 +1370,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, statret = 1; } #ifdef SUPPORT_HARD_LINKS - if (preserve_hard_links && F_HLINK_NOT_LAST(file)) + if (preserve_hard_links && F_HLINK_NOT_LAST(file)) { + cur_flist->in_progress++; goto cleanup; + } #endif if (do_symlink(sl, fname) != 0) { rsyserr(FERROR, errno, "symlink %s -> \"%s\" failed", @@ -1387,7 +1388,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, rprintf(code, "%s -> %s\n", fname, sl); #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) - finish_hard_link(file, fname, NULL, itemizing, code, -1); + finish_hard_link(file, fname, ndx, NULL, itemizing, code, -1); #endif /* This does not check remove_source_files == 1 * because this is one of the items that the old @@ -1423,7 +1424,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, itemize(fname, file, ndx, 0, &sx, 0, 0, NULL); #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) - finish_hard_link(file, fname, &sx.st, itemizing, code, -1); + finish_hard_link(file, fname, ndx, &sx.st, itemizing, code, -1); #endif if (remove_source_files == 1) goto return_with_success; @@ -1448,8 +1449,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, statret = 1; } #ifdef SUPPORT_HARD_LINKS - if (preserve_hard_links && F_HLINK_NOT_LAST(file)) + if (preserve_hard_links && F_HLINK_NOT_LAST(file)) { + cur_flist->in_progress++; goto cleanup; + } #endif if (verbose > 2) { rprintf(FINFO, "mknod(%s, 0%o, [%ld,%ld])\n", @@ -1469,7 +1472,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, rprintf(code, "%s\n", fname); #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) - finish_hard_link(file, fname, NULL, itemizing, code, -1); + finish_hard_link(file, fname, ndx, NULL, itemizing, code, -1); #endif if (remove_source_files == 1) goto return_with_success; @@ -1568,8 +1571,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, if (statret != 0) { #ifdef SUPPORT_HARD_LINKS - if (preserve_hard_links && F_HLINK_NOT_LAST(file)) + if (preserve_hard_links && F_HLINK_NOT_LAST(file)) { + cur_flist->in_progress++; goto cleanup; + } #endif if (stat_errno == ENOENT) goto notify_others; @@ -1578,7 +1583,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, goto cleanup; } - if (append_mode > 0 && sx.st.st_size > F_LENGTH(file)) + if (append_mode > 0 && sx.st.st_size >= F_LENGTH(file)) goto cleanup; if (fnamecmp_type <= FNAMECMP_BASIS_DIR_HIGH) @@ -1595,7 +1600,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, itemize(fnamecmp, file, ndx, statret, &sx, 0, 0, NULL); #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) - finish_hard_link(file, fname, &sx.st, itemizing, code, -1); + finish_hard_link(file, fname, ndx, &sx.st, itemizing, code, -1); #endif if (remove_source_files != 1) goto cleanup; @@ -1631,8 +1636,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, pretend_missing: /* pretend the file didn't exist */ #ifdef SUPPORT_HARD_LINKS - if (preserve_hard_links && F_HLINK_NOT_LAST(file)) + if (preserve_hard_links && F_HLINK_NOT_LAST(file)) { + cur_flist->in_progress++; goto cleanup; + } #endif statret = real_ret = -1; goto notify_others; @@ -1706,7 +1713,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, if (!do_xfers) { #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) - finish_hard_link(file, fname, &sx.st, itemizing, code, -1); + finish_hard_link(file, fname, ndx, &sx.st, itemizing, code, -1); #endif goto cleanup; } @@ -1794,9 +1801,9 @@ void check_for_finished_files(int itemizing, enum logcode code, int check_redo) while (preserve_hard_links && (ndx = get_hlink_num()) != -1) { flist = flist_for_ndx(ndx); assert(flist != NULL); - file = flist->files[ndx]; + file = flist->files[ndx - flist->ndx_start]; assert(file->flags & FLAG_HLINKED); - finish_hard_link(file, f_name(file, fbuf), NULL, itemizing, code, -1); + finish_hard_link(file, f_name(file, fbuf), ndx, NULL, itemizing, code, -1); } #endif @@ -1879,7 +1886,7 @@ void generate_files(int f_out, const char *local_name) } solo_file = local_name; dir_tweaking = !(list_only || solo_file || dry_run); - need_retouch_dir_times = preserve_times && !omit_dir_times; + need_retouch_dir_times = preserve_times > 1; lull_mod = allowed_lull * 5; if (verbose > 2) @@ -1913,6 +1920,13 @@ void generate_files(int f_out, const char *local_name) dflt_perms = (ACCESSPERMS & ~orig_umask); do { +#ifdef SUPPORT_HARD_LINKS + if (preserve_hard_links && inc_recurse) { + while (!flist_eof && file_total < FILECNT_LOOKAHEAD/2) + wait_for_receiver(); + } +#endif + if (inc_recurse && cur_flist->ndx_start) { struct file_struct *fp = dir_flist->files[cur_flist->parent_ndx]; f_name(fp, fbuf);