extern int am_server;
extern int am_daemon;
extern int am_sender;
+extern int eol_nulls;
+extern char *remote_filesfrom_file;
extern struct stats stats;
-
const char phase_unknown[] = "unknown";
+int select_timeout = SELECT_TIMEOUT;
/**
* The connection might be dropped at some point; perhaps because the
* called by the generator. */
static void read_msg_fd(void)
{
- char buf[200];
+ char buf[2048];
size_t n;
int fd = msg_fd_in;
int tag, len;
/* Try to push messages off the list onto the wire. If we leave with more
* to do, return 0. On error, return -1. If everything flushed, return 1.
- * This is only called by the receiver. */
+ * This is only active in the receiver. */
int msg_list_push(int flush_it_all)
{
static int written = 0;
return 0;
FD_ZERO(&fds);
FD_SET(msg_fd_out, &fds);
- tv.tv_sec = io_timeout ? io_timeout : SELECT_TIMEOUT;
+ tv.tv_sec = select_timeout;
tv.tv_usec = 0;
if (!select(msg_fd_out+1, NULL, &fds, NULL, &tv))
check_timeout();
FD_SET(msg_fd_in, &r_fds);
if (msg_fd_in >= fd_count)
fd_count = msg_fd_in+1;
+ } else if (msg_list_head) {
+ FD_SET(msg_fd_out, &w_fds);
+ if (msg_fd_out >= fd_count)
+ fd_count = msg_fd_out+1;
}
if (io_filesfrom_f_out >= 0) {
int new_fd;
fd_count = new_fd+1;
}
- tv.tv_sec = io_timeout?io_timeout:SELECT_TIMEOUT;
+ tv.tv_sec = select_timeout;
tv.tv_usec = 0;
errno = 0;
io_filesfrom_buflen? &w_fds : NULL,
NULL, &tv);
- if (count == 0) {
- msg_list_push(NORMAL_FLUSH);
- check_timeout();
- }
-
if (count <= 0) {
+ check_timeout();
if (errno == EBADF)
exit_cleanup(RERR_SOCKETIO);
continue;
if (msg_fd_in >= 0 && FD_ISSET(msg_fd_in, &r_fds))
read_msg_fd();
+ else if (msg_list_head && FD_ISSET(msg_fd_out, &w_fds))
+ msg_list_push(NORMAL_FLUSH);
if (io_filesfrom_f_out >= 0) {
if (io_filesfrom_buflen) {
io_filesfrom_buflen = io_filesfrom_lastchar? 2 : 1;
io_filesfrom_f_in = -1;
} else {
- extern int eol_nulls;
if (!eol_nulls) {
char *s = io_filesfrom_buf + l;
/* Transform CR and/or LF into '\0' */
{
char ch, *s, *eob = fname + MAXPATHLEN - 1;
int cnt;
- extern int io_timeout;
- extern int eol_nulls;
- extern char *remote_filesfrom_file;
int reading_remotely = remote_filesfrom_file != NULL;
int nulls = eol_nulls || reading_remotely;
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
- tv.tv_sec = io_timeout? io_timeout : SELECT_TIMEOUT;
+ tv.tv_sec = select_timeout;
tv.tv_usec = 0;
if (!select(fd+1, &fds, NULL, NULL, &tv))
check_timeout();
int fd_count, count;
struct timeval tv;
- msg_list_push(NORMAL_FLUSH);
+ if (fd == msg_fd_out) {
+ rprintf(FERROR, "Internal error: wrong write used in receiver.\n");
+ exit_cleanup(RERR_PROTOCOL);
+ }
no_flush++;
fd_count = msg_fd_in;
}
- tv.tv_sec = io_timeout?io_timeout:SELECT_TIMEOUT;
+ tv.tv_sec = select_timeout;
tv.tv_usec = 0;
errno = 0;
count = select(fd_count+1, msg_fd_in >= 0 ? &r_fds : NULL,
&w_fds, NULL, &tv);
- if (count == 0) {
- msg_list_push(NORMAL_FLUSH);
- check_timeout();
- }
-
if (count <= 0) {
+ check_timeout();
if (errno == EBADF)
exit_cleanup(RERR_SOCKETIO);
continue;
{
stats.total_written += len;
- msg_list_push(NORMAL_FLUSH);
+ if (fd == msg_fd_out) {
+ rprintf(FERROR, "Internal error: wrong write used in receiver.\n");
+ exit_cleanup(RERR_PROTOCOL);
+ }
if (!io_buffer || fd != multiplex_out_fd) {
writefd_unbuffered(fd, buf, len);