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;
#endif
int blocking_io=0;
+/** Global options set from command line. **/
+struct global_opts global_opts;
+
int read_batch=0; /* dw */
int write_batch=0; /* dw */
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)
char const *got_socketpair = "no ";
char const *hardlinks = "no ";
char const *links = "no ";
+ char const *ipv6 = "no ";
#ifdef HAVE_SOCKETPAIR
got_socketpair = "";
links = "";
#endif
+#if INET6
+ ipv6 = "";
+#endif
+
rprintf(f, "%s version %s protocol version %d\n",
- RSYNC_NAME, VERSION, PROTOCOL_VERSION);
+ RSYNC_NAME, RSYNC_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, "<http://rsync.samba.org/>\n");
rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
- "%shard links, %ssymlinks, batchfiles\n\n",
- sizeof(int64) * 8,
- got_socketpair,
- hardlinks, links);
+ "%shard links, %ssymlinks, batchfiles, %sIPv6\n\n",
+ (int) (sizeof(OFF_T) * 8),
+ got_socketpair, hardlinks, links, ipv6);
#ifdef NO_INT64
rprintf(f, "WARNING: no 64-bit integers on this platform!\n");
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");
{"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},
{"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, &global_opts.af_hint, AF_INET },
+ {0, '6', POPT_ARG_VAL, &global_opts.af_hint, 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");
}
}
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 */