X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/a72f37bb67f16c2d5a17bae77f7a82bcfdd96a9c..7c7462cd3079c27062569dce90f6ae3fa79040b3:/io.c diff --git a/io.c b/io.c index d884846a..2756b148 100644 --- a/io.c +++ b/io.c @@ -63,6 +63,7 @@ int allowed_lull = 0; int ignore_timeout = 0; int batch_fd = -1; int msgdone_cnt = 0; +int check_for_io_err = 0; /* Ignore an EOF error if non-zero. See whine_about_eof(). */ int kluge_around_eof = 0; @@ -379,6 +380,8 @@ static void read_msg_fd(void) len = tag & 0xFFFFFF; tag = (tag >> 24) - MPLEX_BASE; + check_for_io_err = 0; + switch (tag) { case MSG_DONE: if (len < 0 || len > 1 || !am_generator) { @@ -413,6 +416,9 @@ static void read_msg_fd(void) } flist = recv_file_list(fd); flist->parent_ndx = IVAL(buf,0); + /* If the sender is going to send us an MSG_IO_ERROR value, it + * will always be the very next message following MSG_FLIST. */ + check_for_io_err = 1; #ifdef SUPPORT_HARD_LINKS if (preserve_hard_links) match_hard_links(flist); @@ -448,6 +454,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; @@ -511,7 +518,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); @@ -1060,6 +1067,8 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) msg_bytes = tag & 0xFFFFFF; tag = (tag >> 24) - MPLEX_BASE; + check_for_io_err = 0; + switch (tag) { case MSG_DATA: if (msg_bytes > iobuf_in_siz) { @@ -1093,7 +1102,7 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) int add_null = 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