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
2e9b540
..
d537677
100644
(file)
--- a/
io.c
+++ b/
io.c
@@
-53,10
+53,12
@@
extern int io_timeout;
extern int am_server;
extern int am_daemon;
extern int am_sender;
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;
extern struct stats stats;
-
const char phase_unknown[] = "unknown";
const char phase_unknown[] = "unknown";
+int select_timeout = SELECT_TIMEOUT;
/**
* The connection might be dropped at some point; perhaps because the
/**
* The connection might be dropped at some point; perhaps because the
@@
-192,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;
@@
-245,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;
@@
-267,7
+269,7
@@
int msg_list_push(int flush_it_all)
return 0;
FD_ZERO(&fds);
FD_SET(msg_fd_out, &fds);
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();
tv.tv_usec = 0;
if (!select(msg_fd_out+1, NULL, &fds, NULL, &tv))
check_timeout();
@@
-384,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;
@@
-404,7
+410,7
@@
static int read_timeout(int fd, char *buf, size_t len)
fd_count = new_fd+1;
}
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;
tv.tv_usec = 0;
errno = 0;
@@
-413,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;
@@
-426,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) {
@@
-455,7
+459,6
@@
static int read_timeout(int fd, char *buf, size_t len)
io_filesfrom_buflen = io_filesfrom_lastchar? 2 : 1;
io_filesfrom_f_in = -1;
} else {
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' */
if (!eol_nulls) {
char *s = io_filesfrom_buf + l;
/* Transform CR and/or LF into '\0' */
@@
-525,9
+528,6
@@
int read_filesfrom_line(int fd, char *fname)
{
char ch, *s, *eob = fname + MAXPATHLEN - 1;
int cnt;
{
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;
int reading_remotely = remote_filesfrom_file != NULL;
int nulls = eol_nulls || reading_remotely;
@@
-541,7
+541,7
@@
int read_filesfrom_line(int fd, char *fname)
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
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();
tv.tv_usec = 0;
if (!select(fd+1, &fds, NULL, NULL, &tv))
check_timeout();
@@
-803,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++;
@@
-819,19
+822,15
@@
static void writefd_unbuffered(int fd,char *buf,size_t len)
fd_count = msg_fd_in;
}
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);
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) {
if (count <= 0) {
+ check_timeout();
if (errno == EBADF)
exit_cleanup(RERR_SOCKETIO);
continue;
if (errno == EBADF)
exit_cleanup(RERR_SOCKETIO);
continue;
@@
-955,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);