Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Improved rwrite() in two ways:
[rsync/rsync.git]
/
io.c
diff --git
a/io.c
b/io.c
index
c14f7ad
..
d537677
100644
(file)
--- a/
io.c
+++ b/
io.c
@@
-194,7
+194,7
@@
void send_msg(enum msgcode code, char *buf, int len)
* called by the generator. */
static void read_msg_fd(void)
{
* called by the generator. */
static void read_msg_fd(void)
{
- char buf[20
0
];
+ char buf[20
48
];
size_t n;
int fd = msg_fd_in;
int tag, len;
size_t n;
int fd = msg_fd_in;
int tag, len;
@@
-247,7
+247,7
@@
static void read_msg_fd(void)
/* 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.
/* 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;
int msg_list_push(int flush_it_all)
{
static int written = 0;
@@
-386,6
+386,10
@@
static int read_timeout(int fd, char *buf, size_t len)
FD_SET(msg_fd_in, &r_fds);
if (msg_fd_in >= fd_count)
fd_count = msg_fd_in+1;
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;
}
if (io_filesfrom_f_out >= 0) {
int new_fd;
@@
-415,12
+419,8
@@
static int read_timeout(int fd, char *buf, size_t len)
io_filesfrom_buflen? &w_fds : NULL,
NULL, &tv);
io_filesfrom_buflen? &w_fds : NULL,
NULL, &tv);
- if (count == 0) {
- msg_list_push(NORMAL_FLUSH);
- check_timeout();
- }
-
if (count <= 0) {
if (count <= 0) {
+ check_timeout();
if (errno == EBADF)
exit_cleanup(RERR_SOCKETIO);
continue;
if (errno == EBADF)
exit_cleanup(RERR_SOCKETIO);
continue;
@@
-428,6
+428,8
@@
static int read_timeout(int fd, char *buf, size_t len)
if (msg_fd_in >= 0 && FD_ISSET(msg_fd_in, &r_fds))
read_msg_fd();
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) {
if (io_filesfrom_f_out >= 0) {
if (io_filesfrom_buflen) {
@@
-801,7
+803,10
@@
static void writefd_unbuffered(int fd,char *buf,size_t len)
int fd_count, count;
struct timeval tv;
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++;
no_flush++;
@@
-824,12
+829,8
@@
static void writefd_unbuffered(int fd,char *buf,size_t len)
count = select(fd_count+1, msg_fd_in >= 0 ? &r_fds : NULL,
&w_fds, NULL, &tv);
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) {
if (count <= 0) {
+ check_timeout();
if (errno == EBADF)
exit_cleanup(RERR_SOCKETIO);
continue;
if (errno == EBADF)
exit_cleanup(RERR_SOCKETIO);
continue;
@@
-953,7
+954,10
@@
static void writefd(int fd,char *buf,size_t len)
{
stats.total_written += len;
{
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);
if (!io_buffer || fd != multiplex_out_fd) {
writefd_unbuffered(fd, buf, len);