summaryrefslogtreecommitdiffhomepage
path: root/src/console
diff options
context:
space:
mode:
Diffstat (limited to 'src/console')
-rw-r--r--src/console/ptyc_console_alloc.c220
-rw-r--r--src/console/ptyc_console_ctrl.c18
-rw-r--r--src/console/ptyc_console_poller.c19
-rw-r--r--src/console/ptyc_console_reader.c19
-rw-r--r--src/console/ptyc_console_writer.c19
5 files changed, 295 insertions, 0 deletions
diff --git a/src/console/ptyc_console_alloc.c b/src/console/ptyc_console_alloc.c
new file mode 100644
index 0000000..16d1f80
--- /dev/null
+++ b/src/console/ptyc_console_alloc.c
@@ -0,0 +1,220 @@
+/*********************************************************/
+/* ptycon: a pty-console bridge */
+/* Copyright (C) 2016 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.PTYCON. */
+/*********************************************************/
+
+#include <psxtypes/psxtypes.h>
+#include <ntcon/ntcon.h>
+#include <ntapi/ntapi.h>
+#include <gdi/gdi.h>
+
+#include <ptycon/ptycon.h>
+#include "ptycon_driver_impl.h"
+#include "ptycon_status_impl.h"
+
+int ptyc_console_ctrl(uint32_t);
+
+int ptyc_console_reader(void *);
+int ptyc_console_writer(void *);;
+int ptyc_console_poller(void *);
+
+int ptyc_dbg_event(void *);
+int ptyc_dbg_oven(void *);
+int ptyc_dbg_raw(void *);
+
+struct ptyc_loop_thread_ctx {
+ nt_thread_start_routine * entry;
+ struct ptyc_driver_ctx_impl * ictx;
+};
+
+static int ptyc_loop_thread_entry(void * ctx)
+{
+ struct ptyc_loop_thread_ctx * xctx;
+
+ xctx = (struct ptyc_loop_thread_ctx *)ctx;
+
+ return ntapi->zw_terminate_thread(
+ NT_CURRENT_THREAD_HANDLE,
+ xctx->entry(xctx->ictx));
+}
+
+static int ptyc_create_loop_thread(
+ nt_thread_params * params,
+ struct ptyc_driver_ctx_impl * ictx,
+ nt_thread_start_routine * entry)
+{
+ struct ptyc_loop_thread_ctx xctx;
+
+ xctx.entry = entry;
+ xctx.ictx = ictx;
+
+ /* rapunzel rapunzel */
+ params->hprocess = NT_CURRENT_PROCESS_HANDLE;
+ params->start = ptyc_loop_thread_entry;
+ params->ext_ctx = &xctx;
+ params->ext_ctx_size = sizeof(xctx);
+ params->stack_size_commit = 64 * 1024;
+ params->stack_size_reserve = 64 * 1024;
+ params->creation_flags = NT_CREATE_LOCAL_THREAD;
+
+ return ntapi->tt_create_thread(
+ params);
+}
+
+static int ptyc_free_console_impl(
+ struct ptyc_driver_ctx_impl * ictx,
+ int32_t status)
+{
+ struct ptyc_term_ctx * tctx;
+ struct ptyc_loop_ctx * lctx;
+
+ tctx = &ictx->tctx;
+ lctx = &ictx->lctx;
+
+ if (tctx->hin)
+ ntcon->free_console();
+
+ if (lctx->treader.hthread)
+ ntapi->zw_close(lctx->treader.hthread);
+
+ if (lctx->twriter.hthread)
+ ntapi->zw_close(lctx->twriter.hthread);
+
+ if (lctx->tpoller.hthread)
+ ntapi->zw_close(lctx->tpoller.hthread);
+
+ if (lctx->tdbgevent.hthread)
+ ntapi->zw_close(lctx->tdbgevent.hthread);
+
+ if (lctx->tdbgoven.hthread)
+ ntapi->zw_close(lctx->tdbgoven.hthread);
+
+ if (lctx->tdbgraw.hthread)
+ ntapi->zw_close(lctx->tdbgraw.hthread);
+
+ return status;
+}
+
+static int ptyc_init_console(struct ptyc_term_ctx * tctx)
+{
+ /* console input buffer) */
+ if (!(tctx->hin = ntcon->get_std_handle(NT_STD_INPUT_HANDLE)))
+ return NT_STATUS_UNSUCCESSFUL;
+
+ /* console screen buffer */
+ if (!(tctx->hout = ntcon->create_console_screen_buffer(
+ NT_GENERIC_READ | NT_GENERIC_WRITE,
+ 0,0,NT_CONSOLE_TEXTMODE_BUFFER,0)))
+ return NT_STATUS_UNSUCCESSFUL;
+
+ if (!(ntcon->set_console_active_screen_buffer(tctx->hout)))
+ return NT_STATUS_UNSUCCESSFUL;
+
+ /* console text attributes: default colors */
+ if (!(ntcon->set_console_text_attribute(
+ tctx->hout,
+ NT_BACKGROUND_BLACK | NT_FOREGROUND_WHITE)))
+ return NT_STATUS_UNSUCCESSFUL;
+
+ /* console code page: utf-8 */
+ if (!(ntcon->set_console_code_page(65001)))
+ return NT_STATUS_NOT_SUPPORTED;
+
+ if (!(ntcon->set_console_output_code_page(65001)))
+ return NT_STATUS_NOT_SUPPORTED;
+
+ /* input events */
+ if (!(ntcon->set_console_mode(
+ tctx->hin,
+ NT_ENABLE_MOUSE_INPUT
+ | NT_ENABLE_WINDOW_INPUT)))
+ return NT_STATUS_UNSUCCESSFUL;
+
+ /* ctrl events */
+ if (!(ntcon->set_console_ctrl_handler(
+ ptyc_console_ctrl,
+ true)))
+ return NT_STATUS_UNSUCCESSFUL;
+
+ return NT_STATUS_SUCCESS;
+}
+
+int ptyc_alloc_console(struct ptyc_driver_ctx * dctx)
+{
+ int32_t status;
+ struct ptyc_driver_ctx_impl * ictx;
+ struct ptyc_term_ctx * tctx;
+ struct ptyc_loop_ctx * lctx;
+
+ if (!(ictx = ptyc_get_driver_ictx(dctx)))
+ return NT_STATUS_INVALID_HANDLE;
+
+ tctx = &ictx->tctx;
+ lctx = &ictx->lctx;
+
+ if (!(ntcon->alloc_console()))
+ return NT_STATUS_UNSUCCESSFUL;
+
+ if ((status = ptyc_init_console(tctx)))
+ return ptyc_set_status(dctx,status);
+
+ if ((status = ptyc_create_loop_thread(
+ &lctx->treader,
+ ictx,ptyc_console_reader)))
+ return ptyc_set_status(dctx,status);
+
+ if ((status = ptyc_create_loop_thread(
+ &lctx->twriter,
+ ictx,ptyc_console_writer)))
+ return ptyc_set_status(dctx,status);
+
+ if ((status = ptyc_create_loop_thread(
+ &lctx->tpoller,
+ ictx,ptyc_console_poller)))
+ return ptyc_set_status(dctx,status);
+
+ if (dctx->cctx->drvflags & PTYC_DRIVER_DBG_EVENT)
+ if ((status = ptyc_create_loop_thread(
+ &lctx->tdbgevent,
+ ictx,ptyc_dbg_event)))
+ return ptyc_set_status(dctx,status);
+
+ if (dctx->cctx->drvflags & PTYC_DRIVER_DBG_OVEN)
+ if ((status = ptyc_create_loop_thread(
+ &lctx->tdbgoven,
+ ictx,ptyc_dbg_oven)))
+ return ptyc_set_status(dctx,status);
+
+ if (dctx->cctx->drvflags & PTYC_DRIVER_DBG_RAW)
+ if ((status = ptyc_create_loop_thread(
+ &lctx->tdbgraw,
+ ictx,ptyc_dbg_raw)))
+ return ptyc_set_status(dctx,status);
+
+ return ptyc_set_status(dctx,NT_STATUS_SUCCESS);
+}
+
+
+int ptyc_wait_for_console(struct ptyc_driver_ctx * dctx)
+{
+ struct ptyc_driver_ctx_impl * ictx;
+
+ if (!(ictx = ptyc_get_driver_ictx(dctx)))
+ return NT_STATUS_INVALID_HANDLE;
+
+ return ntapi->zw_wait_for_single_object(
+ ictx->lctx.tpoller.hthread,
+ NT_SYNC_ALERTABLE,0);
+}
+
+
+void ptyc_free_console(struct ptyc_driver_ctx * dctx)
+{
+ struct ptyc_driver_ctx_impl * ictx;
+
+ if (!(ictx = ptyc_get_driver_ictx(dctx)))
+ return;
+
+ ptyc_free_console_impl(ictx,NT_STATUS_SUCCESS);
+}
diff --git a/src/console/ptyc_console_ctrl.c b/src/console/ptyc_console_ctrl.c
new file mode 100644
index 0000000..d20ef12
--- /dev/null
+++ b/src/console/ptyc_console_ctrl.c
@@ -0,0 +1,18 @@
+/*********************************************************/
+/* ptycon: a pty-console bridge */
+/* Copyright (C) 2016 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.PTYCON. */
+/*********************************************************/
+
+#include <psxtypes/psxtypes.h>
+#include <ntcon/ntcon.h>
+#include <ntapi/ntapi.h>
+#include <gdi/gdi.h>
+
+#include <ptycon/ptycon.h>
+#include "ptycon_driver_impl.h"
+
+int ptyc_console_ctrl(uint32_t type)
+{
+ return type;
+}
diff --git a/src/console/ptyc_console_poller.c b/src/console/ptyc_console_poller.c
new file mode 100644
index 0000000..60e3d8b
--- /dev/null
+++ b/src/console/ptyc_console_poller.c
@@ -0,0 +1,19 @@
+/*********************************************************/
+/* ptycon: a pty-console bridge */
+/* Copyright (C) 2016 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.PTYCON. */
+/*********************************************************/
+
+#include <psxtypes/psxtypes.h>
+#include <ntcon/ntcon.h>
+#include <ntapi/ntapi.h>
+#include <gdi/gdi.h>
+
+#include <ptycon/ptycon.h>
+#include "ptycon_driver_impl.h"
+
+int ptyc_console_poller(struct ptyc_driver_ctx_impl * ictx)
+{
+ (void)ictx;
+ return ntapi->tt_wait_for_dummy_event();
+}
diff --git a/src/console/ptyc_console_reader.c b/src/console/ptyc_console_reader.c
new file mode 100644
index 0000000..3afab13
--- /dev/null
+++ b/src/console/ptyc_console_reader.c
@@ -0,0 +1,19 @@
+/*********************************************************/
+/* ptycon: a pty-console bridge */
+/* Copyright (C) 2016 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.PTYCON. */
+/*********************************************************/
+
+#include <psxtypes/psxtypes.h>
+#include <ntcon/ntcon.h>
+#include <ntapi/ntapi.h>
+#include <gdi/gdi.h>
+
+#include <ptycon/ptycon.h>
+#include "ptycon_driver_impl.h"
+
+int ptyc_console_reader(struct ptyc_driver_ctx_impl * ictx)
+{
+ (void)ictx;
+ return ntapi->tt_wait_for_dummy_event();
+}
diff --git a/src/console/ptyc_console_writer.c b/src/console/ptyc_console_writer.c
new file mode 100644
index 0000000..a0ea461
--- /dev/null
+++ b/src/console/ptyc_console_writer.c
@@ -0,0 +1,19 @@
+/*********************************************************/
+/* ptycon: a pty-console bridge */
+/* Copyright (C) 2016 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.PTYCON. */
+/*********************************************************/
+
+#include <psxtypes/psxtypes.h>
+#include <ntcon/ntcon.h>
+#include <ntapi/ntapi.h>
+#include <gdi/gdi.h>
+
+#include <ptycon/ptycon.h>
+#include "ptycon_driver_impl.h"
+
+int ptyc_console_writer(struct ptyc_driver_ctx_impl * ictx)
+{
+ (void)ictx;
+ return ntapi->tt_wait_for_dummy_event();
+}