X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/6d56efa6ea66afa2e6f4eb79d9dd5f3b54b723c3..5dd14f0c3388f69932d521915e039e32b9e6d970:/io.c diff --git a/io.c b/io.c index 6e5c2329..ed556b15 100644 --- a/io.c +++ b/io.c @@ -29,6 +29,7 @@ #include "rsync.h" #include "ifuncs.h" +#include "inums.h" /** If no timeout is specified then use a 60 second select timeout */ #define SELECT_TIMEOUT 60 @@ -36,7 +37,6 @@ extern int bwlimit; extern size_t bwlimit_writemax; extern int io_timeout; -extern int allowed_lull; extern int am_server; extern int am_daemon; extern int am_sender; @@ -47,7 +47,6 @@ extern int eol_nulls; extern int flist_eof; extern int list_only; extern int read_batch; -extern int csum_length; extern int protect_args; extern int checksum_seed; extern int protocol_version; @@ -60,7 +59,8 @@ extern int filesfrom_convert; extern iconv_t ic_send, ic_recv; #endif -const char phase_unknown[] = "unknown"; +int csum_length = SHORT_SUM_LENGTH; /* initial value */ +int allowed_lull = 0; int ignore_timeout = 0; int batch_fd = -1; int msgdone_cnt = 0; @@ -101,7 +101,7 @@ static char ff_lastchar; #ifdef ICONV_OPTION static xbuf iconv_buf = EMPTY_XBUF; #endif -static int defer_forwarding_messages = 0, defer_forwarding_keep = 0; +static int defer_forwarding_messages = 0, keep_defer_forwarding = 0; static int select_timeout = SELECT_TIMEOUT; static int active_filecnt = 0; static OFF_T active_bytecnt = 0; @@ -183,9 +183,7 @@ static int flist_ndx_pop(struct flist_ndx_list *lp) static void got_flist_entry_status(enum festatus status, const char *buf) { int ndx = IVAL(buf, 0); - struct file_list *flist = flist_for_ndx(ndx); - - assert(flist != NULL); + struct file_list *flist = flist_for_ndx(ndx, "got_flist_entry_status"); if (remove_source_files) { active_filecnt--; @@ -296,33 +294,32 @@ static void msg_list_add(struct msg_list *lst, int code, const char *buf, int le lst->tail = m; } +static inline int flush_a_msg(int fd) +{ + struct msg_list_item *m = msg_queue.head; + int len = IVAL(m->buf, 0) & 0xFFFFFF; + int tag = *((uchar*)m->buf+3) - MPLEX_BASE; + + if (!(msg_queue.head = m->next)) + msg_queue.tail = NULL; + + defer_forwarding_messages++; + mplex_write(fd, tag, m->buf + 4, len, m->convert); + defer_forwarding_messages--; + + free(m); + + return len; +} + static void msg_flush(void) { if (am_generator) { - while (msg_queue.head && io_multiplexing_out) { - struct msg_list_item *m = msg_queue.head; - int len = IVAL(m->buf, 0) & 0xFFFFFF; - int tag = *((uchar*)m->buf+3) - MPLEX_BASE; - if (!(msg_queue.head = m->next)) - msg_queue.tail = NULL; - stats.total_written += len + 4; - defer_forwarding_messages++; - mplex_write(sock_f_out, tag, m->buf + 4, len, m->convert); - defer_forwarding_messages--; - free(m); - } + while (msg_queue.head && io_multiplexing_out) + stats.total_written += flush_a_msg(sock_f_out) + 4; } else { - while (msg_queue.head) { - struct msg_list_item *m = msg_queue.head; - int len = IVAL(m->buf, 0) & 0xFFFFFF; - int tag = *((uchar*)m->buf+3) - MPLEX_BASE; - if (!(msg_queue.head = m->next)) - msg_queue.tail = NULL; - defer_forwarding_messages++; - mplex_write(msg_fd_out, tag, m->buf + 4, len, m->convert); - defer_forwarding_messages--; - free(m); - } + while (msg_queue.head) + (void)flush_a_msg(msg_fd_out); } } @@ -449,6 +446,7 @@ static void read_msg_fd(void) got_flist_entry_status(FES_NO_SEND, buf); break; case MSG_ERROR_SOCKET: + case MSG_ERROR_UTF8: case MSG_CLIENT: if (!am_generator) goto invalid_msg; @@ -512,7 +510,7 @@ static void mplex_write(int fd, enum msgcode code, const char *buf, size_t len, xbuf outbuf, inbuf; INIT_XBUF(outbuf, buffer + 4, 0, sizeof buffer - 4); - INIT_XBUF(inbuf, (char*)buf, len, -1); + INIT_XBUF(inbuf, (char*)buf, len, (size_t)-1); iconvbufs(ic_send, &inbuf, &outbuf, ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE); @@ -531,9 +529,9 @@ static void mplex_write(int fd, enum msgcode code, const char *buf, size_t len, SIVAL(buffer, 0, ((MPLEX_BASE + (int)code)<<24) + len); - defer_forwarding_keep = 1; /* defer_forwarding_messages++ on return */ + keep_defer_forwarding++; /* defer_forwarding_messages++ on return */ writefd_unbuffered(fd, buffer, n+4); - defer_forwarding_keep = 0; + keep_defer_forwarding--; if (len > n) writefd_unbuffered(fd, buf+n, len-n); @@ -568,10 +566,9 @@ void send_msg_int(enum msgcode code, int num) void wait_for_receiver(void) { - if (iobuf_out_cnt) - io_flush(NORMAL_FLUSH); - else - read_msg_fd(); + if (io_flush(FULL_FLUSH)) + return; + read_msg_fd(); } int get_redo_num(void) @@ -630,7 +627,7 @@ static void whine_about_eof(int fd) rprintf(FERROR, RSYNC_NAME ": connection unexpectedly closed " "(%s bytes received so far) [%s]\n", - big_num(stats.total_read, 0), who_am_i()); + big_num(stats.total_read), who_am_i()); exit_cleanup(RERR_STREAMIO); } @@ -1092,10 +1089,9 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) xbuf outbuf, inbuf; char ibuf[512]; int add_null = 0; - int pos = 0; INIT_CONST_XBUF(outbuf, line); - INIT_XBUF(inbuf, ibuf, 0, -1); + INIT_XBUF(inbuf, ibuf, 0, (size_t)-1); while (msg_bytes) { inbuf.len = msg_bytes > sizeof ibuf @@ -1107,7 +1103,6 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) if (iconvbufs(ic_send, &inbuf, &outbuf, ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE) < 0) goto overflow; - pos = -1; } if (add_null) { if (outbuf.len == outbuf.size) @@ -1555,24 +1550,34 @@ static void writefd_unbuffered(int fd, const char *buf, size_t len) } no_flush--; - defer_inc -= defer_forwarding_keep; + if (keep_defer_forwarding) + defer_inc--; if (!(defer_forwarding_messages -= defer_inc) && !no_flush) msg_flush(); } -void io_flush(int flush_it_all) +int io_flush(int flush_it_all) { - if (!iobuf_out_cnt || no_flush) - return; + int flushed_something = 0; - if (io_multiplexing_out) - mplex_write(sock_f_out, MSG_DATA, iobuf_out, iobuf_out_cnt, 0); - else - writefd_unbuffered(iobuf_f_out, iobuf_out, iobuf_out_cnt); - iobuf_out_cnt = 0; + if (no_flush) + return 0; + + if (iobuf_out_cnt) { + if (io_multiplexing_out) + mplex_write(sock_f_out, MSG_DATA, iobuf_out, iobuf_out_cnt, 0); + else + writefd_unbuffered(iobuf_f_out, iobuf_out, iobuf_out_cnt); + iobuf_out_cnt = 0; + flushed_something = 1; + } - if (flush_it_all && !defer_forwarding_messages) + if (flush_it_all && !defer_forwarding_messages && msg_queue.head) { msg_flush(); + flushed_something = 1; + } + + return flushed_something; } static void writefd(int fd, const char *buf, size_t len)