X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/b335d74565edf53d38056b9b83a5674e2203e1ff..06963d0fca72b8af5c708544ba7972582b54d90b:/options.c diff --git a/options.c b/options.c index 58b58de6..0316be7d 100644 --- a/options.c +++ b/options.c @@ -52,7 +52,7 @@ int io_error = 0; int read_only = 0; int module_id = -1; int am_server = 0; -int am_sender=0; +int am_sender = 0; int recurse = 0; int am_daemon=0; int do_stats=0; @@ -74,6 +74,9 @@ int modify_window=0; #endif int blocking_io=0; +/** Network address family. **/ +int af = AF_INET; + int read_batch=0; /* dw */ int write_batch=0; /* dw */ @@ -97,8 +100,10 @@ char *batch_ext = NULL; static int modify_window_set; - -struct in_addr socket_address = {INADDR_ANY}; +/** Local address to bind. As a character string because it's + * interpreted by the IPv6 layer: should be a numeric IP4 or ip6 + * address, or a hostname. **/ +char *bind_address; static void print_rsync_version(int f) @@ -122,11 +127,11 @@ static void print_rsync_version(int f) rprintf(f, "%s version %s protocol version %d\n", RSYNC_NAME, VERSION, PROTOCOL_VERSION); rprintf(f, - "Copyright (C) 1996-2001 by Andrew Tridgell, Paul Mackerras and others\n"); + "Copyright (C) 1996-2001 by Andrew Tridgell and others\n"); rprintf(f, "\n"); rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, " "%shard links, %ssymlinks, batchfiles\n\n", - sizeof(int64) * 8, + (int) (sizeof(OFF_T) * 8), got_socketpair, hardlinks, links); @@ -215,6 +220,10 @@ void usage(enum logcode F) rprintf(F," -f --read-batch=EXT read batch file\n"); rprintf(F," -F --write-batch write batch file\n"); rprintf(F," -h, --help show this help screen\n"); +#ifdef INET6 + rprintf(F," -4 prefer IPv4\n"); + rprintf(F," -6 prefer IPv6\n"); +#endif rprintf(F,"\n"); @@ -274,14 +283,14 @@ static struct poptOption long_options[] = { {"archive", 'a', POPT_ARG_NONE, 0, 'a'}, {"server", 0, POPT_ARG_NONE, &am_server}, {"sender", 0, POPT_ARG_NONE, 0, OPT_SENDER}, - {"recurse", 'r', POPT_ARG_NONE, &recurse}, + {"recursive", 'r', POPT_ARG_NONE, &recurse}, {"relative", 'R', POPT_ARG_NONE, &relative_paths}, {"rsh", 'e', POPT_ARG_STRING, &shell_cmd}, {"block-size", 'B', POPT_ARG_INT, &block_size}, {"max-delete", 0, POPT_ARG_INT, &max_delete}, {"timeout", 0, POPT_ARG_INT, &io_timeout}, {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir}, - {"compare-dest", 0, POPT_ARG_NONE, &compare_dest}, + {"compare-dest", 0, POPT_ARG_STRING, &compare_dest}, /* TODO: Should this take an optional int giving the compression level? */ {"compress", 'z', POPT_ARG_NONE, &do_compression}, {"daemon", 0, POPT_ARG_NONE, &am_daemon}, @@ -295,25 +304,35 @@ static struct poptOption long_options[] = { {"port", 0, POPT_ARG_INT, &rsync_port}, {"log-format", 0, POPT_ARG_STRING, &log_format}, {"bwlimit", 0, POPT_ARG_INT, &bwlimit}, - {"address", 0, POPT_ARG_STRING, 0, OPT_ADDRESS}, + {"address", 0, POPT_ARG_STRING, &bind_address, 0}, {"backup-dir", 0, POPT_ARG_STRING, &backup_dir}, {"hard-links", 'H', POPT_ARG_NONE, &preserve_hard_links}, {"read-batch", 'f', POPT_ARG_STRING, &batch_ext, 'f'}, {"write-batch", 'F', POPT_ARG_NONE, &write_batch, 0}, +#ifdef INET6 + {0, '4', POPT_ARG_VAL, &af, AF_INET }, + {0, '6', POPT_ARG_VAL, &af, AF_INET6 }, +#endif {0,0,0,0} }; + static char err_buf[100]; +/* We store the option error message, if any, so that we can log the + connection attempt (which requires parsing the options), and then + show the error later on. */ void option_error(void) { if (err_buf[0]) { rprintf(FLOG, "%s", err_buf); rprintf(FERROR, "%s: %s", RSYNC_NAME, err_buf); } else { - rprintf(FLOG,"Error parsing options - unsupported option?\n"); - rprintf(FERROR,"Error parsing options - unsupported option?\n"); + rprintf (FERROR, "Error parsing options: " + "option may be supported on client but not on server?\n"); + rprintf (FERROR, RSYNC_NAME ": Error parsing options: " + "option may be supported on client but not on server?\n"); } } @@ -468,14 +487,6 @@ int parse_arguments(int *argc, const char ***argv, int frommain) keep_partial = 1; break; - case OPT_ADDRESS: - { - struct in_addr *ia; - if ((ia = ip_address (poptGetOptArg (pc)))) { - socket_address = *ia; - } - } - break; case 'f': /* The filename is stored for us by popt */