X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/def97ff9a92da4cd7c48e8ff3e986de85857846f..120cde95629a395f4cc737c68bb9b587cd1051ae:/options.c diff --git a/options.c b/options.c index f400aaa3..bbec3e83 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; @@ -81,6 +81,7 @@ int numeric_ids = 0; int force_delete = 0; int io_timeout = 0; int allowed_lull = 0; +int prune_empty_dirs = 0; char *files_from = NULL; int filesfrom_fd = -1; char *filesfrom_host = NULL; @@ -149,6 +150,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; @@ -322,6 +324,7 @@ void usage(enum logcode F) rprintf(F," --partial keep partially transferred files\n"); rprintf(F," --partial-dir=DIR put a partially transferred file into DIR\n"); rprintf(F," --delay-updates put all updated files into place at transfer's end\n"); + rprintf(F," -m, --prune-empty-dirs prune empty directory chains from the file-list\n"); rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n"); rprintf(F," --timeout=TIME set I/O timeout in seconds\n"); rprintf(F," -I, --ignore-times don't skip files that match in size and mod-time\n"); @@ -346,6 +349,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"); @@ -481,6 +485,7 @@ static struct poptOption long_options[] = { {"no-partial", 0, POPT_ARG_VAL, &keep_partial, 0, 0, 0 }, {"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-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 }, @@ -504,6 +509,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 }, @@ -529,6 +535,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"); @@ -553,6 +560,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 }, @@ -1254,7 +1262,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain) snprintf(err_buf, sizeof err_buf, "--suffix cannot be a null string without --backup-dir\n"); return 0; - } else if (delete_mode && !delete_excluded) { + } else if (make_backups && 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); @@ -1469,8 +1477,14 @@ 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 (prune_empty_dirs) + argstr[x++] = 'm'; + if (omit_dir_times == 2) + argstr[x++] = 'O'; + } if (whole_file > 0) argstr[x++] = 'W'; @@ -1488,8 +1502,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) @@ -1672,7 +1684,7 @@ void server_options(char **args,int *argc) else if (inplace) args[ac++] = "--inplace"; - if (tmpdir) { + if (tmpdir && am_sender) { args[ac++] = "--temp-dir"; args[ac++] = tmpdir; }