From e4c0730bf1e13ac256a58db7ee7a58c36c8980f4 Mon Sep 17 00:00:00 2001
From: Nicholas Marriott <nicm@openbsd.org>
Date: Mon, 25 Mar 2013 11:36:59 +0000
Subject: [PATCH] Use single stdout and stderr for control clients.

---
 server-client.c | 5 ++++-
 server-fn.c     | 4 ++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/server-client.c b/server-client.c
index e590d219..13c037d8 100644
--- a/server-client.c
+++ b/server-client.c
@@ -154,7 +154,8 @@ server_client_lost(struct client *c)
 
 	evbuffer_free (c->stdin_data);
 	evbuffer_free (c->stdout_data);
-	evbuffer_free (c->stderr_data);
+	if (c->stderr_data != c->stdout_data)
+		evbuffer_free (c->stderr_data);
 
 	status_free_jobs(&c->status_new);
 	status_free_jobs(&c->status_old);
@@ -956,6 +957,8 @@ server_client_msg_identify(
 
 	if (data->flags & IDENTIFY_CONTROL) {
 		c->stdin_callback = control_callback;
+		evbuffer_free(c->stderr_data);
+		c->stderr_data = c->stdout_data;
 		c->flags |= CLIENT_CONTROL;
 		if (data->flags & IDENTIFY_TERMIOS)
 			evbuffer_add_printf(c->stdout_data, "\033P1000p");
diff --git a/server-fn.c b/server-fn.c
index f0c2dd23..c0b005e8 100644
--- a/server-fn.c
+++ b/server-fn.c
@@ -546,6 +546,10 @@ server_push_stderr(struct client *c)
 	struct msg_stderr_data data;
 	size_t                 size;
 
+	if (c->stderr_data == c->stdout_data) {
+		server_push_stdout(c);
+		return;
+	}
 	size = EVBUFFER_LENGTH(c->stderr_data);
 	if (size == 0)
 		return;