extern int read_batch;
extern int write_batch;
extern int batch_fd;
+extern int batch_gen_fd;
extern int filesfrom_fd;
extern pid_t cleanup_child_pid;
extern char *files_from;
/* this is the client */
if (!am_sender) {
+ /* Read the first two in opposite order because the meaning of
+ * read/write swaps when switching from sender to receiver. */
total_written = read_longint(f);
total_read = read_longint(f);
stats.total_size = read_longint(f);
rprintf(FINFO,"\n");
}
- if (local_server) {
+ if (read_batch) {
+ int from_gen_pipe[2];
+ if (fd_pair(from_gen_pipe) < 0) {
+ rsyserr(FERROR, errno, "pipe");
+ exit_cleanup(RERR_IPC);
+ }
+ batch_gen_fd = from_gen_pipe[0];
+ *f_out = from_gen_pipe[1];
+ *f_in = batch_fd;
+ ret = -1; /* no child pid */
+ } else if (local_server) {
/* If the user didn't request --[no-]whole-file, force
* it on, but only if we're not batch processing. */
- if (whole_file < 0 && !read_batch && !write_batch)
+ if (whole_file < 0 && !write_batch)
whole_file = 1;
ret = local_child(argc, args, f_in, f_out, child_main);
- } else {
+ } else
ret = piped_child(args,f_in,f_out);
- }
if (dir)
free(dir);
if (!delete_after) {
/* I moved this here from recv_files() to prevent a race condition */
- if (recurse && delete_mode && !local_name && flist->count>0) {
+ if (recurse && delete_mode && !local_name && flist->count > 0)
delete_files(flist);
- }
}
if (fd_pair(error_pipe) < 0) {
close(f_out);
/* we can't let two processes write to the socket at one time */
- io_multiplexing_close();
+ close_multiplexing_out();
/* set place to send errors */
set_msg_fd_out(error_pipe[1]);
}
am_generator = 1;
+ close_multiplexing_in();
if (write_batch)
stop_write_batch();
cleanup_child_pid = pid;
if (read_batch) {
- /* This is the heart of the read_batch approach:
- * Switcher-roo the file descriptors, and
- * nobody's the wiser. */
- close(f_in);
- close(f_out);
- f_in = batch_fd;
- f_out = do_open("/dev/null", O_WRONLY, 0);
assert(am_sender == 0);
} else {
set_nonblocking(f_in);
if (write_batch)
start_write_batch(f_out);
- /* Can be unconditional, but this is theoretically
- * more efficent for read_batch case. */
if (!read_batch) /* don't write to pipe */
flist = send_file_list(f_out,argc,argv);
if (verbose > 3)
if (argc == 0)
list_only = 1;
- /* Can be unconditional, but this is theoretically more
- * efficient for the read_batch case. */
if (!read_batch)
send_exclude_list(f_out);
batch_name);
exit_cleanup(RERR_FILEIO);
}
+ if (read_batch)
+ read_stream_flags(batch_fd);
}
if (am_daemon && !am_server)