+ active_filecnt++;
+ active_bytecnt += F_LENGTH(cur_flist->files[ndx - cur_flist->ndx_start]);
+}
+
+/* Write an message to a multiplexed stream. If this fails, rsync exits. */
+static void mplex_write(int fd, enum msgcode code, const char *buf, size_t len, int convert)
+{
+ char buffer[BIGPATHBUFLEN]; /* Oversized for use by iconv code. */
+ size_t n = len;
+
+#ifdef ICONV_OPTION
+ /* We need to convert buf before doing anything else so that we
+ * can include the (converted) byte length in the message header. */
+ if (convert && ic_send != (iconv_t)-1) {
+ xbuf outbuf, inbuf;
+
+ INIT_XBUF(outbuf, buffer + 4, 0, sizeof buffer - 4);
+ INIT_XBUF(inbuf, (char*)buf, len, (size_t)-1);
+
+ iconvbufs(ic_send, &inbuf, &outbuf,
+ ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE);
+ if (inbuf.len > 0) {
+ rprintf(FERROR, "overflowed conversion buffer in mplex_write");
+ exit_cleanup(RERR_UNSUPPORTED);
+ }
+
+ n = len = outbuf.len;
+ } else
+#endif
+ if (n > 1024 - 4) /* BIGPATHBUFLEN can handle 1024 bytes */
+ n = 0; /* We'd rather do 2 writes than too much memcpy(). */
+ else
+ memcpy(buffer + 4, buf, n);
+
+ SIVAL(buffer, 0, ((MPLEX_BASE + (int)code)<<24) + len);
+
+ keep_defer_forwarding++; /* defer_forwarding_messages++ on return */
+ writefd_unbuffered(fd, buffer, n+4);
+ keep_defer_forwarding--;
+
+ if (len > n)
+ writefd_unbuffered(fd, buf+n, len-n);
+
+ if (!--defer_forwarding_messages && !no_flush)
+ msg_flush();
+}
+
+int send_msg(enum msgcode code, const char *buf, int len, int convert)
+{
+ if (msg_fd_out < 0) {
+ if (!defer_forwarding_messages)
+ return io_multiplex_write(code, buf, len, convert);
+ if (!io_multiplexing_out)
+ return 0;
+ msg_list_add(&msg_queue, code, buf, len, convert);
+ return 1;
+ }
+ if (defer_forwarding_messages)
+ msg_list_add(&msg_queue, code, buf, len, convert);
+ else
+ mplex_write(msg_fd_out, code, buf, len, convert);
+ return 1;
+}
+
+void send_msg_int(enum msgcode code, int num)
+{
+ char numbuf[4];
+ SIVAL(numbuf, 0, num);
+ send_msg(code, numbuf, 4, 0);
+}
+
+void wait_for_receiver(void)
+{
+ if (io_flush(FULL_FLUSH))
+ return;
+ read_a_msg(msg_fd_in);
+}
+
+int get_redo_num(void)
+{
+ return flist_ndx_pop(&redo_list);
+}
+
+int get_hlink_num(void)
+{
+ return flist_ndx_pop(&hlink_list);