int delete_before = 0;
int delete_after = 0;
int delete_excluded = 0;
-int remove_sent_files = 0;
+int remove_source_files = 0;
int one_file_system = 0;
int protocol_version = PROTOCOL_VERSION;
int sparse_files = 0;
int verbose = 0;
int quiet = 0;
+int output_motd = 1;
int log_before_transfer = 0;
int stdout_format_has_i = 0;
int stdout_format_has_o_or_i = 0;
(int) SIZEOF_INT64, (int) sizeof (int64));
}
- rprintf(f,"\nrsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n");
+ rprintf(f,"\n");
+ rprintf(f,"rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n");
rprintf(f,"are welcome to redistribute it under certain conditions. See the GNU\n");
rprintf(f,"General Public Licence for details.\n");
}
{
print_rsync_version(F);
- rprintf(F,"\nrsync is a file transfer program capable of efficient remote update\n");
+ rprintf(F,"\n");
+ rprintf(F,"rsync is a file transfer program capable of efficient remote update\n");
rprintf(F,"via a fast differencing algorithm.\n");
- rprintf(F,"\nUsage: rsync [OPTION]... SRC [SRC]... DEST\n");
+ rprintf(F,"\n");
+ rprintf(F,"Usage: rsync [OPTION]... SRC [SRC]... DEST\n");
rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST\n");
rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST\n");
rprintf(F," or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST\n");
rprintf(F," or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]\n");
rprintf(F,"The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect\n");
rprintf(F,"to an rsync daemon, and require SRC or DEST to start with a module name.\n");
- rprintf(F,"\nOptions\n");
+ rprintf(F,"\n");
+ rprintf(F,"Options\n");
rprintf(F," -v, --verbose increase verbosity\n");
rprintf(F," -q, --quiet suppress non-error messages\n");
+ rprintf(F," --no-motd suppress daemon-mode MOTD (see manpage caveat)\n");
rprintf(F," -c, --checksum skip based on checksum, not mod-time & size\n");
rprintf(F," -a, --archive archive mode; same as -rlptgoD (no -H)\n");
rprintf(F," --no-OPTION turn off an implied OPTION (e.g. --no-D)\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," --chmod=CHMOD affect file and/or directory permissions\n");
rprintf(F," -o, --owner preserve owner (super-user only)\n");
rprintf(F," -g, --group preserve group\n");
rprintf(F," --devices preserve device files (super-user only)\n");
rprintf(F," --rsync-path=PROGRAM specify the rsync to run on the remote machine\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," --remove-source-files sender removes synchronized files (non-dirs)\n");
rprintf(F," --del an alias for --delete-during\n");
rprintf(F," --delete delete extraneous files from destination dirs\n");
rprintf(F," --delete-before receiver deletes before transfer (default)\n");
rprintf(F," --version print version number\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,"\n");
+ rprintf(F,"Use \"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");
rprintf(F,"See http://rsync.samba.org/ for updates, bug reports, and answers\n");
}
{"no-verbose", 0, POPT_ARG_VAL, &verbose, 0, 0, 0 },
{"no-v", 0, POPT_ARG_VAL, &verbose, 0, 0, 0 },
{"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 },
+ {"motd", 0, POPT_ARG_VAL, &output_motd, 1, 0, 0 },
+ {"no-motd", 0, POPT_ARG_VAL, &output_motd, 0, 0, 0 },
{"stats", 0, POPT_ARG_NONE, &do_stats, 0, 0, 0 },
{"human-readable", 'h', POPT_ARG_NONE, 0, 'h', 0, 0},
{"dry-run", 'n', POPT_ARG_NONE, &dry_run, 0, 0, 0 },
{"delete-during", 0, POPT_ARG_NONE, &delete_during, 0, 0, 0 },
{"delete-after", 0, POPT_ARG_NONE, &delete_after, 0, 0, 0 },
{"delete-excluded", 0, POPT_ARG_NONE, &delete_excluded, 0, 0, 0 },
- {"remove-sent-files",0, POPT_ARG_NONE, &remove_sent_files, 0, 0, 0 },
+ {"remove-sent-files",0, POPT_ARG_VAL, &remove_source_files, 2, 0, 0 }, /* deprecated */
+ {"remove-source-files",0,POPT_ARG_VAL, &remove_source_files, 1, 0, 0 },
{"force", 0, POPT_ARG_NONE, &force_delete, 0, 0, 0 },
{"ignore-errors", 0, POPT_ARG_NONE, &ignore_errors, 0, 0, 0 },
{"max-delete", 0, POPT_ARG_INT, &max_delete, 0, 0, 0 },
{
print_rsync_version(F);
- rprintf(F,"\nUsage: rsync --daemon [OPTION]...\n");
+ rprintf(F,"\n");
+ rprintf(F,"Usage: rsync --daemon [OPTION]...\n");
rprintf(F," --address=ADDRESS bind to the specified address\n");
rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n");
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," --log-file-format=FMT override the \"log format\" setting\n");
rprintf(F," --sockopts=OPTIONS specify custom TCP options\n");
rprintf(F," -v, --verbose increase verbosity\n");
#ifdef INET6
#endif
rprintf(F," --help show this help screen\n");
- rprintf(F,"\nIf you were not trying to invoke rsync as a daemon, avoid using any of the\n");
+ rprintf(F,"\n");
+ rprintf(F,"If you were not trying to invoke rsync as a daemon, avoid using any of the\n");
rprintf(F,"daemon-specific rsync options. See also the rsyncd.conf(5) man page.\n");
}
#endif
{"detach", 0, POPT_ARG_VAL, &no_detach, 0, 0, 0 },
{"log-file", 0, POPT_ARG_STRING, &logfile_name, 0, 0, 0 },
+ {"log-file-format", 0, POPT_ARG_STRING, &logfile_format, 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 },
void option_error(void)
{
if (!err_buf[0]) {
- strcpy(err_buf, "Error parsing options: "
- "option may be supported on client but not on server?\n");
+ strlcpy(err_buf, "Error parsing options: option may "
+ "be supported on client but not on server?\n",
+ sizeof err_buf);
}
rprintf(FERROR, RSYNC_NAME ": %s", err_buf);
*cp = ' ';
bp = cp + 1;
}
-
- for (op = long_options; ; op++) {
- *shortname = op->shortName;
- if (!op->longName && !*shortname)
- break;
- if (op->val == OPT_DAEMON) {
- if (op->argInfo == POPT_ARG_VAL)
- op->argInfo = POPT_ARG_NONE;
- op->val = (op - long_options) + OPT_REFUSED_BASE;
- }
- }
}
const char *arg;
OFF_T size = 1;
- for (arg = *size_arg; isdigit(*(uchar*)arg); arg++) {}
+ for (arg = *size_arg; isDigit(arg); arg++) {}
if (*arg == '.')
- for (arg++; isdigit(*(uchar*)arg); arg++) {}
+ for (arg++; isDigit(arg); arg++) {}
switch (*arg && *arg != '+' && *arg != '-' ? *arg++ : def_suf) {
case 'b': case 'B':
reps = 0;
if (ref && *ref)
set_refuse_options(ref);
+ if (am_daemon)
+ set_refuse_options("log-file*");
/* TODO: Call poptReadDefaultConfig; handle errors. */
case OPT_DAEMON:
if (am_daemon) {
- strcpy(err_buf, "Attempt to hack rsync thwarted!\n");
+ strlcpy(err_buf,
+ "Attempt to hack rsync thwarted!\n",
+ sizeof err_buf);
return 0;
}
poptFreeContext(pc);
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)
return 0;
}
- if (remove_sent_files) {
- /* We only want to infer this refusal of --remove-sent-files
+ if (remove_source_files) {
+ /* We only want to infer this refusal of --remove-source-files
* via the refusal of "delete", not any of the "delete-FOO"
* options. */
if (refused_delete && am_sender) {
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);
- die_on_unsafe_path(tmpdir, 0);
- }
- if (backup_dir) {
+ 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;
if (stdout_format_has_i || log_format_has(stdout_format, 'o'))
stdout_format_has_o_or_i = 1;
- if (am_daemon)
- logfile_name = NULL;
- else if (logfile_name) {
+ if (logfile_name && !am_daemon) {
if (!logfile_format) {
- logfile_format = "%i %n%L (!)";
+ logfile_format = "%i %n%L";
logfile_format_has_i = logfile_format_has_o_or_i = 1;
} else {
if (log_format_has(logfile_format, 'i'))
- stdout_format_has_i = 2;
+ logfile_format_has_i = 1;
if (logfile_format_has_i || log_format_has(logfile_format, 'o'))
logfile_format_has_o_or_i = 1;
}
- log_init();
- }
+ log_init(0);
+ } else if (!am_daemon)
+ logfile_format = NULL;
if (daemon_bwlimit && (!bwlimit || bwlimit > daemon_bwlimit))
bwlimit = daemon_bwlimit;
clean_fname(partial_dir, 1);
if (!*partial_dir || strcmp(partial_dir, ".") == 0)
partial_dir = NULL;
- else if (*partial_dir != '/') {
+ else if (*partial_dir != '/' && !am_server) {
parse_rule(&filter_list, partial_dir,
MATCHFLG_NO_PREFIXES|MATCHFLG_DIRECTORY, 0);
}
argstr[x++] = 'n';
if (preserve_links)
argstr[x++] = 'l';
- if (xfer_dirs > (recurse || !delete_mode || !am_sender))
+ if (xfer_dirs > (recurse || !delete_mode || !am_sender ? 1 : 0))
argstr[x++] = 'd';
if (am_sender) {
if (keep_dirlinks)
if (fuzzy_basis && am_sender)
args[ac++] = "--fuzzy";
- if (remove_sent_files)
+ if (remove_source_files == 1)
+ args[ac++] = "--remove-source-files";
+ else if (remove_source_files)
args[ac++] = "--remove-sent-files";
*argc = ac;
{
char *p;
int not_host;
+ int hostlen;
if (port_ptr && strncasecmp(URL_PREFIX, s, strlen(URL_PREFIX)) == 0) {
char *path;
- int hostlen;
s += strlen(URL_PREFIX);
if ((p = strchr(s, '/')) != NULL) {
hostlen = p - s;
if (*s == '[' && (p = strchr(s, ']')) != NULL && p[1] == ':') {
s++;
+ hostlen = p - s;
*p = '\0';
not_host = strchr(s, '/') || !strchr(s, ':');
*p = ']';
} else {
if (!(p = strchr(s, ':')))
return NULL;
+ hostlen = p - s;
*p = '\0';
not_host = strchr(s, '/') != NULL;
*p = ':';
return NULL;
}
- *host_ptr = new_array(char, p - s + 1);
- strlcpy(*host_ptr, s, p - s + 1);
+ *host_ptr = new_array(char, hostlen + 1);
+ strlcpy(*host_ptr, s, hostlen + 1);
if (p[1] == ':') {
if (port_ptr && !*port_ptr)