aboutsummaryrefslogtreecommitdiff
path: root/client/acronc/handler_socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/acronc/handler_socket.c')
-rw-r--r--client/acronc/handler_socket.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/client/acronc/handler_socket.c b/client/acronc/handler_socket.c
index ff8eefb..efed127 100644
--- a/client/acronc/handler_socket.c
+++ b/client/acronc/handler_socket.c
@@ -42,6 +42,20 @@ static void ex2(bool force, bool cb) {
force ? "true" : "false",
RUNNING ? "true" : "false");
if (ac_conn) {
+ /* We do not want to read anything after.
+ * We will try to read as much as we can until an error or cmd result is received.
+ * Although it is possible that the server sends anything else with the same ID after,
+ * we will discard it.
+ * (The above applies to ad-hoc executions of acronc, e.g. echo cmd | acronc, where
+ * an EOF immediately follows the command.)
+ * If we do not wait, on_read will come AFTER ac_disconnect, thus calling ac_receive
+ * on a dangling pointer.
+ * If we simply stop reading the socket upon ac_disconnect, everything will be lost, including
+ * the command outputs, which is undesirable for ad-hoc runs.
+ * Therefore, the approach is to pause stdin until we believe that it is unlikely for any new
+ * responses to come, then resume stdin, and exit. */
+ LOGD("Stopping socket input.");
+ uv_read_stop((uv_stream_t *) &sock);
ac_disconnect(ac_conn,
RUNNING ? force : true /* If sock is not running, always force */);
ac_conn = NULL;
@@ -106,6 +120,9 @@ static void on_read(uv_stream_t *tcp, ssize_t nread, const uv_buf_t *buf) {
ex(true); /* Force close libac connection here. */
return;
}
+ if (!ac_conn) {
+ LOGE("on_read called after ac_disconnect!");
+ }
int r;
ac_obj_t *obj = NULL;
if ((r = ac_receive(ac_conn, buf->base, nread, &obj))) {