Mentioned new --keep-dirlinks option.
[rsync/rsync.git] / options.c
index e11d20e..2f73bae 100644 (file)
--- a/options.c
+++ b/options.c
@@ -38,6 +38,7 @@ int make_backups = 0;
 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;
@@ -83,6 +84,7 @@ int safe_symlinks = 0;
 int copy_unsafe_links = 0;
 int size_only = 0;
 int bwlimit = 0;
+size_t bwlimit_writemax = 0;
 int delete_after = 0;
 int only_existing = 0;
 int opt_ignore_existing = 0;
@@ -231,6 +233,7 @@ void usage(enum logcode F)
   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");
@@ -337,6 +340,7 @@ static struct poptOption long_options[] = {
   {"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,   &copy_links, 0, 0, 0 },
   {"whole-file",      'W', POPT_ARG_VAL,    &whole_file, 1, 0, 0 },
@@ -514,26 +518,30 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                        break;
 
                case OPT_EXCLUDE:
+                       if (am_server || sanitize_paths)
+                               return 0; /* Impossible... */
                        add_exclude(&exclude_list, poptGetOptArg(pc), 0);
                        break;
 
                case OPT_INCLUDE:
+                       if (am_server || sanitize_paths)
+                               return 0; /* Impossible... */
                        add_exclude(&exclude_list, poptGetOptArg(pc),
                                    XFLG_DEF_INCLUDE);
                        break;
 
                case OPT_EXCLUDE_FROM:
+                       if (am_server || sanitize_paths)
+                               return 0; /* Impossible... */
                        arg = poptGetOptArg(pc);
-                       if (sanitize_paths)
-                               arg = alloc_sanitize_path(arg, curr_dir);
                        add_exclude_file(&exclude_list, arg,
                                         XFLG_FATAL_ERRORS);
                        break;
 
                case OPT_INCLUDE_FROM:
+                       if (am_server || sanitize_paths)
+                               return 0; /* Impossible... */
                        arg = poptGetOptArg(pc);
-                       if (sanitize_paths)
-                               arg = alloc_sanitize_path(arg, curr_dir);
                        add_exclude_file(&exclude_list, arg,
                                         XFLG_FATAL_ERRORS | XFLG_DEF_INCLUDE);
                        break;
@@ -724,6 +732,12 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
        if (do_progress && !verbose)
                verbose = 1;
 
+       if (bwlimit) {
+               bwlimit_writemax = (size_t)bwlimit * 128;
+               if (bwlimit_writemax < 512)
+                       bwlimit_writemax = 512;
+       }
+
        if (files_from) {
                char *colon;
                if (*argc != 2 && !(am_server && am_sender && *argc == 1)) {
@@ -807,6 +821,8 @@ void server_options(char **args,int *argc)
                argstr[x++] = 'l';
        if (copy_links)
                argstr[x++] = 'L';
+       if (keep_dirlinks && am_sender)
+               argstr[x++] = 'K';
 
        if (whole_file > 0)
                argstr[x++] = 'W';