diff options
Diffstat (limited to 'src/daemon')
-rw-r--r-- | src/daemon/ptyc_daemon_init.c | 121 | ||||
-rw-r--r-- | src/daemon/ptyc_daemon_loop.c | 18 |
2 files changed, 139 insertions, 0 deletions
diff --git a/src/daemon/ptyc_daemon_init.c b/src/daemon/ptyc_daemon_init.c new file mode 100644 index 0000000..c7fa5eb --- /dev/null +++ b/src/daemon/ptyc_daemon_init.c @@ -0,0 +1,121 @@ +/*********************************************************/ +/* ptycon: a pty-console bridge */ +/* Copyright (C) 2016 Z. Gilboa */ +/* Released under GPLv2 and GPLv3; see COPYING.PTYCON. */ +/*********************************************************/ + +#include <psxtypes/psxtypes.h> +#include <ntapi/ntapi.h> +#include <ntapi/nt_atomic.h> + +#include <ptycon/ptycon.h> +#include "ptycon_daemon_impl.h" +#include "ptycon_driver_impl.h" + +static const nt_guid ptyc_daemon_guid = PTYC_PORT_GUID_DAEMON; + +static int32_t ptyc_daemon_init_impl(struct ptyc_daemon_ctx * dctx) +{ + int32_t status; + nt_daemon_params dparams; + wchar16_t * port_name; + nt_port_name_keys * port_name_keys; + + /* daemon attributes */ + dctx->daemon_attr.type = NT_PORT_TYPE_DAEMON; + dctx->daemon_attr.subtype = NT_PORT_SUBTYPE_DEFAULT; + + /* port guid */ + ntapi->tt_guid_copy( + &dctx->daemon_attr.guid, + &ptyc_daemon_guid); + + /* port keys */ + if ((status = ntapi->tt_port_generate_keys(&dctx->daemon_attr.keys))) + return status; + + /* port name */ + ntapi->tt_port_name_from_attributes( + &dctx->daemon_name, + &dctx->daemon_attr); + + /* dparams */ + ntapi->tt_aligned_block_memset( + &dparams,0,sizeof(dparams)); + + port_name = (wchar16_t *)&dctx->daemon_name; + port_name_keys = (nt_port_name_keys *)&dctx->daemon_name.port_name_keys; + + dparams.port_keys = &dctx->daemon_keys; + dparams.port_name = port_name; + dparams.port_name_keys = port_name_keys; + + dparams.port_msg_size = sizeof(nt_tty_port_msg); + dparams.flags = NT_DSR_INIT_DEFAULT; + + dparams.daemon_once_routine = 0; + dparams.daemon_loop_routine = ptyc_daemon_loop; + dparams.daemon_loop_context = dctx; + + dparams.pport_daemon = &dctx->hport_daemon; + dparams.pport_internal_client = &dctx->hport_internal_client; + + dparams.pevent_daemon_ready = &dctx->hevent_daemon_ready; + dparams.pevent_internal_client_ready = &dctx->hevent_internal_client_ready; + + dparams.stack_size_commit = 8192; + dparams.stack_size_reserve = 8192; + + return ntapi->dsr_init(&dparams); +} + +static int32_t ptyc_daemon_once = 0; + +int32_t __stdcall ptyc_daemon_init(struct ptyc_daemon_ctx * dctx, uint64_t drvflags) +{ + int32_t status; + nt_timeout timeout; + nt_runtime_data * rtdata; + + /* rtdata */ + if ((status = ntapi->tt_get_runtime_data(&rtdata,0))) + return status; + + /* needed? */ + if (drvflags & PTYC_DRIVER_DAEMON_NEVER) + return 0; + + if (!(drvflags & PTYC_DRIVER_DAEMON_ALWAYS)) + if (ntapi->tt_guid_compare(&rtdata->srv_guid,&ptyc_daemon_guid)) + return 0; + + /* once */ + switch (at_locked_cas_32(&ptyc_daemon_once,0,1)) { + case 0: + if ((status = ptyc_daemon_init_impl(dctx))) { + at_locked_add_32(&ptyc_daemon_once,2); + return status; + } + + at_locked_inc_32(&ptyc_daemon_once); + return 0; + + case 1: + timeout.quad = -10; + + for (; (at_locked_cas_32(&ptyc_daemon_once,0,1) == 1); ) + ntapi->zw_delay_execution( + NT_SYNC_ALERTABLE, + &timeout); + + return (ptyc_daemon_once == 2) + ? 0 : -1; + + case 2: + return 0; + + case 3: + default: + return -1; + } +} diff --git a/src/daemon/ptyc_daemon_loop.c b/src/daemon/ptyc_daemon_loop.c new file mode 100644 index 0000000..954ed8c --- /dev/null +++ b/src/daemon/ptyc_daemon_loop.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 <ntapi/ntapi.h> + +#include <ptycon/ptycon.h> +#include "ptycon_daemon_impl.h" +#include "ptycon_driver_impl.h" + +int32_t __stdcall ptyc_daemon_loop(void * ctx) +{ + (void)ctx; + return ntapi->tt_wait_for_dummy_event(); +} |