X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/b5c6a6aeeb7d526e023454ea681b7381945bced8..a3869e9227ca5d8217b43defd1bb5b3a820d7b74:/options.c diff --git a/options.c b/options.c index 5800abe7..21445e9d 100644 --- a/options.c +++ b/options.c @@ -19,7 +19,7 @@ */ #include "rsync.h" -#include "popt.h" +#include #include "zlib/zlib.h" extern int module_id; @@ -149,6 +149,7 @@ char *password_file = NULL; char *rsync_path = RSYNC_PATH; char *backup_dir = NULL; char backup_dir_buf[MAXPATHLEN]; +char *sockopts = NULL; int rsync_port = 0; int compare_dest = 0; int copy_dest = 0; @@ -289,13 +290,14 @@ void usage(enum logcode F) rprintf(F," -H, --hard-links preserve hard links\n"); rprintf(F," -K, --keep-dirlinks treat symlinked dir on receiver as dir\n"); rprintf(F," -p, --perms preserve permissions\n"); - rprintf(F," -o, --owner preserve owner (root only)\n"); + rprintf(F," -o, --owner preserve owner (super-user only)\n"); rprintf(F," -g, --group preserve group\n"); - rprintf(F," --devices preserve device files (root only)\n"); + rprintf(F," --devices preserve device files (super-user only)\n"); rprintf(F," --specials preserve special files\n"); rprintf(F," -D same as --devices --specials\n"); rprintf(F," -t, --times preserve times\n"); rprintf(F," -O, --omit-dir-times omit directories when preserving times\n"); + rprintf(F," --super receiver attempts super-user activities\n"); rprintf(F," --chmod=CHMOD change destination permissions\n"); rprintf(F," -S, --sparse handle sparse files efficiently\n"); rprintf(F," -n, --dry-run show what would have been transferred\n"); @@ -345,6 +347,7 @@ void usage(enum logcode F) rprintf(F," -0, --from0 all *-from/filter files are delimited by 0s\n"); rprintf(F," --address=ADDRESS bind address for outgoing socket to daemon\n"); rprintf(F," --port=PORT specify double-colon alternate port number\n"); + rprintf(F," --sockopts=OPTIONS specify custom TCP options\n"); rprintf(F," --blocking-io use blocking I/O for the remote shell\n"); rprintf(F," --stats give some file-transfer stats\n"); rprintf(F," -h, --human-readable output numbers in a human-readable format\n"); @@ -406,6 +409,8 @@ static struct poptOption long_options[] = { {"no-t", 0, POPT_ARG_VAL, &preserve_times, 0, 0, 0 }, {"omit-dir-times", 'O', POPT_ARG_VAL, &omit_dir_times, 2, 0, 0 }, {"modify-window", 0, POPT_ARG_INT, &modify_window, OPT_MODIFY_WINDOW, 0, 0 }, + {"super", 0, POPT_ARG_VAL, &am_root, 2, 0, 0 }, + {"no-super", 0, POPT_ARG_VAL, &am_root, 0, 0, 0 }, {"owner", 'o', POPT_ARG_VAL, &preserve_uid, 1, 0, 0 }, {"no-owner", 0, POPT_ARG_VAL, &preserve_uid, 0, 0, 0 }, {"no-o", 0, POPT_ARG_VAL, &preserve_uid, 0, 0, 0 }, @@ -501,6 +506,7 @@ static struct poptOption long_options[] = { #endif {"address", 0, POPT_ARG_STRING, &bind_address, 0, 0, 0 }, {"port", 0, POPT_ARG_INT, &rsync_port, 0, 0, 0 }, + {"sockopts", 0, POPT_ARG_STRING, &sockopts, 0, 0, 0 }, {"password-file", 0, POPT_ARG_STRING, &password_file, 0, 0, 0 }, {"blocking-io", 0, POPT_ARG_VAL, &blocking_io, 1, 0, 0 }, {"no-blocking-io", 0, POPT_ARG_VAL, &blocking_io, 0, 0, 0 }, @@ -526,6 +532,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," --sockopts=OPTIONS specify custom TCP options\n"); rprintf(F," -v, --verbose increase verbosity\n"); #ifdef INET6 rprintf(F," -4, --ipv4 prefer IPv4\n"); @@ -550,6 +557,7 @@ static struct poptOption long_daemon_options[] = { {"detach", 0, POPT_ARG_VAL, &no_detach, 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 }, {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 }, {"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 }, {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 }, @@ -1435,6 +1443,7 @@ void server_options(char **args,int *argc) if (blocking_io == -1) blocking_io = 0; + /* This should always remain first on the server's command-line. */ args[ac++] = "--server"; if (daemon_over_rsh) { @@ -1465,8 +1474,12 @@ void server_options(char **args,int *argc) argstr[x++] = 'L'; if (xfer_dirs > (recurse || !delete_mode || !am_sender)) argstr[x++] = 'd'; - if (keep_dirlinks && am_sender) - argstr[x++] = 'K'; + if (am_sender) { + if (keep_dirlinks) + argstr[x++] = 'K'; + if (omit_dir_times == 2) + argstr[x++] = 'O'; + } if (whole_file > 0) argstr[x++] = 'W'; @@ -1484,8 +1497,6 @@ void server_options(char **args,int *argc) argstr[x++] = 'D'; if (preserve_times) argstr[x++] = 't'; - if (omit_dir_times == 2 && am_sender) - argstr[x++] = 'O'; if (preserve_perms) argstr[x++] = 'p'; if (recurse) @@ -1615,6 +1626,8 @@ void server_options(char **args,int *argc) args[ac++] = "--force"; if (write_batch < 0) args[ac++] = "--only-write-batch=X"; + if (am_root > 1) + args[ac++] = "--super"; } if (size_only)