version 1.1.1.2, 2013/10/14 07:51:14
|
version 1.1.1.3, 2016/11/01 09:54:32
|
Line 4
|
Line 4
|
* Copyright (C) 1996-2001 Andrew Tridgell |
* Copyright (C) 1996-2001 Andrew Tridgell |
* Copyright (C) 1996 Paul Mackerras |
* Copyright (C) 1996 Paul Mackerras |
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org> |
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org> |
* Copyright (C) 2003-2013 Wayne Davison | * Copyright (C) 2003-2015 Wayne Davison |
* |
* |
* This program is free software; you can redistribute it and/or modify |
* 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 |
* it under the terms of the GNU General Public License as published by |
Line 155 static void read_a_msg(void);
|
Line 155 static void read_a_msg(void);
|
static void drain_multiplex_messages(void); |
static void drain_multiplex_messages(void); |
static void sleep_for_bwlimit(int bytes_written); |
static void sleep_for_bwlimit(int bytes_written); |
|
|
static void check_timeout(BOOL allow_keepalive) | static void check_timeout(BOOL allow_keepalive, int keepalive_flags) |
{ |
{ |
time_t t, chk; |
time_t t, chk; |
|
|
Line 177 static void check_timeout(BOOL allow_keepalive)
|
Line 177 static void check_timeout(BOOL allow_keepalive)
|
|
|
if (allow_keepalive) { |
if (allow_keepalive) { |
/* This may put data into iobuf.msg w/o flushing. */ |
/* This may put data into iobuf.msg w/o flushing. */ |
maybe_send_keepalive(t, 0); | maybe_send_keepalive(t, keepalive_flags); |
} |
} |
|
|
if (!last_io_in) |
if (!last_io_in) |
Line 232 static NORETURN void whine_about_eof(BOOL allow_kluge)
|
Line 232 static NORETURN void whine_about_eof(BOOL allow_kluge)
|
* the socket except very early in the transfer. */ |
* the socket except very early in the transfer. */ |
static size_t safe_read(int fd, char *buf, size_t len) |
static size_t safe_read(int fd, char *buf, size_t len) |
{ |
{ |
size_t got; | size_t got = 0; |
int n; | |
|
|
assert(fd != iobuf.in_fd); |
assert(fd != iobuf.in_fd); |
|
|
n = read(fd, buf, len); |
|
if ((size_t)n == len || n == 0) { |
|
if (DEBUG_GTE(IO, 2)) |
|
rprintf(FINFO, "[%s] safe_read(%d)=%ld\n", who_am_i(), fd, (long)n); |
|
return n; |
|
} |
|
if (n < 0) { |
|
if (errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN) { |
|
read_failed: |
|
rsyserr(FERROR, errno, "safe_read failed to read %ld bytes [%s]", |
|
(long)len, who_am_i()); |
|
exit_cleanup(RERR_STREAMIO); |
|
} |
|
got = 0; |
|
} else |
|
got = n; |
|
|
|
while (1) { |
while (1) { |
struct timeval tv; |
struct timeval tv; |
fd_set r_fds, e_fds; |
fd_set r_fds, e_fds; |
Line 273 static size_t safe_read(int fd, char *buf, size_t len)
|
Line 255 static size_t safe_read(int fd, char *buf, size_t len)
|
who_am_i()); |
who_am_i()); |
exit_cleanup(RERR_FILEIO); |
exit_cleanup(RERR_FILEIO); |
} |
} |
if (io_timeout) | check_timeout(1, MSK_ALLOW_FLUSH); |
maybe_send_keepalive(time(NULL), MSK_ALLOW_FLUSH); | |
continue; |
continue; |
} |
} |
|
|
Line 282 static size_t safe_read(int fd, char *buf, size_t len)
|
Line 263 static size_t safe_read(int fd, char *buf, size_t len)
|
rprintf(FINFO, "select exception on fd %d\n", fd); */ |
rprintf(FINFO, "select exception on fd %d\n", fd); */ |
|
|
if (FD_ISSET(fd, &r_fds)) { |
if (FD_ISSET(fd, &r_fds)) { |
n = read(fd, buf + got, len - got); | int n = read(fd, buf + got, len - got); |
if (DEBUG_GTE(IO, 2)) |
if (DEBUG_GTE(IO, 2)) |
rprintf(FINFO, "[%s] safe_read(%d)=%ld\n", who_am_i(), fd, (long)n); |
rprintf(FINFO, "[%s] safe_read(%d)=%ld\n", who_am_i(), fd, (long)n); |
if (n == 0) |
if (n == 0) |
Line 290 static size_t safe_read(int fd, char *buf, size_t len)
|
Line 271 static size_t safe_read(int fd, char *buf, size_t len)
|
if (n < 0) { |
if (n < 0) { |
if (errno == EINTR) |
if (errno == EINTR) |
continue; |
continue; |
goto read_failed; | rsyserr(FERROR, errno, "safe_read failed to read %ld bytes [%s]", |
| (long)len, who_am_i()); |
| exit_cleanup(RERR_STREAMIO); |
} |
} |
if ((got += (size_t)n) == len) |
if ((got += (size_t)n) == len) |
break; |
break; |
Line 768 static char *perform_io(size_t needed, int flags)
|
Line 751 static char *perform_io(size_t needed, int flags)
|
send_extra_file_list(sock_f_out, -1); |
send_extra_file_list(sock_f_out, -1); |
extra_flist_sending_enabled = !flist_eof; |
extra_flist_sending_enabled = !flist_eof; |
} else |
} else |
check_timeout((flags & PIO_NEED_INPUT) != 0); | check_timeout((flags & PIO_NEED_INPUT) != 0, 0); |
FD_ZERO(&r_fds); /* Just in case... */ |
FD_ZERO(&r_fds); /* Just in case... */ |
FD_ZERO(&w_fds); |
FD_ZERO(&w_fds); |
} |
} |
Line 1388 void maybe_send_keepalive(time_t now, int flags)
|
Line 1371 void maybe_send_keepalive(time_t now, int flags)
|
if (flags & MSK_ACTIVE_RECEIVER) |
if (flags & MSK_ACTIVE_RECEIVER) |
last_io_in = now; /* Fudge things when we're working hard on the files. */ |
last_io_in = now; /* Fudge things when we're working hard on the files. */ |
|
|
|
/* Early in the transfer (before the receiver forks) the receiving side doesn't |
|
* care if it hasn't sent data in a while as long as it is receiving data (in |
|
* fact, a pre-3.1.0 rsync would die if we tried to send it a keep alive during |
|
* this time). So, if we're an early-receiving proc, just return and let the |
|
* incoming data determine if we timeout. */ |
|
if (!am_sender && !am_receiver && !am_generator) |
|
return; |
|
|
if (now - last_io_out >= allowed_lull) { |
if (now - last_io_out >= allowed_lull) { |
/* The receiver is special: it only sends keep-alive messages if it is |
/* The receiver is special: it only sends keep-alive messages if it is |
* actively receiving data. Otherwise, it lets the generator timeout. */ |
* actively receiving data. Otherwise, it lets the generator timeout. */ |
Line 1694 void wait_for_receiver(void)
|
Line 1685 void wait_for_receiver(void)
|
rprintf(FINFO, "[%s] receiving flist for dir %d\n", |
rprintf(FINFO, "[%s] receiving flist for dir %d\n", |
who_am_i(), ndx); |
who_am_i(), ndx); |
} |
} |
flist = recv_file_list(iobuf.in_fd); | flist = recv_file_list(iobuf.in_fd, ndx); |
flist->parent_ndx = ndx; |
flist->parent_ndx = ndx; |
#ifdef SUPPORT_HARD_LINKS |
#ifdef SUPPORT_HARD_LINKS |
if (preserve_hard_links) |
if (preserve_hard_links) |
Line 1794 int64 read_varlong(int f, uchar min_bytes)
|
Line 1785 int64 read_varlong(int f, uchar min_bytes)
|
#if SIZEOF_INT64 < 8 |
#if SIZEOF_INT64 < 8 |
u.x = IVAL(u.b,0); |
u.x = IVAL(u.b,0); |
#elif CAREFUL_ALIGNMENT |
#elif CAREFUL_ALIGNMENT |
u.x = IVAL(u.b,0) | (((int64)IVAL(u.b,4))<<32); | u.x = IVAL64(u.b,0); |
#endif |
#endif |
return u.x; |
return u.x; |
} |
} |
Line 2046 void write_varlong(int f, int64 x, uchar min_bytes)
|
Line 2037 void write_varlong(int f, int64 x, uchar min_bytes)
|
uchar bit; |
uchar bit; |
int cnt = 8; |
int cnt = 8; |
|
|
SIVAL(b, 1, x); |
|
#if SIZEOF_INT64 >= 8 |
#if SIZEOF_INT64 >= 8 |
SIVAL(b, 5, x >> 32); | SIVAL64(b, 1, x); |
#else |
#else |
|
SIVAL(b, 1, x); |
if (x <= 0x7FFFFFFF && x >= 0) |
if (x <= 0x7FFFFFFF && x >= 0) |
memset(b + 5, 0, 4); |
memset(b + 5, 0, 4); |
else { |
else { |
Line 2096 void write_longint(int f, int64 x)
|
Line 2087 void write_longint(int f, int64 x)
|
#endif |
#endif |
} |
} |
|
|
|
void write_bigbuf(int f, const char *buf, size_t len) |
|
{ |
|
size_t half_max = (iobuf.out.size - iobuf.out_empty_len) / 2; |
|
|
|
while (len > half_max + 1024) { |
|
write_buf(f, buf, half_max); |
|
buf += half_max; |
|
len -= half_max; |
|
} |
|
|
|
write_buf(f, buf, len); |
|
} |
|
|
void write_buf(int f, const char *buf, size_t len) |
void write_buf(int f, const char *buf, size_t len) |
{ |
{ |
size_t pos, siz; |
size_t pos, siz; |
Line 2279 void io_printf(int fd, const char *format, ...)
|
Line 2283 void io_printf(int fd, const char *format, ...)
|
if (len < 0) |
if (len < 0) |
exit_cleanup(RERR_PROTOCOL); |
exit_cleanup(RERR_PROTOCOL); |
|
|
if (len > (int)sizeof buf) { | if (len >= (int)sizeof buf) { |
rprintf(FERROR, "io_printf() was too long for the buffer.\n"); |
rprintf(FERROR, "io_printf() was too long for the buffer.\n"); |
exit_cleanup(RERR_PROTOCOL); |
exit_cleanup(RERR_PROTOCOL); |
} |
} |