aboutsummaryrefslogtreecommitdiffstats
path: root/io.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2004-07-15 02:20:08 +0000
committerWayne Davison <wayned@samba.org>2004-07-15 02:20:08 +0000
commitb9f592fbf50b0dc9e3d1d33b8deb2bf9abad9ef6 (patch)
treef7bb3ff7a10192bd8e91b29e5fba68da10dd195e /io.c
parentc7b1a56b3d70fb91b20702f169ae1af9b68de8e9 (diff)
downloadandroid_external_rsync-b9f592fbf50b0dc9e3d1d33b8deb2bf9abad9ef6.tar.gz
android_external_rsync-b9f592fbf50b0dc9e3d1d33b8deb2bf9abad9ef6.tar.bz2
android_external_rsync-b9f592fbf50b0dc9e3d1d33b8deb2bf9abad9ef6.zip
My modified version of Chris Shoemaker's improved batch-file handling.
Diffstat (limited to 'io.c')
-rw-r--r--io.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/io.c b/io.c
index 421571a5..9f9c3823 100644
--- a/io.c
+++ b/io.c
@@ -54,11 +54,14 @@ extern int am_server;
extern int am_daemon;
extern int am_sender;
extern int eol_nulls;
+extern int checksum_seed;
+extern int protocol_version;
extern char *remote_filesfrom_file;
extern struct stats stats;
const char phase_unknown[] = "unknown";
int select_timeout = SELECT_TIMEOUT;
+int batch_fd = -1;
/**
* The connection might be dropped at some point; perhaps because the
@@ -83,6 +86,9 @@ int kludge_around_eof = False;
int msg_fd_in = -1;
int msg_fd_out = -1;
+static int write_batch_monitor_in = -1;
+static int write_batch_monitor_out = -1;
+
static int io_filesfrom_f_in = -1;
static int io_filesfrom_f_out = -1;
static char io_filesfrom_buf[2048];
@@ -674,6 +680,11 @@ static void readfd(int fd, char *buffer, size_t N)
total += ret;
}
+ if (fd == write_batch_monitor_in) {
+ if ((size_t)write(batch_fd, buffer, total) != total)
+ exit_cleanup(RERR_FILEIO);
+ }
+
stats.total_read += total;
}
@@ -951,6 +962,11 @@ static void writefd(int fd,char *buf,size_t len)
exit_cleanup(RERR_PROTOCOL);
}
+ if (fd == write_batch_monitor_out) {
+ if ((size_t)write(batch_fd, buf, len) != len)
+ exit_cleanup(RERR_FILEIO);
+ }
+
if (!io_buffer || fd != multiplex_out_fd) {
writefd_unbuffered(fd, buf, len);
return;
@@ -1109,3 +1125,25 @@ void io_multiplexing_close(void)
io_multiplexing_out = 0;
}
+void start_write_batch(int fd)
+{
+ /* Some communication has already taken place, but we don't
+ * enable batch writing until here so that we can write a
+ * canonical record of the communication even though the
+ * actual communication so far depends on whether a daemon
+ * is involved. */
+ write_int(batch_fd, protocol_version);
+ write_int(batch_fd, checksum_seed);
+ stats.total_written -= sizeof (int) * 2;
+
+ if (am_sender)
+ write_batch_monitor_out = fd;
+ else
+ write_batch_monitor_in = fd;
+}
+
+void stop_write_batch(void)
+{
+ write_batch_monitor_out = -1;
+ write_batch_monitor_in = -1;
+}