+
+
+/* setup for multiplexing an error stream with the data stream */
+void io_start_multiplex_out(int fd)
+{
+ multiplex_out_fd = fd;
+ io_flush();
+ io_start_buffering(fd);
+ io_multiplexing_out = 1;
+}
+
+/* setup for multiplexing an error stream with the data stream */
+void io_start_multiplex_in(int fd)
+{
+ multiplex_in_fd = fd;
+ io_flush();
+ if (read_buffer_len) {
+ fprintf(stderr,"ERROR: data in read buffer at mplx start\n");
+ exit_cleanup(RERR_STREAMIO);
+ }
+
+ io_multiplexing_in = 1;
+}
+
+/* write an message to the multiplexed error stream */
+int io_multiplex_write(int f, char *buf, int len)
+{
+ if (!io_multiplexing_out) return 0;
+
+ io_flush();
+
+ SIVAL(io_buffer-4, 0, ((MPLEX_BASE + f)<<24) + len);
+ memcpy(io_buffer, buf, len);
+
+ stats.total_written += (len+4);
+
+ writefd_unbuffered(multiplex_out_fd, io_buffer-4, len+4);
+ return 1;
+}
+
+/* write a message to the special error fd */
+int io_error_write(int f, char *buf, int len)
+{
+ if (f == -1) return 0;
+ writefd_unbuffered(f, buf, len);
+ return 1;
+}
+
+/* stop output multiplexing */
+void io_multiplexing_close(void)
+{
+ io_multiplexing_out = 0;
+}
+
+void io_close_input(int fd)
+{
+ buffer_f_in = -1;
+}