summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2017-01-06 10:59:06 -0500
committermidipix <writeonce@midipix.org>2017-01-07 11:41:11 -0500
commit6db2d72937ec42179f9b07a560e75b49603ced56 (patch)
tree9ad8f4501990219bedac19179020a0ed645807de /src
parent0fb614d9c75ff41a55b1da17a1b36b1f5c1ece84 (diff)
downloadptycon-6db2d72937ec42179f9b07a560e75b49603ced56.tar.bz2
ptycon-6db2d72937ec42179f9b07a560e75b49603ced56.tar.xz
ptyc_console_writer(): detect termination of all pts clients.
Diffstat (limited to 'src')
-rw-r--r--src/console/ptyc_console_poller.c8
-rw-r--r--src/console/ptyc_console_writer.c12
2 files changed, 12 insertions, 8 deletions
diff --git a/src/console/ptyc_console_poller.c b/src/console/ptyc_console_poller.c
index 7f63197..7aec73d 100644
--- a/src/console/ptyc_console_poller.c
+++ b/src/console/ptyc_console_poller.c
@@ -17,6 +17,7 @@ int __stdcall ptyc_console_poller(struct ptyc_driver_ctx_impl * ictx)
int32_t status;
int32_t iostatus;
struct ptyc_term_ctx * tctx;
+ struct ptyc_driver_ctx * dctx;
nt_tty_sigctl_info ctlinfo;
void * hwnd;
void * hevent;
@@ -27,6 +28,7 @@ int __stdcall ptyc_console_poller(struct ptyc_driver_ctx_impl * ictx)
int diff;
tctx = &ictx->tctx;
+ dctx = &ictx->ctx;
if (!(hwnd = ntcon->get_console_window()))
return NT_STATUS_INTERNAL_ERROR;
@@ -89,7 +91,9 @@ int __stdcall ptyc_console_poller(struct ptyc_driver_ctx_impl * ictx)
&ctlinfo,sizeof(ctlinfo))))
return iostatus;
}
- } while (status == NT_STATUS_TIMEOUT);
+ } while ((status == NT_STATUS_TIMEOUT) && (dctx->status == NT_STATUS_SUCCESS));
- return NT_STATUS_INTERNAL_ERROR;
+ return (dctx->status == NT_STATUS_PIPE_DISCONNECTED)
+ ? NT_STATUS_SUCCESS
+ : dctx->status ? dctx->status : status;
}
diff --git a/src/console/ptyc_console_writer.c b/src/console/ptyc_console_writer.c
index 24509f8..bef7ea7 100644
--- a/src/console/ptyc_console_writer.c
+++ b/src/console/ptyc_console_writer.c
@@ -11,6 +11,7 @@
#include <ptycon/ptycon.h>
#include "ptycon_driver_impl.h"
+#include "ptycon_status_impl.h"
static ptyc_term_handler ptyc_screen_handler;
static ptyc_term_handler ptyc_ctrl_handler;
@@ -59,13 +60,12 @@ int __stdcall ptyc_console_writer(struct ptyc_driver_ctx_impl * ictx)
0,0);
if (status == NT_STATUS_PENDING)
- status = ntapi->zw_wait_for_single_object(
- hwait,NT_SYNC_ALERTABLE,0);
+ if (!(status = ntapi->zw_wait_for_single_object(
+ hwait,NT_SYNC_ALERTABLE,0)))
+ status = iosb.status;
- if (status || iosb.status) {
- ntapi->zw_close(hwait);
- return status ? status : iosb.status;
- }
+ if (status)
+ return ptyc_set_status(&ictx->ctx,status);
/* account for leftover bytes from the previous conversion */
tctx->data.in[0] = uc_params.leftover_bytes;