-/* -*- c-file-style: "linux" -*-
+/*
+ * Command-line (and received via daemon-socket) option parsing.
*
- * Copyright (C) 1998-2001 by Andrew Tridgell <tridge@samba.org>
- * Copyright (C) 2000, 2001, 2002 by Martin Pool <mbp@samba.org>
+ * Copyright (C) 1998-2001 Andrew Tridgell <tridge@samba.org>
+ * Copyright (C) 2000, 2001, 2002 Martin Pool <mbp@samba.org>
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006 Wayne Davison
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "rsync.h"
int append_mode = 0;
int keep_dirlinks = 0;
+int copy_dirlinks = 0;
int copy_links = 0;
int preserve_links = 0;
int preserve_hard_links = 0;
int dry_run = 0;
int do_xfers = 1;
int ignore_times = 0;
-int saw_delete_opt = 0;
-int saw_delete_excluded_opt = 0;
int delete_mode = 0;
int delete_during = 0;
int delete_before = 0;
int am_sender = 0;
int am_generator = 0;
int am_starting_up = 1;
-int orig_umask = 0;
int relative_paths = -1;
int implied_dirs = 1;
int numeric_ids = 0;
rprintf(F," -L, --copy-links transform symlink into referent file/dir\n");
rprintf(F," --copy-unsafe-links only \"unsafe\" symlinks are transformed\n");
rprintf(F," --safe-links ignore symlinks that point outside the source tree\n");
- rprintf(F," -H, --hard-links preserve hard links\n");
+ rprintf(F," -k, --copy-dirlinks transform symlink to a dir into referent dir\n");
rprintf(F," -K, --keep-dirlinks treat symlinked dir on receiver as dir\n");
+ rprintf(F," -H, --hard-links preserve hard links\n");
rprintf(F," -p, --perms preserve permissions\n");
rprintf(F," -E, --executability preserve the file's executability\n");
rprintf(F," --chmod=CHMOD change destination permissions\n");
rprintf(F," --stats give some file-transfer stats\n");
rprintf(F," -8, --8-bit-output leave high-bit chars unescaped in output\n");
rprintf(F," -h, --human-readable output numbers in a human-readable format\n");
- rprintf(F," --si like human-readable, but use powers of 1000\n");
rprintf(F," --progress show progress during transfer\n");
rprintf(F," -P same as --partial --progress\n");
rprintf(F," -i, --itemize-changes output a change-summary for all updates\n");
rprintf(F," -6, --ipv6 prefer IPv6\n");
#endif
rprintf(F," --version print version number\n");
- rprintf(F," --help show this help screen\n");
+ rprintf(F,"(-h) --help show this help (-h works with no other options)\n");
rprintf(F,"\nUse \"rsync --daemon --help\" to see the daemon-mode command-line options.\n");
rprintf(F,"Please see the rsync(1) and rsyncd.conf(5) man pages for full documentation.\n");
{"no-v", 0, POPT_ARG_VAL, &verbose, 0, 0, 0 },
{"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
{"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
- {"human-readable", 'h', POPT_ARG_VAL, &human_readable, 1, 0, 0},
- {"si", 0, POPT_ARG_VAL, &human_readable, 2, 0, 0},
+ {"human-readable", 'h', POPT_ARG_NONE, 0, 'h', 0, 0},
{"dry-run", 'n', POPT_ARG_NONE, &dry_run, 0, 0, 0 },
{"archive", 'a', POPT_ARG_NONE, 0, 'a', 0, 0 },
{"recursive", 'r', POPT_ARG_VAL, &recurse, 2, 0, 0 },
{"copy-links", 'L', POPT_ARG_NONE, ©_links, 0, 0, 0 },
{"copy-unsafe-links",0, POPT_ARG_NONE, ©_unsafe_links, 0, 0, 0 },
{"safe-links", 0, POPT_ARG_NONE, &safe_symlinks, 0, 0, 0 },
+ {"copy-dirlinks", 'k', POPT_ARG_NONE, ©_dirlinks, 0, 0, 0 },
{"keep-dirlinks", 'K', POPT_ARG_NONE, &keep_dirlinks, 0, 0, 0 },
- {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links, 0, 0, 0 },
+ {"hard-links", 'H', POPT_ARG_VAL, &preserve_hard_links, 1, 0, 0 },
+ {"no-hard-links", 0, POPT_ARG_VAL, &preserve_hard_links, 0, 0, 0 },
+ {"no-H", 0, POPT_ARG_VAL, &preserve_hard_links, 0, 0, 0 },
{"relative", 'R', POPT_ARG_VAL, &relative_paths, 1, 0, 0 },
{"no-relative", 0, POPT_ARG_VAL, &relative_paths, 0, 0, 0 },
{"no-R", 0, POPT_ARG_VAL, &relative_paths, 0, 0, 0 },
+ {"implied-dirs", 0, POPT_ARG_VAL, &implied_dirs, 1, 0, 0 },
{"no-implied-dirs", 0, POPT_ARG_VAL, &implied_dirs, 0, 0, 0 },
{"chmod", 0, POPT_ARG_STRING, 0, OPT_CHMOD, 0, 0 },
{"ignore-times", 'I', POPT_ARG_NONE, &ignore_times, 0, 0, 0 },
}
rprintf(FERROR, RSYNC_NAME ": %s", err_buf);
+ msleep(20);
}
case OPT_INCLUDE_FROM:
arg = poptGetOptArg(pc);
if (sanitize_paths)
- arg = sanitize_path(NULL, arg, NULL, 0);
+ arg = sanitize_path(NULL, arg, NULL, 0, NULL);
if (server_filter_list.head) {
- char *cp = (char *)arg;
+ char *cp = strdup(arg);
+ if (!cp)
+ out_of_memory("parse_arguments");
if (!*cp)
goto options_rejected;
clean_fname(cp, 1);
if (check_filter(&server_filter_list, cp, 0) < 0)
goto options_rejected;
+ free(cp);
}
parse_filter_file(&filter_list, arg,
opt == OPT_INCLUDE_FROM ? MATCHFLG_INCLUDE : 0,
preserve_devices = preserve_specials = 0;
break;
+ case 'h':
+ human_readable++;
+ break;
+
case 'i':
itemize_changes++;
break;
MAX_BASIS_DIRS, dest_option);
return 0;
}
- arg = poptGetOptArg(pc);
- if (sanitize_paths)
- arg = sanitize_path(NULL, arg, NULL, 0);
- basis_dir[basis_dir_cnt++] = (char *)arg;
+ /* We defer sanitizing this arg until we know what
+ * our destination directory is going to be. */
+ basis_dir[basis_dir_cnt++] = (char *)poptGetOptArg(pc);
break;
case OPT_CHMOD:
}
if (human_readable && *argc == 2) {
+ /* Allow the old meaning of 'h' (--help) on its own. */
usage(FINFO);
exit_cleanup(0);
}
}
delete_mode = delete_before = 1;
}
- saw_delete_opt = delete_mode;
- saw_delete_excluded_opt = delete_excluded;
- if (!xfer_dirs) {
- delete_before = delete_during = delete_after = 0;
- delete_mode = delete_excluded = 0;
+ if (!xfer_dirs && delete_mode) {
+ snprintf(err_buf, sizeof err_buf,
+ "--delete does not work without -r or -d.\n");
+ return 0;
}
if (delete_mode && refused_delete) {
if (sanitize_paths) {
int i;
for (i = *argc; i-- > 0; )
- (*argv)[i] = sanitize_path(NULL, (*argv)[i], "", 0);
+ (*argv)[i] = sanitize_path(NULL, (*argv)[i], "", 0, NULL);
if (tmpdir)
- tmpdir = sanitize_path(NULL, tmpdir, NULL, 0);
+ tmpdir = sanitize_path(NULL, tmpdir, NULL, 0, NULL);
if (partial_dir)
- partial_dir = sanitize_path(NULL, partial_dir, NULL, 0);
+ partial_dir = sanitize_path(NULL, partial_dir, NULL, 0, NULL);
if (backup_dir)
- backup_dir = sanitize_path(NULL, backup_dir, NULL, 0);
+ backup_dir = sanitize_path(NULL, backup_dir, NULL, 0, NULL);
}
if (server_filter_list.head && !am_sender) {
struct filter_list_struct *elp = &server_filter_list;
- int i;
if (tmpdir) {
if (!*tmpdir)
goto options_rejected;
if (check_filter(elp, partial_dir, 1) < 0)
goto options_rejected;
}
- for (i = 0; i < basis_dir_cnt; i++) {
- if (!*basis_dir[i])
- goto options_rejected;
- clean_fname(basis_dir[i], 1);
- if (check_filter(elp, basis_dir[i], 1) < 0)
- goto options_rejected;
- }
if (backup_dir) {
if (!*backup_dir)
goto options_rejected;
}
} else {
if (sanitize_paths)
- files_from = sanitize_path(NULL, files_from, NULL, 0);
+ files_from = sanitize_path(NULL, files_from, NULL, 0, NULL);
if (server_filter_list.head) {
if (!*files_from)
goto options_rejected;
argstr[x++] = 'b';
if (update_only)
argstr[x++] = 'u';
- if (!do_xfers) /* NOT "dry_run"! */
+ if (!do_xfers) /* Note: NOT "dry_run"! */
argstr[x++] = 'n';
if (preserve_links)
argstr[x++] = 'l';
- if (copy_links)
- argstr[x++] = 'L';
if (xfer_dirs > (recurse || !delete_mode || !am_sender))
argstr[x++] = 'd';
if (am_sender) {
argstr[x++] = 'm';
if (omit_dir_times == 2)
argstr[x++] = 'O';
+ } else {
+ if (copy_links)
+ argstr[x++] = 'L';
+ if (copy_dirlinks)
+ argstr[x++] = 'k';
}
if (whole_file > 0)
args[ac++] = "--only-write-batch=X";
if (am_root > 1)
args[ac++] = "--super";
+ if (size_only)
+ args[ac++] = "--size-only";
}
- if (size_only)
- args[ac++] = "--size-only";
-
if (modify_window_set) {
if (asprintf(&arg, "--modify-window=%d", modify_window) < 0)
goto oom;