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;
return;
}
+#if SUPPORT_LINKS
+ if (statret == 0 && keep_dirlinks
+ && S_ISLNK(st.st_mode) && S_ISDIR(file->mode)) {
+ STRUCT_STAT st2;
+ if (do_stat(fname, &st2) == 0 && S_ISDIR(st2.st_mode))
+ st = st2;
+ }
+#endif
+
if (statret == 0 &&
!preserve_perms &&
(S_ISDIR(st.st_mode) == S_ISDIR(file->mode))) {
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;
}
int whole_file = -1;
int archive_mode = 0;
+int keep_dirlinks = 0;
int copy_links = 0;
int preserve_links = 0;
int preserve_hard_links = 0;
rprintf(F," --backup-dir make backups into this directory\n");
rprintf(F," --suffix=SUFFIX backup suffix (default %s w/o --backup-dir)\n",BACKUP_SUFFIX);
rprintf(F," -u, --update update only (don't overwrite newer files)\n");
+ rprintf(F," -K, --keep-dirlinks treat symlinked dir on receiver as dir\n");
rprintf(F," -l, --links copy symlinks as symlinks\n");
rprintf(F," -L, --copy-links copy the referent of all symlinks\n");
rprintf(F," --copy-unsafe-links copy the referent of \"unsafe\" symlinks\n");
{"sparse", 'S', POPT_ARG_NONE, &sparse_files, 0, 0, 0 },
{"cvs-exclude", 'C', POPT_ARG_NONE, &cvs_exclude, 0, 0, 0 },
{"update", 'u', POPT_ARG_NONE, &update_only, 0, 0, 0 },
+ {"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 },
{"links", 'l', POPT_ARG_NONE, &preserve_links, 0, 0, 0 },
{"copy-links", 'L', POPT_ARG_NONE, ©_links, 0, 0, 0 },
{"whole-file", 'W', POPT_ARG_VAL, &whole_file, 1, 0, 0 },
argstr[x++] = 'l';
if (copy_links)
argstr[x++] = 'L';
+ if (keep_dirlinks && am_sender)
+ argstr[x++] = 'K';
if (whole_file > 0)
argstr[x++] = 'W';
--backup-dir make backups into this directory
--suffix=SUFFIX backup suffix (default ~ w/o --backup-dir)
-u, --update update only (don't overwrite newer files)
+ -K, --keep-dirlinks treat symlinked dir on receiver as dir
-l, --links copy symlinks as symlinks
-L, --copy-links copy the referent of all symlinks
--copy-unsafe-links copy the referent of "unsafe" symlinks
regardless of the timestamps. This might change in the future (feel
free to comment on this on the mailing list if you have an opinion).
+dit(bf(-K, --keep-dirlinks)) On the receiving side, if a symlink is
+pointing to a directory, it will be treated as matching a directory
+from the sender.
+
dit(bf(-l, --links)) When symlinks are encountered, recreate the
symlink on the destination.