X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/112d728f4858fef5c75e0b25bf6f02af8aa5b83c..11832604264e49a6399352020fefa240a881b144:/generator.c diff --git a/generator.c b/generator.c index 71bd5a72..abdbaaf8 100644 --- a/generator.c +++ b/generator.c @@ -98,6 +98,7 @@ int non_perishable_cnt = 0; static int deletion_count = 0; /* used to implement --max-delete */ static FILE *delete_delay_fp = NULL; +static BOOL solo_file = 0; /* For calling delete_item() and delete_dir_contents(). */ #define DEL_RECURSE (1<<1) /* recurse */ @@ -712,6 +713,7 @@ static int find_fuzzy(struct file_struct *file, struct file_list *dirlist) return lowest_j; } +#ifdef SUPPORT_HARD_LINKS void check_for_finished_hlinks(int itemizing, enum logcode code) { struct file_struct *file; @@ -728,6 +730,7 @@ void check_for_finished_hlinks(int itemizing, enum logcode code) hard_link_cluster(file, ndx, itemizing, code, -1); } } +#endif /* This is only called for regular files. We return -2 if we've finished * handling the file, -1 if no dest-linking occurred, or a non-negative @@ -816,8 +819,10 @@ static int try_dests_reg(struct file_struct *file, char *fname, int ndx, rprintf(code, "%s%s\n", fname, match_level == 3 ? " is uptodate" : ""); } +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) hard_link_cluster(file, ndx, itemizing, code, j); +#endif return -2; } @@ -834,6 +839,7 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx, char lnk[MAXPATHLEN]; int best_match = -1; int match_level = 0; + uint32 *devp; enum nonregtype type; int len, j = 0; @@ -891,7 +897,8 @@ static int try_dests_non(struct file_struct *file, char *fname, int ndx, break; case TYPE_SPECIAL: case TYPE_DEVICE: - if (stp->st_rdev != MAKEDEV(F_DMAJOR(file), F_DMINOR(file))) + devp = F_RDEV_P(file); + if (stp->st_rdev != MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp))) continue; break; #ifdef SUPPORT_LINKS @@ -1155,17 +1162,19 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, return; } +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file) && hard_link_check(file, ndx, fname, statret, &st, itemizing, code, HL_CHECK_MASTER)) return; +#endif if (preserve_links && S_ISLNK(file->mode)) { #ifdef SUPPORT_LINKS const char *sl = F_SYMLINK(file); if (safe_symlinks && unsafe_symlink(sl, fname)) { if (verbose) { - if (the_file_list->count == 1) + if (solo_file) fname = f_name(file, NULL); rprintf(FINFO, "ignoring unsafe symlink %s -> \"%s\"\n", @@ -1185,8 +1194,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, if (itemizing) itemize(file, ndx, 0, &st, 0, 0, NULL); set_file_attrs(fname, file, &st, maybe_ATTRS_REPORT); +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) hard_link_cluster(file, ndx, itemizing, code, -1); +#endif if (remove_source_files == 1) goto return_with_success; return; @@ -1211,10 +1222,12 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, } else if (j >= 0) statret = 1; } +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file) && hard_link_check(file, ndx, fname, -1, &st, itemizing, code, HL_SKIP)) return; +#endif if (do_symlink(sl, fname) != 0) { rsyserr(FERROR, errno, "symlink %s -> \"%s\" failed", full_fname(fname), sl); @@ -1226,8 +1239,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, } if (code != FNONE && verbose) rprintf(code, "%s -> %s\n", fname, sl); +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) hard_link_cluster(file, ndx, itemizing, code, -1); +#endif /* This does not check remove_source_files == 1 * because this is one of the items that the old * --remove-sent-files option would remove. */ @@ -1240,7 +1255,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, if ((am_root && preserve_devices && IS_DEVICE(file->mode)) || (preserve_specials && IS_SPECIAL(file->mode))) { - dev_t rdev = MAKEDEV(F_DMAJOR(file), F_DMINOR(file)); + uint32 *devp = F_RDEV_P(file); + dev_t rdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp)); if (statret == 0) { char *t; if (IS_DEVICE(file->mode)) { @@ -1259,8 +1275,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, if (itemizing) itemize(file, ndx, 0, &st, 0, 0, NULL); set_file_attrs(fname, file, &st, maybe_ATTRS_REPORT); +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) hard_link_cluster(file, ndx, itemizing, code, -1); +#endif if (remove_source_files == 1) goto return_with_success; return; @@ -1283,13 +1301,16 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, } else if (j >= 0) statret = 1; } +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file) && hard_link_check(file, ndx, fname, -1, &st, itemizing, code, HL_SKIP)) return; +#endif if (verbose > 2) { - rprintf(FINFO,"mknod(%s,0%o,0x%x)\n", - fname, (int)file->mode, (int)rdev); + rprintf(FINFO, "mknod(%s, 0%o, [%ld,%ld])\n", + fname, (int)file->mode, + (long)major(rdev), (long)minor(rdev)); } if (do_mknod(fname, file->mode, rdev) < 0) { rsyserr(FERROR, errno, "mknod %s failed", @@ -1302,8 +1323,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, } if (code != FNONE && verbose) rprintf(code, "%s\n", fname); +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) hard_link_cluster(file, ndx, itemizing, code, -1); +#endif if (remove_source_files == 1) goto return_with_success; } @@ -1311,7 +1334,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, } if (!S_ISREG(file->mode)) { - if (the_file_list->count == 1) + if (solo_file) fname = f_name(file, NULL); rprintf(FINFO, "skipping non-regular file \"%s\"\n", fname); return; @@ -1319,7 +1342,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, if (max_size && F_LENGTH(file) > max_size) { if (verbose > 1) { - if (the_file_list->count == 1) + if (solo_file) fname = f_name(file, NULL); rprintf(FINFO, "%s is over max-size\n", fname); } @@ -1327,7 +1350,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, } if (min_size && F_LENGTH(file) < min_size) { if (verbose > 1) { - if (the_file_list->count == 1) + if (solo_file) fname = f_name(file, NULL); rprintf(FINFO, "%s is under min-size\n", fname); } @@ -1400,10 +1423,12 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, } if (statret != 0) { +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file) && hard_link_check(file, ndx, fname, statret, &st, itemizing, code, HL_SKIP)) return; +#endif if (stat_errno == ENOENT) goto notify_others; rsyserr(FERROR, stat_errno, "recv_generator: failed to stat %s", @@ -1428,8 +1453,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, 0, 0, NULL); } set_file_attrs(fname, file, &st, maybe_ATTRS_REPORT); +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file)) hard_link_cluster(file, ndx, itemizing, code, -1); +#endif if (remove_source_files != 1) return; return_with_success: @@ -1463,10 +1490,12 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, full_fname(fnamecmp)); pretend_missing: /* pretend the file didn't exist */ +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links && F_IS_HLINKED(file) && hard_link_check(file, ndx, fname, statret, &st, itemizing, code, HL_SKIP)) return; +#endif statret = real_ret = -1; goto notify_others; } @@ -1523,8 +1552,10 @@ 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)) hard_link_cluster(file, ndx, itemizing, code, -1); +#endif return; } if (read_batch) @@ -1582,6 +1613,7 @@ void generate_files(int f_out, struct file_list *flist, char *local_name) maybe_ATTRS_REPORT = ATTRS_REPORT; code = FINFO; } + solo_file = local_name != NULL; if (verbose > 2) { rprintf(FINFO, "generator starting pid=%ld count=%d\n", @@ -1639,8 +1671,10 @@ void generate_files(int f_out, struct file_list *flist, char *local_name) } #endif +#ifdef SUPPORT_HARD_LINKS if (preserve_hard_links) check_for_finished_hlinks(itemizing, code); +#endif if (allowed_lull && !(i % lull_mod)) maybe_send_keepalive(); @@ -1661,7 +1695,7 @@ void generate_files(int f_out, struct file_list *flist, char *local_name) make_backups = 0; /* avoid a duplicate backup for inplace processing */ if (verbose > 2) - rprintf(FINFO,"generate_files phase=%d\n",phase); + rprintf(FINFO, "generate_files phase=%d\n", phase); write_int(f_out, NDX_DONE); @@ -1683,7 +1717,7 @@ void generate_files(int f_out, struct file_list *flist, char *local_name) make_backups = save_make_backups; if (verbose > 2) - rprintf(FINFO,"generate_files phase=%d\n",phase); + rprintf(FINFO, "generate_files phase=%d\n", phase); write_int(f_out, NDX_DONE); /* Reduce round-trip lag-time for a useless delay-updates phase. */ @@ -1748,5 +1782,5 @@ void generate_files(int f_out, struct file_list *flist, char *local_name) } if (verbose > 2) - rprintf(FINFO,"generate_files finished\n"); + rprintf(FINFO, "generate_files finished\n"); }