- if (protocol_version < 23) {
- if (protocol_version == 22 || am_sender)
- io_start_multiplex_out(f_out);
+ if (protocol_version < 23
+ && (protocol_version == 22 || am_sender))
+ io_start_multiplex_out();
+ else if (!ret) {
+ /* We have to get I/O multiplexing started so that we can
+ * get the error back to the client. This means getting
+ * the protocol setup finished first in later versions. */
+ setup_protocol(f_out, f_in);
+ if (!am_sender) {
+ /* Since we failed in our option parsing, we may not
+ * have finished parsing that the client sent us a
+ * --files-from option, so look for it manually.
+ * Without this, the socket would be in the wrong
+ * state for the upcoming error message. */
+ if (!files_from) {
+ int i;
+ for (i = 0; i < argc; i++) {
+ if (strncmp(argv[i], "--files-from", 12) == 0) {
+ files_from = "";
+ break;
+ }
+ }
+ }
+ if (files_from)
+ write_byte(f_out, 0);
+ }
+ io_start_multiplex_out();