+void io_flush(void)
+{
+ int fd = multiplex_out_fd;
+ if (!io_buffer_count) return;
+
+ if (io_multiplexing_out) {
+ SIVAL(io_buffer-4, 0, (MPLEX_BASE<<24) + io_buffer_count);
+ if (writefd_unbuffered(fd, io_buffer-4, io_buffer_count+4) !=
+ io_buffer_count+4) {
+ rprintf(FERROR,"write failed\n");
+ exit_cleanup(1);
+ }
+ } else {
+ if (writefd_unbuffered(fd, io_buffer, io_buffer_count) !=
+ io_buffer_count) {
+ rprintf(FERROR,"write failed\n");
+ exit_cleanup(1);
+ }
+ }
+ io_buffer_count = 0;
+}
+
+void io_end_buffering(int fd)
+{
+ io_flush();
+ if (!io_multiplexing_out) {
+ free(io_buffer-4);
+ io_buffer = NULL;
+ }
+}
+
+static int writefd(int fd,char *buf,int len1)
+{
+ int len = len1;
+
+ if (!io_buffer) return writefd_unbuffered(fd, buf, len);
+
+ while (len) {
+ int n = MIN(len, IO_BUFFER_SIZE-io_buffer_count);
+ if (n > 0) {
+ memcpy(io_buffer+io_buffer_count, buf, n);
+ buf += n;
+ len -= n;
+ io_buffer_count += n;
+ }
+
+ if (io_buffer_count == IO_BUFFER_SIZE) io_flush();
+ }
+
+ return len1;
+}