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;
+/** Network address family. **/
+int af = AF_INET;
+
+int read_batch=0; /* dw */
+int write_batch=0; /* dw */
+
char *backup_suffix = BACKUP_SUFFIX;
char *tmpdir = NULL;
char *compare_dest = NULL;
int always_checksum = 0;
int list_only = 0;
-static int modify_window_set;
+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)
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, "<http://rsync.samba.org/>\n");
rprintf(f, "Capabilities: %d-bit files, %ssocketpairs, "
- "%shard links, %ssymlinks\n\n",
- sizeof(int64) * 8,
+ "%shard links, %ssymlinks, batchfiles\n\n",
+ (int) (sizeof(OFF_T) * 8),
got_socketpair,
hardlinks, links);
rprintf(F," --log-format=FORMAT log file transfers using specified format\n");
rprintf(F," --password-file=FILE get password from FILE\n");
rprintf(F," --bwlimit=KBPS limit I/O bandwidth, KBytes per second\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, &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");
}
}
keep_partial = 1;
break;
- case OPT_ADDRESS:
- {
- struct in_addr *ia;
- if ((ia = ip_address(optarg))) {
- socket_address = *ia;
- }
- }
+
+ case 'f':
+ /* The filename is stored for us by popt */
+ read_batch = 1;
break;
default:
static char mdelete[30];
static char mwindow[30];
static char bw[50];
+ static char fext[20]; /* dw */
int i, x;
argstr[x++] = 'S';
if (do_compression)
argstr[x++] = 'z';
+ if (write_batch)
+ argstr[x++] = 'F'; /* dw */
/* this is a complete hack - blame Rusty
snprintf(mdelete,sizeof(mdelete),"--max-delete=%d",max_delete);
args[ac++] = mdelete;
}
+
+ if (batch_ext != NULL) {
+ sprintf(fext,"-f%s",batch_ext);
+ args[ac++] = fext;
+ }
if (io_timeout) {
snprintf(iotime,sizeof(iotime),"--timeout=%d",io_timeout);