X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/3e35c34b6b496763799153bff6d4b082628752a1..40564811ee6c9c67bb3a0852ff2f031ed6d879c3:/generator.c diff --git a/generator.c b/generator.c index 80533484..a804ca9f 100644 --- a/generator.c +++ b/generator.c @@ -26,6 +26,7 @@ extern int verbose; extern int dry_run; extern int relative_paths; +extern int keep_dirlinks; extern int preserve_links; extern int am_root; extern int preserve_devices; @@ -51,6 +52,7 @@ extern int list_only; extern int only_existing; extern int orig_umask; extern int safe_symlinks; +extern unsigned int block_size; extern struct exclude_list_struct server_exclude_list; @@ -121,11 +123,11 @@ void write_sum_head(int f, struct sum_struct *sum) write_int(f, sum->remainder); } -/* +/* * set (initialize) the size entries in the per-file sum_struct - * calulating dynamic block ans checksum sizes. + * calculating dynamic block and checksum sizes. * - * This is only called from generate_and_send_sums() but is a seperate + * This is only called from generate_and_send_sums() but is a separate * function to encapsulate the logic. * * The block size is a rounded square root of file length. @@ -141,7 +143,6 @@ void write_sum_head(int f, struct sum_struct *sum) static void sum_sizes_sqroot(struct sum_struct *sum, uint64 len) { - extern unsigned int block_size; unsigned int blength; int s2length; uint32 c; @@ -293,7 +294,7 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out) return; } - statret = link_stat(fname,&st); + statret = link_stat(fname, &st, keep_dirlinks && S_ISDIR(file->mode)); if (only_existing && statret == -1 && errno == ENOENT) { /* we only want to update existing files */ @@ -319,7 +320,8 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out) * we need to delete it. If it doesn't exist, then * recursively create it. */ - if (dry_run) return; /* XXXX -- might cause inaccuracies?? -- mbp */ + if (dry_run) + return; /* TODO: causes inaccuracies -- fix */ if (statret == 0 && !S_ISDIR(st.st_mode)) { if (robust_unlink(fname) != 0) { rsyserr(FERROR, errno, @@ -338,9 +340,10 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out) full_fname(fname)); } } - /* f_out is set to -1 when doing final directory - permission and modification time repair */ - if (set_perms(fname,file,NULL,0) && verbose && (f_out != -1)) + /* f_out is set to -1 when doing final directory-permission + * and modification-time repair. */ + if (set_perms(fname, file, statret ? NULL : &st, 0) + && verbose && f_out != -1) rprintf(FINFO,"%s/\n",fname); return; } @@ -427,7 +430,7 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out) /* try the file at compare_dest instead */ int saveerrno = errno; pathjoin(fnamecmpbuf, sizeof fnamecmpbuf, compare_dest, fname); - statret = link_stat(fnamecmpbuf,&st); + statret = link_stat(fnamecmpbuf, &st, 0); if (!S_ISREG(st.st_mode)) statret = -1; if (statret == -1) @@ -452,7 +455,8 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out) return; if (errno == ENOENT) { write_int(f_out,i); - if (!dry_run) write_sum_head(f_out, NULL); + if (!dry_run) + write_sum_head(f_out, NULL); } else if (verbose > 1) { rsyserr(FERROR, errno, "recv_generator: failed to open %s", @@ -470,7 +474,8 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out) if (preserve_hard_links && hard_link_check(file, HL_SKIP)) return; write_int(f_out,i); - if (!dry_run) write_sum_head(f_out, NULL); + if (!dry_run) + write_sum_head(f_out, NULL); return; } @@ -534,7 +539,8 @@ void recv_generator(char *fname, struct file_struct *file, int i, int f_out) generate_and_send_sums(mapbuf, st.st_size, f_out); close(fd); - if (mapbuf) unmap_file(mapbuf); + if (mapbuf) + unmap_file(mapbuf); } @@ -612,7 +618,8 @@ void generate_files(int f, struct file_list *flist, char *local_name) * modified during the transfer */ for (i = 0; i < flist->count; i++) { struct file_struct *file = flist->files[i]; - if (!file->basename || !S_ISDIR(file->mode)) continue; + if (!file->basename || !S_ISDIR(file->mode)) + continue; recv_generator(local_name ? local_name : f_name(file), file, i, -1); }