X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/305666bf59c50788fd31054e404d26df79ddf0c4..d5609e969d4f83360f3ece4417a62b34530b8a63:/options.c diff --git a/options.c b/options.c index ea35841a..cb9bbafe 100644 --- a/options.c +++ b/options.c @@ -143,8 +143,10 @@ 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; +char *dest_option = NULL; int verbose = 0; int quiet = 0; @@ -163,7 +165,6 @@ static int F_option_cnt = 0; static int modify_window_set; static int refused_delete, refused_archive_part; static int refused_partial, refused_progress, refused_delete_before; -static char *dest_option = NULL; static char *max_size_arg; static char partialdir_for_delayupdate[] = ".~tmp~"; @@ -292,7 +293,7 @@ void usage(enum logcode F) rprintf(F," -x, --one-file-system don't cross filesystem boundaries\n"); 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=PATH specify path to rsync on the remote machine\n"); + rprintf(F," --rsync-path=PROGRAM specify the rsync to run 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"); @@ -317,6 +318,7 @@ 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"); @@ -355,7 +357,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_LINK_DEST, + OPT_FILTER, OPT_COMPARE_DEST, OPT_COPY_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}; @@ -424,6 +426,7 @@ 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? */ @@ -838,6 +841,11 @@ 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"; @@ -928,9 +936,9 @@ int parse_arguments(int *argc, const char ***argv, int frommain) return 0; } - if (compare_dest + link_dest > 1) { + if (compare_dest + copy_dest + link_dest > 1) { snprintf(err_buf, sizeof err_buf, - "You may not mix --compare-dest and --link-dest.\n"); + "You may not mix --compare-dest, --copy-dest, and --link-dest.\n"); return 0; } @@ -1490,17 +1498,16 @@ char *check_for_hostspec(char *s, char **host_ptr, int *port_ptr) if (*s == '[' && (p = strchr(s, ']')) != NULL) { s++; hostlen = p - s; - if (*p == ':') - *port_ptr = atoi(p+1); - else if (!*port_ptr) - *port_ptr = RSYNC_PORT; + if (p[1] == ':') + *port_ptr = atoi(p+2); } else { if ((p = strchr(s, ':')) != NULL) { hostlen = p - s; *port_ptr = atoi(p+1); - } else if (!*port_ptr) - *port_ptr = RSYNC_PORT; + } } + if (!*port_ptr) + *port_ptr = RSYNC_PORT; *host_ptr = new_array(char, hostlen + 1); strlcpy(*host_ptr, s, hostlen + 1); return path; @@ -1513,6 +1520,7 @@ char *check_for_hostspec(char *s, char **host_ptr, int *port_ptr) *p = ']'; if (not_host) return NULL; + p++; } else { if (!(p = strchr(s, ':'))) return NULL;