- Implemented a new handling of the recurse variable: if it is
[rsync/rsync.git] / options.c
index e79f56f..c34047d 100644 (file)
--- a/options.c
+++ b/options.c
@@ -76,6 +76,7 @@ int filesfrom_fd = -1;
 char *remote_filesfrom_file = NULL;
 int eol_nulls = 0;
 int recurse = 0;
+int keep_dirs = 0;
 int am_daemon = 0;
 int daemon_over_rsh = 0;
 int do_stats = 0;
@@ -97,7 +98,7 @@ int modify_window = 0;
 int blocking_io = -1;
 int checksum_seed = 0;
 int inplace = 0;
-unsigned int block_size = 0;
+long block_size = 0; /* "long" because popt can't set an int32. */
 
 
 /** Network address family. **/
@@ -130,8 +131,10 @@ char *rsync_path = RSYNC_PATH;
 char *backup_dir = NULL;
 char backup_dir_buf[MAXPATHLEN];
 int rsync_port = 0;
+int compare_dest = 0;
 int copy_dest = 0;
 int link_dest = 0;
+int basis_dir_cnt = 0;
 
 int verbose = 0;
 int quiet = 0;
@@ -143,9 +146,7 @@ char *batch_name = NULL;
 
 static int daemon_opt;   /* sets am_daemon after option error-reporting */
 static int modify_window_set;
-static int compare_dest = 0;
-static int basis_dir_cnt = 0;
-static char *dest_option;
+static char *dest_option = NULL;
 static char *max_size_arg;
 
 /** Local address to bind.  As a character string because it's
@@ -199,7 +200,7 @@ static void print_rsync_version(enum logcode f)
        rprintf(f, "              %sinplace, %sIPv6, %d-bit system inums, %d-bit internal inums\n",
                have_inplace, ipv6,
                (int) (sizeof dumstat->st_ino * 8),
-               (int) (sizeof (uint64) * 8));
+               (int) (sizeof (int64) * 8));
 #ifdef MAINTAINER_MODE
        rprintf(f, "              panic action: \"%s\"\n",
                get_panic_action());
@@ -248,7 +249,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,"     --inplace               update destination files inplace (SEE MAN PAGE)\n");
+  rprintf(F,"     --inplace               update destination files in-place (SEE MAN PAGE)\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");
@@ -376,7 +377,7 @@ static struct poptOption long_options[] = {
   {"relative",        'R', POPT_ARG_VAL,    &relative_paths, 1, 0, 0 },
   {"no-relative",      0,  POPT_ARG_VAL,    &relative_paths, 0, 0, 0 },
   {"rsh",             'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
-  {"block-size",      'B', POPT_ARG_INT,    &block_size, 0, 0, 0 },
+  {"block-size",      'B', POPT_ARG_LONG,   &block_size, 0, 0, 0 },
   {"max-delete",       0,  POPT_ARG_INT,    &max_delete, 0, 0, 0 },
   {"max-size",         0,  POPT_ARG_STRING, &max_size_arg,  OPT_MAX_SIZE, 0, 0 },
   {"timeout",          0,  POPT_ARG_INT,    &io_timeout, OPT_TIMEOUT, 0, 0 },
@@ -738,7 +739,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                        compare_dest = 1;
                        dest_option = "--compare-dest";
                set_dest_dir:
-                       if (basis_dir_cnt >= MAX_BASIS_DIRS-1) {
+                       if (basis_dir_cnt >= MAX_BASIS_DIRS) {
                                snprintf(err_buf, sizeof err_buf,
                                        "ERROR: at most %d %s args may be specified\n",
                                        MAX_BASIS_DIRS, dest_option);
@@ -850,6 +851,9 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                preserve_uid = 1;
                preserve_devices = 1;
        }
+       if (recurse) {
+               keep_dirs = 1;
+       }
 
        if (relative_paths < 0)
                relative_paths = files_from? 1 : 0;
@@ -958,12 +962,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                         am_server ? "server" : "client");
                return 0;
 #endif
-               if (compare_dest || copy_dest || link_dest) {
-                       snprintf(err_buf, sizeof err_buf,
-                                "--inplace does not yet work with %s\n",
-                                dest_option);
-                       return 0;
-               }
        } else {
                if (keep_partial && !partial_dir)
                        partial_dir = getenv("RSYNC_PARTIAL_DIR");
@@ -1009,6 +1007,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                                return 0;
                        }
                }
+               keep_dirs = 1;
        }
 
        return 1;
@@ -1113,7 +1112,7 @@ void server_options(char **args,int *argc)
                args[ac++] = argstr;
 
        if (block_size) {
-               if (asprintf(&arg, "-B%u", block_size) < 0)
+               if (asprintf(&arg, "-B%lu", block_size) < 0)
                        goto oom;
                args[ac++] = arg;
        }
@@ -1236,7 +1235,11 @@ void server_options(char **args,int *argc)
                        args[ac++] = "--files-from=-";
                        args[ac++] = "--from0";
                }
+               if (!relative_paths)
+                       args[ac++] = "--no-relative";
        }
+       if (!implied_dirs && !am_sender)
+               args[ac++] = "--no-implied-dirs";
 
        *argc = ac;
        return;