Got rid of calls to the (soon to vanish) safe_fname() function.
[rsync/rsync.git] / options.c
index cf82daa..a95338c 100644 (file)
--- a/options.c
+++ b/options.c
@@ -303,8 +303,8 @@ void usage(enum logcode F)
   rprintf(F," -B, --block-size=SIZE       force a fixed checksum block-size\n");
   rprintf(F," -e, --rsh=COMMAND           specify the remote shell to use\n");
   rprintf(F,"     --rsync-path=PROGRAM    specify the rsync to run on the remote machine\n");
+  rprintf(F,"     --existing              ignore non-existing files on receiving side\n");
   rprintf(F,"     --ignore-existing       ignore files that already exist on receiving side\n");
-  rprintf(F,"     --ignore-non-existing   ignore files that don't exist on receiving side\n");
   rprintf(F,"     --remove-sent-files     sent files/symlinks are removed from sending side\n");
   rprintf(F,"     --del                   an alias for --delete-during\n");
   rprintf(F,"     --delete                delete files that don't exist on the sending side\n");
@@ -431,8 +431,8 @@ static struct poptOption long_options[] = {
   {"one-file-system", 'x', POPT_ARG_NONE,   &one_file_system, 0, 0, 0 },
   {"update",          'u', POPT_ARG_NONE,   &update_only, 0, 0, 0 },
   {"existing",         0,  POPT_ARG_NONE,   &ignore_non_existing, 0, 0, 0 },
-  {"ignore-existing",  0,  POPT_ARG_NONE,   &ignore_existing, 0, 0, 0 },
   {"ignore-non-existing",0,POPT_ARG_NONE,   &ignore_non_existing, 0, 0, 0 },
+  {"ignore-existing",  0,  POPT_ARG_NONE,   &ignore_existing, 0, 0, 0 },
   {"max-size",         0,  POPT_ARG_STRING, &max_size_arg, OPT_MAX_SIZE, 0, 0 },
   {"min-size",         0,  POPT_ARG_STRING, &min_size_arg, OPT_MIN_SIZE, 0, 0 },
   {"sparse",          'S', POPT_ARG_NONE,   &sparse_files, 0, 0, 0 },
@@ -670,41 +670,44 @@ static int count_args(const char **argv)
 
 static OFF_T parse_size_arg(char **size_arg, char def_suf)
 {
-       int mult, make_compatible = 0;
-       const char *arg, *p;
-       OFF_T size = 0;
+       int reps, mult, make_compatible = 0;
+       const char *arg;
+       OFF_T size = 1;
 
        for (arg = *size_arg; isdigit(*(uchar*)arg); arg++) {}
        if (*arg == '.')
                for (arg++; isdigit(*(uchar*)arg); arg++) {}
-       if (*arg && (arg[1] == 'b' || arg[1] == 'B'))
-               mult = 1000, make_compatible = 1;
-       else
-               mult = 1024;
-       if ((p = strstr(arg, "+1")) != NULL
-        || (p = strstr(arg, "-1")) != NULL) {
-               if (p[2] != '\0')
-                       return -1;
-               size = atoi(p);
-               make_compatible = 1;
-       }
-       switch (*arg && arg != p ? *arg : def_suf) {
+       switch (*arg && *arg != '+' && *arg != '-' ? *arg++ : def_suf) {
        case 'b': case 'B':
-               size += atof(*size_arg);
+               reps = 0;
                break;
        case 'k': case 'K':
-               size += atof(*size_arg) * mult;
+               reps = 1;
                break;
        case 'm': case 'M':
-               size += atof(*size_arg) * mult*mult;
+               reps = 2;
                break;
        case 'g': case 'G':
-               size += atof(*size_arg) * mult*mult*mult;
+               reps = 3;
                break;
        default:
-               size = -1;
-               break;
+               return -1;
        }
+       if (*arg == 'b' || *arg == 'B')
+               mult = 1000, make_compatible = 1, arg++;
+       else if (!*arg || *arg == '+' || *arg == '-')
+               mult = 1024;
+       else if (strncasecmp(arg, "ib", 2) == 0)
+               mult = 1024, arg += 2;
+       else
+               return -1;
+       while (reps--)
+               size *= mult;
+       size *= atof(*size_arg);
+       if ((*arg == '+' || *arg == '-') && arg[1] == '1')
+               size += atoi(arg), make_compatible = 1, arg += 2;
+       if (*arg)
+               return -1;
        if (size > 0 && make_compatible) {
                /* We convert this manually because we may need %lld precision,
                 * and that's not a portable sprintf() escape. */
@@ -1196,21 +1199,23 @@ 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 && !am_sender) {
-                       rprintf(FINFO, "backup_dir is %s\n",
-                               safe_fname(backup_dir_buf));
-               }
+               if (verbose > 1 && !am_sender)
+                       rprintf(FINFO, "backup_dir is %s\n", backup_dir_buf);
        } else if (!backup_suffix_len && (!am_server || !am_sender)) {
                snprintf(err_buf, sizeof err_buf,
                        "--suffix cannot be a null string without --backup-dir\n");
                return 0;
+       } else if (delete_mode && !delete_excluded) {
+               snprintf(backup_dir_buf, sizeof backup_dir_buf,
+                       "P *%s", backup_suffix);
+               parse_rule(&filter_list, backup_dir_buf, 0, 0);
        }
        if (make_backups && !backup_dir)
                omit_dir_times = 1;
 
        if (chmod_mode && !(chmod_modes = parse_chmod(chmod_mode))) {
                snprintf(err_buf, sizeof err_buf,
-                   "Invalid argument passed to chmod\n");
+                   "Invalid argument passed to --chmod\n");
                return 0;
        }