X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ba525f770c3133683c894ac08f13286a97ab4315..aabb50d4e391be5768fa76170372e28e85902f95:/io.c diff --git a/io.c b/io.c index 1899cb9d..3faf83d0 100644 --- a/io.c +++ b/io.c @@ -28,6 +28,7 @@ * io_start_multiplex_out() and io_start_multiplex_in(). */ #include "rsync.h" +#include "ifuncs.h" /** If no timeout is specified then use a 60 second select timeout */ #define SELECT_TIMEOUT 60 @@ -52,7 +53,7 @@ extern int protocol_version; extern int remove_source_files; extern int preserve_hard_links; extern struct stats stats; -extern struct file_list *cur_flist, *first_flist; +extern struct file_list *cur_flist; #ifdef ICONV_OPTION extern int filesfrom_convert; extern iconv_t ic_send, ic_recv; @@ -387,6 +388,12 @@ static void read_msg_fd(void) goto invalid_msg; flist_eof = 1; break; + case MSG_IO_ERROR: + if (len != 4) + goto invalid_msg; + readfd(fd, buf, len); + io_error |= IVAL(buf, 0); + break; case MSG_DELETED: if (len >= (int)sizeof buf || !am_generator) goto invalid_msg; @@ -674,7 +681,11 @@ static int read_timeout(int fd, char *buf, size_t len) } } else if (io_filesfrom_f_in >= 0) { if (FD_ISSET(io_filesfrom_f_in, &r_fds)) { +#ifdef ICONV_OPTION xbuf *ibuf = filesfrom_convert ? &iconv_buf : &ff_buf; +#else + xbuf *ibuf = &ff_buf; +#endif int l = read(io_filesfrom_f_in, ibuf->buf, ibuf->size); if (l <= 0) { if (l == 0 || errno != EINTR) { @@ -685,6 +696,7 @@ static int read_timeout(int fd, char *buf, size_t len) io_filesfrom_f_in = -1; } } else { +#ifdef ICONV_OPTION if (filesfrom_convert) { iconv_buf.pos = 0; iconv_buf.len = l; @@ -692,6 +704,7 @@ static int read_timeout(int fd, char *buf, size_t len) ICB_EXPAND_OUT|ICB_INCLUDE_BAD|ICB_INCLUDE_INCOMPLETE); l = ff_buf.len; } +#endif if (!eol_nulls) { char *s = ff_buf.buf + l; /* Transform CR and/or LF into '\0' */ @@ -771,7 +784,11 @@ int read_line(int fd, char *buf, size_t bufsiz, int flags) #endif start: +#ifdef ICONV_OPTION s = flags & RL_CONVERT ? iconv_buf.buf : buf; +#else + s = buf; +#endif eob = s + bufsiz - 1; while (1) { cnt = read(fd, &ch, 1); @@ -830,8 +847,11 @@ int read_args(int f_in, char *mod_name, char *buf, size_t bufsiz, int rl_nulls, int dot_pos = 0; int argc = 0; char **argv, *p; - int rl_flags = (rl_nulls ? RL_EOL_NULLS : 0) - | (protect_args && ic_recv != (iconv_t)-1 ? RL_CONVERT : 0); + int rl_flags = (rl_nulls ? RL_EOL_NULLS : 0); + +#ifdef ICONV_OPTION + rl_flags |= (protect_args && ic_recv != (iconv_t)-1 ? RL_CONVERT : 0); +#endif if (!(argv = new_array(char *, maxargs))) out_of_memory("read_args"); @@ -1027,6 +1047,7 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) if (msg_bytes != 4) goto invalid_msg; read_loop(fd, line, msg_bytes); + send_msg_int(MSG_IO_ERROR, IVAL(line, 0)); io_error |= IVAL(line, 0); break; case MSG_DELETED: @@ -1840,6 +1861,8 @@ void start_write_batch(int fd) * actual communication so far depends on whether a daemon * is involved. */ write_int(batch_fd, protocol_version); + if (protocol_version >= 30) + write_byte(batch_fd, inc_recurse); write_int(batch_fd, checksum_seed); if (am_sender)