X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/91f4b31fe1031adc3ec3e3066534c9d6be979d21..87c0f9d6b4899729313154ac5752dd86c745ed07:/options.c diff --git a/options.c b/options.c index 14071c87..38bf257e 100644 --- a/options.c +++ b/options.c @@ -148,6 +148,8 @@ char *basis_dir[MAX_BASIS_DIRS+1]; char *config_file = NULL; char *shell_cmd = NULL; char *log_format = NULL; +char *logfile_name = NULL; +char *logfile_format = NULL; char *password_file = NULL; char *rsync_path = RSYNC_PATH; char *backup_dir = NULL; @@ -164,7 +166,9 @@ int verbose = 0; int quiet = 0; int log_before_transfer = 0; int log_format_has_i = 0; +int logfile_format_has_i = 0; int log_format_has_o_or_i = 0; +int logfile_format_has_o_or_i = 0; int always_checksum = 0; int list_only = 0; @@ -311,15 +315,15 @@ 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," --remove-sent-files sent files/symlinks are removed from sending side\n"); + rprintf(F," --existing skip creating new files on receiver\n"); + rprintf(F," --ignore-existing skip updating files that already exist on receiver\n"); + rprintf(F," --remove-sent-files sender removes successfully sent files (non-dirs)\n"); rprintf(F," --del an alias for --delete-during\n"); - rprintf(F," --delete delete files that don't exist on the sending side\n"); + rprintf(F," --delete delete extraneous files from destination dirs\n"); rprintf(F," --delete-before receiver deletes before transfer (default)\n"); rprintf(F," --delete-during receiver deletes during transfer, not before\n"); rprintf(F," --delete-after receiver deletes after transfer, not before\n"); - rprintf(F," --delete-excluded also delete excluded files on the receiving side\n"); + rprintf(F," --delete-excluded also delete excluded files from destination dirs\n"); rprintf(F," --ignore-errors delete even if there are I/O errors\n"); rprintf(F," --force force deletion of directories even if not empty\n"); rprintf(F," --max-delete=NUM don't delete more than NUM files\n"); @@ -361,6 +365,7 @@ void usage(enum logcode F) 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," --log-file=FILE output what we're doing to a log file\n"); rprintf(F," --log-format=FORMAT output filenames using the specified format\n"); rprintf(F," --password-file=FILE read password from FILE\n"); rprintf(F," --list-only list the files instead of copying them\n"); @@ -494,6 +499,7 @@ static struct poptOption long_options[] = { {"partial-dir", 0, POPT_ARG_STRING, &partial_dir, 0, 0, 0 }, {"delay-updates", 0, POPT_ARG_NONE, &delay_updates, 0, 0, 0 }, {"prune-empty-dirs",'m', POPT_ARG_NONE, &prune_empty_dirs, 0, 0, 0 }, + {"log-file", 0, POPT_ARG_STRING, &logfile_name, 0, 0, 0 }, {"log-format", 0, POPT_ARG_STRING, &log_format, 0, 0, 0 }, {"itemize-changes", 'i', POPT_ARG_NONE, 0, 'i', 0, 0 }, {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 }, @@ -544,6 +550,7 @@ static void daemon_usage(enum logcode F) rprintf(F," --config=FILE specify alternate rsyncd.conf file\n"); rprintf(F," --no-detach do not detach from the parent\n"); rprintf(F," --port=PORT listen on alternate port number\n"); + rprintf(F," --log-file=FILE override the \"log file\" setting\n"); rprintf(F," --sockopts=OPTIONS specify custom TCP options\n"); rprintf(F," -v, --verbose increase verbosity\n"); #ifdef INET6 @@ -567,6 +574,7 @@ static struct poptOption long_daemon_options[] = { {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 }, #endif {"detach", 0, POPT_ARG_VAL, &no_detach, 0, 0, 0 }, + {"log-file", 0, POPT_ARG_STRING, &logfile_name, 0, 0, 0 }, {"no-detach", 0, POPT_ARG_VAL, &no_detach, 1, 0, 0 }, {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 }, {"sockopts", 0, POPT_ARG_STRING, &sockopts, 0, 0, 0 }, @@ -890,8 +898,10 @@ int parse_arguments(int *argc, const char ***argv, int frommain) case OPT_EXCLUDE_FROM: case OPT_INCLUDE_FROM: arg = poptGetOptArg(pc); - if (sanitize_paths) + if (sanitize_paths) { arg = sanitize_path(NULL, arg, NULL, 0, NULL); + die_on_unsafe_path((char*)arg, 0); + } if (server_filter_list.head) { char *cp = strdup(arg); if (!cp) @@ -1025,7 +1035,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain) break; case OPT_LINK_DEST: -#ifdef HAVE_LINK +#ifdef SUPPORT_HARD_LINKS link_dest = 1; dest_option = "--link-dest"; goto set_dest_dir; @@ -1209,12 +1219,14 @@ int parse_arguments(int *argc, const char ***argv, int frommain) int i; for (i = *argc; i-- > 0; ) (*argv)[i] = sanitize_path(NULL, (*argv)[i], "", 0, NULL); - if (tmpdir) + if (tmpdir) { tmpdir = sanitize_path(NULL, tmpdir, NULL, 0, NULL); - if (partial_dir) - partial_dir = sanitize_path(NULL, partial_dir, NULL, 0, NULL); - if (backup_dir) + die_on_unsafe_path(tmpdir, 0); + } + if (backup_dir) { backup_dir = sanitize_path(NULL, backup_dir, NULL, 0, NULL); + die_on_unsafe_path(backup_dir, 0); + } } if (server_filter_list.head && !am_sender) { struct filter_list_struct *elp = &server_filter_list; @@ -1225,11 +1237,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain) if (check_filter(elp, tmpdir, 1) < 0) goto options_rejected; } - if (partial_dir && *partial_dir) { - clean_fname(partial_dir, 1); - if (check_filter(elp, partial_dir, 1) < 0) - goto options_rejected; - } if (backup_dir) { if (!*backup_dir) goto options_rejected; @@ -1307,6 +1314,21 @@ int parse_arguments(int *argc, const char ***argv, int frommain) if (log_format_has_i || log_format_has(log_format, 'o')) log_format_has_o_or_i = 1; + if (am_daemon) + logfile_name = NULL; + else if (logfile_name) { + if (am_server) { + logfile_format = "%i %n%L"; + logfile_format_has_i = logfile_format_has_o_or_i = 1; + } else if (log_format) { + logfile_format = log_format; + logfile_format_has_i = log_format_has_i; + logfile_format_has_o_or_i = log_format_has_o_or_i; + } + log_before_transfer = !am_server; + log_init(); + } + if (daemon_bwlimit && (!bwlimit || bwlimit > daemon_bwlimit)) bwlimit = daemon_bwlimit; if (bwlimit) {