X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/684d7582b6a58e30b2fddf45989d1d27cbdcd10d..b03c719f04ceddf003f7910ed2d4e70e7e9d56fa:/options.c diff --git a/options.c b/options.c index 280df0e2..dbf50128 100644 --- a/options.c +++ b/options.c @@ -59,20 +59,22 @@ int delete_during = 0; int delete_before = 0; int delete_after = 0; int delete_excluded = 0; +int remove_sent_files = 0; int one_file_system = 0; int protocol_version = PROTOCOL_VERSION; int sparse_files = 0; int do_compression = 0; int am_root = 0; +int am_server = 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; int force_delete = 0; int io_timeout = 0; -int am_server = 0; -int am_sender = -1; -int am_generator = 0; char *files_from = NULL; int filesfrom_fd = -1; char *remote_filesfrom_file = NULL; @@ -93,6 +95,7 @@ int fuzzy_basis = 0; size_t bwlimit_writemax = 0; int only_existing = 0; int opt_ignore_existing = 0; +int need_messages_from_generator = 0; int max_delete = 0; OFF_T max_size = 0; int ignore_errors = 0; @@ -114,7 +117,12 @@ int default_af_hint = AF_INET; /* Must use IPv4 */ /** Do not go into the background when run as --daemon. Good * for debugging and required for running as a service on W32, * or under Unix process-monitors. **/ -int no_detach = 0; +int no_detach +#if defined _WIN32 || defined __WIN32__ + = 1; +#else + = 0; +#endif int write_batch = 0; int read_batch = 0; @@ -135,7 +143,6 @@ char *backup_dir = NULL; char backup_dir_buf[MAXPATHLEN]; int rsync_port = 0; int compare_dest = 0; -int copy_dest = 0; int link_dest = 0; int basis_dir_cnt = 0; @@ -288,6 +295,7 @@ void usage(enum logcode F) rprintf(F," --rsync-path=PATH specify path to rsync on the remote machine\n"); rprintf(F," --existing only update files that already exist on receiver\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," --del an alias for --delete-during\n"); rprintf(F," --delete delete files that don't exist on the sending side\n"); rprintf(F," --delete-before receiver deletes before transfer (default)\n"); @@ -309,7 +317,6 @@ void usage(enum logcode F) rprintf(F," -T, --temp-dir=DIR create temporary files in directory DIR\n"); rprintf(F," -y, --fuzzy find similar file for basis if no dest file\n"); rprintf(F," --compare-dest=DIR also compare destination files relative to DIR\n"); - rprintf(F," --copy-dest=DIR ... and include copies of unchanged files\n"); rprintf(F," --link-dest=DIR hardlink to files in DIR when unchanged\n"); rprintf(F," -z, --compress compress file data during the transfer\n"); rprintf(F," -C, --cvs-exclude auto-ignore files the same way CVS does\n"); @@ -348,7 +355,7 @@ void usage(enum logcode F) } enum {OPT_VERSION = 1000, OPT_DAEMON, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM, - OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_DEST, OPT_LINK_DEST, + OPT_FILTER, OPT_COMPARE_DEST, OPT_LINK_DEST, OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW, OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT, OPT_MAX_SIZE, OPT_REFUSED_BASE = 9000}; @@ -371,6 +378,7 @@ static struct poptOption long_options[] = { {"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 }, {"force", 0, POPT_ARG_NONE, &force_delete, 0, 0, 0 }, {"numeric-ids", 0, POPT_ARG_NONE, &numeric_ids, 0, 0, 0 }, {"filter", 'f', POPT_ARG_STRING, 0, OPT_FILTER, 0, 0 }, @@ -398,7 +406,7 @@ static struct poptOption long_options[] = { {"group", 'g', POPT_ARG_NONE, &preserve_gid, 0, 0, 0 }, {"devices", 'D', POPT_ARG_NONE, &preserve_devices, 0, 0, 0 }, {"times", 't', POPT_ARG_NONE, &preserve_times, 0, 0, 0 }, - {"omit-dir-times", 'O', POPT_ARG_NONE, &omit_dir_times, 0, 0, 0 }, + {"omit-dir-times", 'O', POPT_ARG_VAL, &omit_dir_times, 2, 0, 0 }, {"checksum", 'c', POPT_ARG_NONE, &always_checksum, 0, 0, 0 }, {"verbose", 'v', POPT_ARG_NONE, 0, 'v', 0, 0 }, {"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 }, @@ -416,7 +424,6 @@ static struct poptOption long_options[] = { {"timeout", 0, POPT_ARG_INT, &io_timeout, OPT_TIMEOUT, 0, 0 }, {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 }, {"compare-dest", 0, POPT_ARG_STRING, 0, OPT_COMPARE_DEST, 0, 0 }, - {"copy-dest", 0, POPT_ARG_STRING, 0, OPT_COPY_DEST, 0, 0 }, {"link-dest", 0, POPT_ARG_STRING, 0, OPT_LINK_DEST, 0, 0 }, {"fuzzy", 'y', POPT_ARG_NONE, &fuzzy_basis, 0, 0, 0 }, /* TODO: Should this take an optional int giving the compression level? */ @@ -452,6 +459,7 @@ static struct poptOption long_options[] = { {"address", 0, POPT_ARG_STRING, 0, OPT_DAEMON, 0, 0 }, {"config", 0, POPT_ARG_STRING, 0, OPT_DAEMON, 0, 0 }, {"daemon", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 }, + {"detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 }, {"no-detach", 0, POPT_ARG_NONE, 0, OPT_DAEMON, 0, 0 }, {0,0,0,0, 0, 0, 0} }; @@ -487,7 +495,8 @@ static struct poptOption long_daemon_options[] = { {"ipv4", '4', POPT_ARG_VAL, &default_af_hint, AF_INET, 0, 0 }, {"ipv6", '6', POPT_ARG_VAL, &default_af_hint, AF_INET6, 0, 0 }, #endif - {"no-detach", 0, POPT_ARG_NONE, &no_detach, 0, 0, 0 }, + {"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 }, {"protocol", 0, POPT_ARG_INT, &protocol_version, 0, 0, 0 }, {"server", 0, POPT_ARG_NONE, &am_server, 0, 0, 0 }, @@ -687,6 +696,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain) } *argv = poptGetArgs(pc); *argc = count_args(*argv); + am_starting_up = 0; daemon_opt = 0; am_daemon = 1; return 1; @@ -828,11 +838,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain) return 0; #endif - case OPT_COPY_DEST: - copy_dest = 1; - dest_option = "--copy-dest"; - goto set_dest_dir; - case OPT_COMPARE_DEST: compare_dest = 1; dest_option = "--compare-dest"; @@ -864,9 +869,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain) } } - if (am_sender < 0) - am_sender = 0; - #ifndef SUPPORT_LINKS if (preserve_links && !am_sender) { snprintf(err_buf, sizeof err_buf, @@ -926,9 +928,9 @@ int parse_arguments(int *argc, const char ***argv, int frommain) return 0; } - if (compare_dest + copy_dest + link_dest > 1) { + if (compare_dest + link_dest > 1) { snprintf(err_buf, sizeof err_buf, - "You may not mix --compare-dest, --copy-dest, and --link-dest.\n"); + "You may not mix --compare-dest and --link-dest.\n"); return 0; } @@ -978,6 +980,17 @@ int parse_arguments(int *argc, const char ***argv, int frommain) return 0; } + if (remove_sent_files) { + /* We only want to infer this refusal of --remove-sent-files + * via the refusal of "delete", not any of the "delete-FOO" + * options. */ + if (refused_delete && am_sender) { + create_refuse_error(refused_delete); + return 0; + } + need_messages_from_generator = 1; + } + *argv = poptGetArgs(pc); *argc = count_args(*argv); @@ -1066,6 +1079,8 @@ int parse_arguments(int *argc, const char ***argv, int frommain) "--suffix cannot be a null string without --backup-dir\n"); return 0; } + if (make_backups && !backup_dir) + omit_dir_times = 1; if (log_format) { if (strstr(log_format, "%i") != NULL) @@ -1178,6 +1193,8 @@ int parse_arguments(int *argc, const char ***argv, int frommain) } } + am_starting_up = 0; + return 1; } @@ -1250,7 +1267,7 @@ void server_options(char **args,int *argc) argstr[x++] = 'D'; if (preserve_times) argstr[x++] = 't'; - if (omit_dir_times && am_sender) + if (omit_dir_times == 2 && am_sender) argstr[x++] = 'O'; if (preserve_perms) argstr[x++] = 'p'; @@ -1435,6 +1452,9 @@ void server_options(char **args,int *argc) if (fuzzy_basis && am_sender) args[ac++] = "--fuzzy"; + if (remove_sent_files) + args[ac++] = "--remove-sent-files"; + *argc = ac; return;