Make idev, hlink and file_struct + strings use allocation
[rsync/rsync.git] / options.c
index ce51386..5db7d62 100644 (file)
--- a/options.c
+++ b/options.c
@@ -46,17 +46,17 @@ int preserve_gid = 0;
 int preserve_times = 0;
 int update_only = 0;
 int cvs_exclude = 0;
-int dry_run=0;
-int local_server=0;
-int ignore_times=0;
-int delete_mode=0;
-int delete_excluded=0;
-int one_file_system=0;
+int dry_run = 0;
+int local_server = 0;
+int ignore_times = 0;
+int delete_mode = 0;
+int delete_excluded = 0;
+int one_file_system = 0;
 int protocol_version = PROTOCOL_VERSION;
-int sparse_files=0;
-int do_compression=0;
-int am_root=0;
-int orig_umask=0;
+int sparse_files = 0;
+int do_compression = 0;
+int am_root = 0;
+int orig_umask = 0;
 int relative_paths = -1;
 int implied_dirs = 1;
 int numeric_ids = 0;
@@ -74,20 +74,21 @@ int eol_nulls = 0;
 int recurse = 0;
 int am_daemon = 0;
 int daemon_over_rsh = 0;
-int do_stats=0;
-int do_progress=0;
-int keep_partial=0;
-int safe_symlinks=0;
-int copy_unsafe_links=0;
-int size_only=0;
-int bwlimit=0;
-int delete_after=0;
-int only_existing=0;
-int opt_ignore_existing=0;
-int max_delete=0;
-int ignore_errors=0;
-int modify_window=0;
-int blocking_io=-1;
+int do_stats = 0;
+int do_progress = 0;
+int keep_partial = 0;
+int safe_symlinks = 0;
+int copy_unsafe_links = 0;
+int size_only = 0;
+int bwlimit = 0;
+int delete_after = 0;
+int only_existing = 0;
+int opt_ignore_existing = 0;
+int max_delete = 0;
+int ignore_errors = 0;
+int modify_window = 0;
+int blocking_io = -1;
+int checksum_seed = 0;
 unsigned int block_size = 0;
 
 
@@ -125,6 +126,7 @@ int quiet = 0;
 int always_checksum = 0;
 int list_only = 0;
 
+#define FIXED_CHECKSUM_SEED 32761
 #define MAX_BATCH_PREFIX_LEN 256       /* Must be less than MAXPATHLEN-13 */
 char *batch_prefix = NULL;
 
@@ -168,7 +170,7 @@ static void print_rsync_version(enum logcode f)
        rprintf(f, "<http://rsync.samba.org/>\n");
        rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
                "%shard links, %ssymlinks, batchfiles, \n",
-               (int) (sizeof(OFF_T) * 8),
+               (int) (sizeof (OFF_T) * 8),
                got_socketpair, hardlinks, links);
 
        /* Note that this field may not have type ino_t.  It depends
@@ -176,8 +178,8 @@ static void print_rsync_version(enum logcode f)
         * macros. */
        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 dumstat->st_ino * 8),
+               (int) (sizeof (INO64_T) * 8));
 #ifdef MAINTAINER_MODE
        rprintf(f, "              panic action: \"%s\"\n",
                get_panic_action());
@@ -418,11 +420,13 @@ static int check_refuse_options(char *ref, int opt)
        char *p;
        const char *name;
 
-       for (i=0; long_options[i].longName; i++) {
-               if (long_options[i].val == opt) break;
+       for (i = 0; long_options[i].longName; i++) {
+               if (long_options[i].val == opt)
+                       break;
        }
 
-       if (!long_options[i].longName) return 0;
+       if (!long_options[i].longName)
+               return 0;
 
        name = long_options[i].longName;
        len = strlen(name);
@@ -430,7 +434,7 @@ static int check_refuse_options(char *ref, int opt)
        while ((p = strstr(ref,name))) {
                if ((p==ref || p[-1]==' ') &&
                    (p[len] == ' ' || p[len] == 0)) {
-                       snprintf(err_buf,sizeof(err_buf),
+                       snprintf(err_buf, sizeof err_buf,
                                 "The '%s' option is not supported by this server\n", name);
                        return 1;
                }
@@ -472,9 +476,8 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
        pc = poptGetContext(RSYNC_NAME, *argc, *argv, long_options, 0);
 
        while ((opt = poptGetNextOpt(pc)) != -1) {
-               if (ref) {
-                       if (check_refuse_options(ref, opt)) return 0;
-               }
+               if (ref && check_refuse_options(ref, opt))
+                       return 0;
 
                /* most options are handled automatically by popt;
                 * only special cases are returned and listed here. */
@@ -530,7 +533,8 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                        break;
 
                case 'q':
-                       if (frommain) quiet++;
+                       if (frommain)
+                               quiet++;
                        break;
 
                case OPT_SENDER:
@@ -549,11 +553,13 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
                case OPT_WRITE_BATCH:
                        /* popt stores the filename in batch_prefix for us */
                        write_batch = 1;
+                       checksum_seed = FIXED_CHECKSUM_SEED;
                        break;
 
                case OPT_READ_BATCH:
                        /* popt stores the filename in batch_prefix for us */
                        read_batch = 1;
+                       checksum_seed = FIXED_CHECKSUM_SEED;
                        break;
 
                case OPT_LINK_DEST:
@@ -571,7 +577,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
 
 
                default:
-                       snprintf(err_buf, sizeof(err_buf),
+                       snprintf(err_buf, sizeof err_buf,
                                 "%s%s: %s\n",
                                 am_server ? "on remote machine: " : "",
                                 poptBadOption(pc, POPT_BADOPTION_NOALIAS),
@@ -720,13 +726,7 @@ void server_options(char **args,int *argc)
 {
        int ac = *argc;
        static char argstr[50];
-       static char bsize[30];
-       static char iotime[30];
-       static char mdelete[30];
-       static char mwindow[30];
-       static char bw[50];
-       /* Leave room for ``--(write|read)-batch='' */
-       static char fext[MAX_BATCH_PREFIX_LEN + 15];
+       char *arg;
 
        int i, x;
 
@@ -747,7 +747,7 @@ void server_options(char **args,int *argc)
 
        x = 1;
        argstr[0] = '-';
-       for (i=0;i<verbose;i++)
+       for (i = 0; i < verbose; i++)
                argstr[x++] = 'v';
 
        /* the -q option is intentionally left out */
@@ -806,37 +806,38 @@ void server_options(char **args,int *argc)
 
        argstr[x] = 0;
 
-       if (x != 1) args[ac++] = argstr;
+       if (x != 1)
+               args[ac++] = argstr;
 
        if (block_size) {
-               snprintf(bsize, sizeof bsize, "-B%u", block_size);
-               args[ac++] = bsize;
+               if (asprintf(&arg, "-B%u", block_size) < 0)
+                       goto oom;
+               args[ac++] = arg;
        }
 
        if (max_delete && am_sender) {
-               snprintf(mdelete,sizeof(mdelete),"--max-delete=%d",max_delete);
-               args[ac++] = mdelete;
+               if (asprintf(&arg, "--max-delete=%d", max_delete) < 0)
+                       goto oom;
+               args[ac++] = arg;
        }
 
-       if (batch_prefix != NULL) {
-               char *fmt = "";
-               if (write_batch)
-                       fmt = "--write-batch=%s";
-               else
-               if (read_batch)
-                       fmt = "--read-batch=%s";
-               snprintf(fext,sizeof(fext),fmt,batch_prefix);
-               args[ac++] = fext;
+       if (batch_prefix) {
+               char *r_or_w = write_batch ? "write" : "read";
+               if (asprintf(&arg, "--%s-batch=%s", r_or_w, batch_prefix) < 0)
+                       goto oom;
+               args[ac++] = arg;
        }
 
        if (io_timeout) {
-               snprintf(iotime,sizeof(iotime),"--timeout=%d",io_timeout);
-               args[ac++] = iotime;
+               if (asprintf(&arg, "--timeout=%d", io_timeout) < 0)
+                       goto oom;
+               args[ac++] = arg;
        }
 
        if (bwlimit) {
-               snprintf(bw,sizeof(bw),"--bwlimit=%d",bwlimit);
-               args[ac++] = bw;
+               if (asprintf(&arg, "--bwlimit=%d", bwlimit) < 0)
+                       goto oom;
+               args[ac++] = arg;
        }
 
        if (backup_dir) {
@@ -845,28 +846,25 @@ void server_options(char **args,int *argc)
        }
 
        /* Only send --suffix if it specifies a non-default value. */
-       if (strcmp(backup_suffix, backup_dir? "" : BACKUP_SUFFIX) != 0) {
-               char *s = new_array(char, 9+backup_suffix_len+1);
-               if (!s)
-                       out_of_memory("server_options");
+       if (strcmp(backup_suffix, backup_dir ? "" : BACKUP_SUFFIX) != 0) {
                /* We use the following syntax to avoid weirdness with '~'. */
-               sprintf(s, "--suffix=%s", backup_suffix);
-               args[ac++] = s;
+               if (asprintf(&arg, "--suffix=%s", backup_suffix) < 0)
+                       goto oom;
+               args[ac++] = arg;
        }
 
-       if (delete_mode && !delete_excluded)
-               args[ac++] = "--delete";
-
        if (delete_excluded)
                args[ac++] = "--delete-excluded";
+       else if (delete_mode)
+               args[ac++] = "--delete";
 
        if (size_only)
                args[ac++] = "--size-only";
 
        if (modify_window_set) {
-               snprintf(mwindow,sizeof(mwindow),"--modify-window=%d",
-                        modify_window);
-               args[ac++] = mwindow;
+               if (asprintf(&arg, "--modify-window=%d", modify_window) < 0)
+                       goto oom;
+               args[ac++] = arg;
        }
 
        if (keep_partial)
@@ -923,6 +921,10 @@ void server_options(char **args,int *argc)
        }
 
        *argc = ac;
+       return;
+
+    oom:
+       out_of_memory("server_options");
 }
 
 /**
@@ -934,12 +936,14 @@ char *find_colon(char *s)
        char *p, *p2;
 
        p = strchr(s,':');
-       if (!p) return NULL;
+       if (!p)
+               return NULL;
 
        /* now check to see if there is a / in the string before the : - if there is then
           discard the colon on the assumption that the : is part of a filename */
        p2 = strchr(s,'/');
-       if (p2 && p2 < p) return NULL;
+       if (p2 && p2 < p)
+               return NULL;
 
        return p;
 }