--- rsync.h.orig 2017-01-16 18:59:44.580812000 +0100 +++ rsync.h 2017-01-16 18:59:51.814260000 +0100 @@ -166,6 +166,7 @@ #define ATTRS_REPORT (1<<0) #define ATTRS_SKIP_MTIME (1<<1) +#define MSG_FLUSH 2 #define FULL_FLUSH 1 #define NORMAL_FLUSH 0 --- io.c.orig 2015-08-08 21:47:03.000000000 +0200 +++ io.c 2017-01-16 19:01:07.000000000 +0100 @@ -1985,10 +1985,11 @@ void io_flush(int flush_it_all) { if (iobuf.out.len > iobuf.out_empty_len) { - if (flush_it_all) /* FULL_FLUSH: flush everything in the output buffers */ + if (flush_it_all == FULL_FLUSH) /* flush everything in the output buffers */ perform_io(iobuf.out.size - iobuf.out_empty_len, PIO_NEED_OUTROOM); - else /* NORMAL_FLUSH: flush at least 1 byte */ + else if (flush_it_all == NORMAL_FLUSH) /* flush at least 1 byte */ perform_io(iobuf.out.size - iobuf.out.len + 1, PIO_NEED_OUTROOM); + /* MSG_FLUSH: flush iobuf.msg only */ } if (iobuf.msg.len) perform_io(iobuf.msg.size, PIO_NEED_MSGROOM); --- cleanup.c.orig 2015-08-08 21:47:03.000000000 +0200 +++ cleanup.c 2017-01-17 21:09:57.000000000 +0100 @@ -243,15 +243,22 @@ switch_step++; if (exit_code && exit_code != RERR_SOCKETIO && exit_code != RERR_STREAMIO && exit_code != RERR_SIGNAL1 - && exit_code != RERR_TIMEOUT && !shutting_down && (protocol_version >= 31 || am_receiver)) { - if (line > 0) { - if (DEBUG_GTE(EXIT, 3)) { - rprintf(FINFO, "[%s] sending MSG_ERROR_EXIT with exit_code %d\n", - who_am_i(), exit_code); + && exit_code != RERR_TIMEOUT && !shutting_down) { + if (protocol_version >= 31 || am_receiver) { + if (line > 0) { + if (DEBUG_GTE(EXIT, 3)) { + rprintf(FINFO, "[%s] sending MSG_ERROR_EXIT with exit_code %d\n", + who_am_i(), exit_code); + } + send_msg_int(MSG_ERROR_EXIT, exit_code); } - send_msg_int(MSG_ERROR_EXIT, exit_code); + /* Be sure to send all remaining messages */ + io_flush(MSG_FLUSH); + noop_io_until_death(); } - noop_io_until_death(); + else + /* Be sure to send all remaining messages */ + io_flush(MSG_FLUSH); } /* FALLTHROUGH */