Mention new SSH_* vars.
[rsync/rsync.git] / options.c
index 1ee4ee7..69eac5c 100644 (file)
--- a/options.c
+++ b/options.c
@@ -23,7 +23,7 @@
 
 extern int sanitize_paths;
 extern char curr_dir[MAXPATHLEN];
-extern struct exclude_struct **exclude_list;
+extern struct exclude_list_struct exclude_list;
 
 int make_backups = 0;
 
@@ -83,6 +83,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;
@@ -183,7 +184,7 @@ static void print_rsync_version(enum logcode f)
        rprintf(f, "              %sIPv6, %d-bit system inums, %d-bit internal inums\n",
                ipv6,
                (int) (sizeof dumstat->st_ino * 8),
-               (int) (sizeof (INO64_T) * 8));
+               (int) (sizeof (uint64) * 8));
 #ifdef MAINTAINER_MODE
        rprintf(f, "              panic action: \"%s\"\n",
                get_panic_action());
@@ -290,11 +291,12 @@ void usage(enum logcode F)
   rprintf(F,"     --bwlimit=KBPS          limit I/O bandwidth, KBytes per second\n");
   rprintf(F,"     --write-batch=PREFIX    write batch fileset starting with PREFIX\n");
   rprintf(F,"     --read-batch=PREFIX     read batch fileset starting with PREFIX\n");
-  rprintf(F," -h, --help                  show this help screen\n");
+  rprintf(F,"     --checksum-seed=NUM     set block/file checksum seed\n");
 #ifdef INET6
-  rprintf(F," -4                          prefer IPv4\n");
-  rprintf(F," -6                          prefer IPv6\n");
+  rprintf(F," -4  --ipv4                  prefer IPv4\n");
+  rprintf(F," -6  --ipv6                  prefer IPv6\n");
 #endif
+  rprintf(F," -h, --help                  show this help screen\n");
 
   rprintf(F,"\n");
 
@@ -312,8 +314,8 @@ static struct poptOption long_options[] = {
   /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
   {"version",          0,  POPT_ARG_NONE,   0,              OPT_VERSION, 0, 0},
   {"suffix",           0,  POPT_ARG_STRING, &backup_suffix, 0, 0, 0 },
-  {"rsync-path",       0,  POPT_ARG_STRING, &rsync_path,       0, 0, 0 },
-  {"password-file",    0,  POPT_ARG_STRING, &password_file,    0, 0, 0 },
+  {"rsync-path",       0,  POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
+  {"password-file",    0,  POPT_ARG_STRING, &password_file, 0, 0, 0 },
   {"ignore-times",    'I', POPT_ARG_NONE,   &ignore_times, 0, 0, 0 },
   {"size-only",        0,  POPT_ARG_NONE,   &size_only, 0, 0, 0 },
   {"modify-window",    0,  POPT_ARG_INT,    &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
@@ -386,15 +388,16 @@ static struct poptOption long_options[] = {
   {"from0",           '0', POPT_ARG_NONE,   &eol_nulls, 0, 0, 0},
   {"no-implied-dirs",  0,  POPT_ARG_VAL,    &implied_dirs, 0, 0, 0 },
   {"protocol",         0,  POPT_ARG_INT,    &protocol_version, 0, 0, 0 },
+  {"checksum-seed",    0,  POPT_ARG_INT,    &checksum_seed, 0, 0, 0 },
 #ifdef INET6
-  {0,                '4', POPT_ARG_VAL,    &default_af_hint, AF_INET, 0, 0 },
-  {0,                '6', POPT_ARG_VAL,    &default_af_hint, AF_INET6, 0, 0 },
+  {"ipv4",            '4', POPT_ARG_VAL,    &default_af_hint, AF_INET, 0, 0 },
+  {"ipv6",            '6', POPT_ARG_VAL,    &default_af_hint, AF_INET6, 0, 0 },
 #endif
   {0,0,0,0, 0, 0, 0}
 };
 
 
-static char err_buf[100];
+static char err_buf[200];
 
 
 /**
@@ -404,15 +407,17 @@ static char err_buf[100];
  **/
 void option_error(void)
 {
-       if (err_buf[0]) {
-               rprintf(FLOG, "%s", err_buf);
-               rprintf(FERROR, RSYNC_NAME ": %s", err_buf);
-       } else {
-               rprintf (FERROR, "Error parsing options: "
-                        "option may be supported on client but not on server?\n");
-               rprintf (FERROR, RSYNC_NAME ": Error parsing options: "
-                        "option may be supported on client but not on server?\n");
+       int save_daemon = am_daemon;
+
+       if (!err_buf[0]) {
+               strcpy(err_buf, "Error parsing options: "
+                   "option may be supported on client but not on server?\n");
        }
+
+       rwrite(FLOG, err_buf, strlen(err_buf));
+       am_daemon = 0;
+       rprintf(FERROR, RSYNC_NAME ": %s", err_buf);
+       am_daemon = save_daemon;
 }
 
 
@@ -510,29 +515,32 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                        break;
 
                case OPT_EXCLUDE:
-                       add_exclude(&exclude_list, poptGetOptArg(pc),
-                                   ADD_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),
-                                   ADD_INCLUDE);
+                                   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,
-                                        MISSING_FATAL, ADD_EXCLUDE);
+                                        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,
-                                        MISSING_FATAL, ADD_INCLUDE);
+                                        XFLG_FATAL_ERRORS | XFLG_DEF_INCLUDE);
                        break;
 
                case 'h':
@@ -581,7 +589,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                        snprintf(err_buf, sizeof err_buf,
                                 "hard links are not supported on this %s\n",
                                 am_server ? "server" : "client");
-                       rprintf(FERROR, "ERROR: %s", err_buf);
                        return 0;
 #endif
 
@@ -614,7 +621,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                snprintf(err_buf, sizeof err_buf,
                         "symlinks are not supported on this %s\n",
                         am_server ? "server" : "client");
-               rprintf(FERROR, "ERROR: %s", err_buf);
                return 0;
        }
 #endif
@@ -624,7 +630,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                snprintf(err_buf, sizeof err_buf,
                         "hard links are not supported on this %s\n",
                         am_server ? "server" : "client");
-               rprintf(FERROR, "ERROR: %s", err_buf);
                return 0;
        }
 #endif
@@ -688,6 +693,12 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                        files_from = alloc_sanitize_path(files_from, curr_dir);
        }
 
+       if (daemon_opt) {
+               daemon_opt = 0;
+               am_daemon = 1;
+               return 1;
+       }
+
        if (!backup_suffix)
                backup_suffix = backup_dir ? "" : BACKUP_SUFFIX;
        backup_suffix_len = strlen(backup_suffix);
@@ -707,9 +718,9 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                        backup_dir_buf[backup_dir_len++] = '/';
                        backup_dir_buf[backup_dir_len] = '\0';
                }
-               if (verbose > 1)
+               if (verbose > 1 && !am_sender)
                        rprintf(FINFO, "backup_dir is %s\n", backup_dir_buf);
-       } else if (!backup_suffix_len) {
+       } else if (!backup_suffix_len && (!am_server || !am_sender)) {
                rprintf(FERROR,
                        "--suffix cannot be a null string without --backup-dir\n");
                exit_cleanup(RERR_SYNTAX);
@@ -718,6 +729,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)) {
@@ -750,9 +767,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                }
        }
 
-       if (daemon_opt)
-               am_daemon = 1;
-
        return 1;
 }
 
@@ -910,6 +924,12 @@ void server_options(char **args,int *argc)
                args[ac++] = arg;
        }
 
+       if (checksum_seed) {
+               if (asprintf(&arg, "--checksum-seed=%d", checksum_seed) < 0)
+                       goto oom;
+               args[ac++] = arg;
+       }
+
        if (keep_partial)
                args[ac++] = "--partial";