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
Added missing cleanup of empty ACL files.
[rsync/rsync.git]
/
io.c
diff --git
a/io.c
b/io.c
index
1513ae9
..
55aac4a
100644
(file)
--- a/
io.c
+++ b/
io.c
@@
-1,8
+1,10
@@
-/* -*- c-file-style: "linux" -*-
+/*
+ * Socket and pipe I/O utilities used in rsync.
*
*
- * Copyright (C) 1996-2001 by Andrew Tridgell
- * Copyright (C) Paul Mackerras 1996
- * Copyright (C) 2001, 2002 by Martin Pool <mbp@samba.org>
+ * Copyright (C) 1996-2001 Andrew Tridgell
+ * Copyright (C) 1996 Paul Mackerras
+ * Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
+ * Copyright (C) 2003, 2004, 2005, 2006 Wayne Davison
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@
-14,25
+16,17
@@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- *
along with this program; if not, write to the Free Software
- *
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139
, USA.
+ * You should have received a copy of the GNU General Public License
along
+ *
with this program; if not, write to the Free Software Foundation, Inc.,
+ *
51 Franklin Street - Fifth Floor, Boston, MA 02110-1301
, USA.
*/
*/
-/**
- * @file io.c
- *
- * Socket and pipe I/O utilities used in rsync.
- *
- * rsync provides its own multiplexing system, which is used to send
- * stderr and stdout over a single socket. We need this because
- * stdout normally carries the binary data stream, and stderr all our
- * error messages.
+/* Rsync provides its own multiplexing system, which is used to send
+ * stderr and stdout over a single socket.
*
* For historical reasons this is off during the start of the
* connection, but it's switched on quite early using
*
* For historical reasons this is off during the start of the
* connection, but it's switched on quite early using
- * io_start_multiplex_out() and io_start_multiplex_in().
- **/
+ * io_start_multiplex_out() and io_start_multiplex_in(). */
#include "rsync.h"
#include "rsync.h"
@@
-52,7
+46,7
@@
extern int read_batch;
extern int csum_length;
extern int checksum_seed;
extern int protocol_version;
extern int csum_length;
extern int checksum_seed;
extern int protocol_version;
-extern int remove_s
ent
_files;
+extern int remove_s
ource
_files;
extern int preserve_hard_links;
extern char *filesfrom_host;
extern struct stats stats;
extern int preserve_hard_links;
extern char *filesfrom_host;
extern struct stats stats;
@@
-263,7
+257,7
@@
static void read_msg_fd(void)
exit_cleanup(RERR_STREAMIO);
}
read_loop(fd, buf, 4);
exit_cleanup(RERR_STREAMIO);
}
read_loop(fd, buf, 4);
- if (remove_s
ent
_files)
+ if (remove_s
ource
_files)
decrement_active_files(IVAL(buf,0));
flist_ndx_push(&redo_list, IVAL(buf,0));
break;
decrement_active_files(IVAL(buf,0));
flist_ndx_push(&redo_list, IVAL(buf,0));
break;
@@
-273,10
+267,7
@@
static void read_msg_fd(void)
exit_cleanup(RERR_STREAMIO);
}
read_loop(fd, buf, len);
exit_cleanup(RERR_STREAMIO);
}
read_loop(fd, buf, len);
- if (defer_forwarding_messages)
- msg_list_add(&msg2sndr, MSG_DELETED, buf, len);
- else
- io_multiplex_write(MSG_DELETED, buf, len);
+ send_msg(MSG_DELETED, buf, len);
break;
case MSG_SUCCESS:
if (len != 4 || !am_generator) {
break;
case MSG_SUCCESS:
if (len != 4 || !am_generator) {
@@
-284,12
+275,9
@@
static void read_msg_fd(void)
exit_cleanup(RERR_STREAMIO);
}
read_loop(fd, buf, len);
exit_cleanup(RERR_STREAMIO);
}
read_loop(fd, buf, len);
- if (remove_s
ent
_files) {
+ if (remove_s
ource
_files) {
decrement_active_files(IVAL(buf,0));
decrement_active_files(IVAL(buf,0));
- if (defer_forwarding_messages)
- msg_list_add(&msg2sndr, MSG_SUCCESS, buf, len);
- else
- io_multiplex_write(MSG_SUCCESS, buf, len);
+ send_msg(MSG_SUCCESS, buf, len);
}
if (preserve_hard_links)
flist_ndx_push(&hlink_list, IVAL(buf,0));
}
if (preserve_hard_links)
flist_ndx_push(&hlink_list, IVAL(buf,0));
@@
-309,10
+297,7
@@
static void read_msg_fd(void)
if (n >= sizeof buf)
n = sizeof buf - 1;
read_loop(fd, buf, n);
if (n >= sizeof buf)
n = sizeof buf - 1;
read_loop(fd, buf, n);
- if (am_generator && am_server && defer_forwarding_messages)
- msg_list_add(&msg2sndr, tag, buf, n);
- else
- rwrite((enum logcode)tag, buf, n);
+ rwrite(tag, buf, n);
len -= n;
}
break;
len -= n;
}
break;
@@
-326,7
+311,7
@@
static void read_msg_fd(void)
}
/* This is used by the generator to limit how many file transfers can
}
/* This is used by the generator to limit how many file transfers can
- * be active at once when --remove-s
ent
-files is specified. Without
+ * be active at once when --remove-s
ource
-files is specified. Without
* this, sender-side deletions were mostly happening at the end. */
void increment_active_files(int ndx, int itemizing, enum logcode code)
{
* this, sender-side deletions were mostly happening at the end. */
void increment_active_files(int ndx, int itemizing, enum logcode code)
{
@@
-386,14
+371,19
@@
static int msg2genr_flush(int flush_it_all)
return 1;
}
return 1;
}
-
void
send_msg(enum msgcode code, char *buf, int len)
+
int
send_msg(enum msgcode code, char *buf, int len)
{
if (msg_fd_out < 0) {
{
if (msg_fd_out < 0) {
- io_multiplex_write(code, buf, len);
- return;
+ if (!defer_forwarding_messages)
+ return io_multiplex_write(code, buf, len);
+ if (!io_multiplexing_out)
+ return 0;
+ msg_list_add(&msg2sndr, code, buf, len);
+ return 1;
}
msg_list_add(&msg2genr, code, buf, len);
msg2genr_flush(NORMAL_FLUSH);
}
msg_list_add(&msg2genr, code, buf, len);
msg2genr_flush(NORMAL_FLUSH);
+ return 1;
}
int get_redo_num(int itemizing, enum logcode code)
}
int get_redo_num(int itemizing, enum logcode code)
@@
-643,13
+633,19
@@
int read_filesfrom_line(int fd, char *fname)
if (cnt < 0 && (errno == EWOULDBLOCK
|| errno == EINTR || errno == EAGAIN)) {
struct timeval tv;
if (cnt < 0 && (errno == EWOULDBLOCK
|| errno == EINTR || errno == EAGAIN)) {
struct timeval tv;
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(fd, &fds);
+ fd_set r_fds, e_fds;
+ FD_ZERO(&r_fds);
+ FD_SET(fd, &r_fds);
+ FD_ZERO(&e_fds);
+ FD_SET(fd, &e_fds);
tv.tv_sec = select_timeout;
tv.tv_usec = 0;
tv.tv_sec = select_timeout;
tv.tv_usec = 0;
- if (!select(fd+1, &
fds, NULL, NULL
, &tv))
+ if (!select(fd+1, &
r_fds, NULL, &e_fds
, &tv))
check_timeout();
check_timeout();
+ if (FD_ISSET(fd, &e_fds)) {
+ rsyserr(FINFO, errno,
+ "select exception on fd %d", fd);
+ }
continue;
}
if (cnt != 1)
continue;
}
if (cnt != 1)
@@
-1001,7
+997,7
@@
void write_sum_head(int f, struct sum_struct *sum)
static void sleep_for_bwlimit(int bytes_written)
{
static struct timeval prior_tv;
static void sleep_for_bwlimit(int bytes_written)
{
static struct timeval prior_tv;
- static long total_written = 0;
+ static long total_written = 0;
struct timeval tv, start_tv;
long elapsed_usec, sleep_usec;
struct timeval tv, start_tv;
long elapsed_usec, sleep_usec;
@@
-1010,7
+1006,7
@@
static void sleep_for_bwlimit(int bytes_written)
if (!bwlimit_writemax)
return;
if (!bwlimit_writemax)
return;
- total_written += bytes_written;
+ total_written += bytes_written;
gettimeofday(&start_tv, NULL);
if (prior_tv.tv_sec) {
gettimeofday(&start_tv, NULL);
if (prior_tv.tv_sec) {
@@
-1046,7
+1042,7
@@
static void sleep_for_bwlimit(int bytes_written)
static void writefd_unbuffered(int fd,char *buf,size_t len)
{
size_t n, total = 0;
static void writefd_unbuffered(int fd,char *buf,size_t len)
{
size_t n, total = 0;
- fd_set w_fds, r_fds;
+ fd_set w_fds, r_fds
, e_fds
;
int maxfd, count, cnt, using_r_fds;
int defer_save = defer_forwarding_messages;
struct timeval tv;
int maxfd, count, cnt, using_r_fds;
int defer_save = defer_forwarding_messages;
struct timeval tv;
@@
-1055,12
+1051,14
@@
static void writefd_unbuffered(int fd,char *buf,size_t len)
while (total < len) {
FD_ZERO(&w_fds);
while (total < len) {
FD_ZERO(&w_fds);
- FD_SET(fd,&w_fds);
+ FD_SET(fd, &w_fds);
+ FD_ZERO(&e_fds);
+ FD_SET(fd, &e_fds);
maxfd = fd;
if (msg_fd_in >= 0) {
FD_ZERO(&r_fds);
maxfd = fd;
if (msg_fd_in >= 0) {
FD_ZERO(&r_fds);
- FD_SET(msg_fd_in,&r_fds);
+ FD_SET(msg_fd_in,
&r_fds);
if (msg_fd_in > maxfd)
maxfd = msg_fd_in;
using_r_fds = 1;
if (msg_fd_in > maxfd)
maxfd = msg_fd_in;
using_r_fds = 1;
@@
-1072,7
+1070,7
@@
static void writefd_unbuffered(int fd,char *buf,size_t len)
errno = 0;
count = select(maxfd + 1, using_r_fds ? &r_fds : NULL,
errno = 0;
count = select(maxfd + 1, using_r_fds ? &r_fds : NULL,
- &w_fds,
NULL
, &tv);
+ &w_fds,
&e_fds
, &tv);
if (count <= 0) {
if (count < 0 && errno == EBADF)
if (count <= 0) {
if (count < 0 && errno == EBADF)
@@
-1081,6
+1079,11
@@
static void writefd_unbuffered(int fd,char *buf,size_t len)
continue;
}
continue;
}
+ if (FD_ISSET(fd, &e_fds)) {
+ rsyserr(FINFO, errno,
+ "select exception on fd %d", fd);
+ }
+
if (using_r_fds && FD_ISSET(msg_fd_in, &r_fds))
read_msg_fd();
if (using_r_fds && FD_ISSET(msg_fd_in, &r_fds))
read_msg_fd();