summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--project/extras.mk2
-rw-r--r--src/driver/ptyc_driver_ctx.c50
-rw-r--r--src/internal/ptycon_driver_impl.h4
3 files changed, 55 insertions, 1 deletions
diff --git a/project/extras.mk b/project/extras.mk
index 6f6d5db..6f23834 100644
--- a/project/extras.mk
+++ b/project/extras.mk
@@ -5,7 +5,7 @@ CFLAGS_APP_ATTR += -DPTYC_APP
src/driver/ptyc_driver_ctx.o: version.tag
src/driver/ptyc_driver_ctx.lo: version.tag
-LDFLAGS_COMMON += -nostdlib -lntapi -lpemagine -ldalist
+LDFLAGS_COMMON += -nostdlib -lntapi -lpemagine -ldalist -lntcon
LDFLAGS_COMMON += -Wl,--entry -Wl,$(HOST_UNDERSCORE)$(PACKAGE)_entry_point
LDFLAGS_SHARED += -Wl,--exclude-all-symbols
diff --git a/src/driver/ptyc_driver_ctx.c b/src/driver/ptyc_driver_ctx.c
index cc50e36..78ffb54 100644
--- a/src/driver/ptyc_driver_ctx.c
+++ b/src/driver/ptyc_driver_ctx.c
@@ -4,7 +4,10 @@
/* Released under GPLv2 and GPLv3; see COPYING.PTYCON. */
/*********************************************************/
+#include <ntcon/ntcon.h>
#include <ntapi/ntapi.h>
+#include <ntapi/nt_atomic.h>
+
#include <stdint.h>
#include <ptycon/ptycon.h>
@@ -20,6 +23,10 @@
/* ntapi accessor table */
const ntapi_vtbl * ptyc_ntapi;
+/* ntcon accessor table */
+static ntcon_vtbl ptyc_ntcon_vtbl;
+const ntcon_vtbl * const ptyc_ntcon = &ptyc_ntcon_vtbl;
+
/* package info */
static const struct ptyc_source_version ptyc_src_version = {
PTYC_TAG_VER_MAJOR,
@@ -35,6 +42,43 @@ struct ptyc_driver_ctx_alloc {
const char * units[];
};
+static int32_t ptyc_ntcon_once = 0;
+
+static int32_t ptyc_ntcon_init(void)
+{
+ int32_t status;
+ nt_timeout timeout;
+
+ switch (at_locked_cas_32(&ptyc_ntcon_once,0,1)) {
+ case 0:
+ if ((status = ntcon_vtbl_init(&ptyc_ntcon_vtbl))) {
+ at_locked_add_32(&ptyc_ntcon_once,2);
+ return status;
+ } else {
+ at_locked_inc_32(&ptyc_ntcon_once);
+ return 0;
+ }
+
+ case 1:
+ timeout.quad = -10;
+
+ for (; (at_locked_cas_32(&ptyc_ntcon_once,0,1) == 1); )
+ ntapi->zw_delay_execution(
+ NT_SYNC_ALERTABLE,
+ &timeout);
+
+ return (ptyc_ntcon_once == 2)
+ ? 0 : -1;
+
+ case 2:
+ return 0;
+
+ case 3:
+ default:
+ return -1;
+ }
+}
+
static uint32_t ptyc_argv_flags(uint32_t flags)
{
uint32_t ret = 0;
@@ -122,6 +166,9 @@ int ptyc_get_driver_ctx(
if (ptyc_init())
return -1;
+ if (ptyc_ntcon_init())
+ return -1;
+
options = ptyc_default_options;
if (!(meta = argv_get(argv,options,ptyc_argv_flags(flags))))
@@ -172,6 +219,9 @@ int ptyc_create_driver_ctx(
if (ptyc_init())
return -1;
+ if (ptyc_ntcon_init())
+ return -1;
+
if (!(meta = argv_get(argv,ptyc_default_options,0)))
return -1;
diff --git a/src/internal/ptycon_driver_impl.h b/src/internal/ptycon_driver_impl.h
index dbc3278..3576cd4 100644
--- a/src/internal/ptycon_driver_impl.h
+++ b/src/internal/ptycon_driver_impl.h
@@ -2,6 +2,8 @@
#define PTYCON_DRIVER_IMPL_H
#include <ntapi/ntapi.h>
+#include <ntcon/ntcon.h>
+
#include <stdint.h>
#include <stdio.h>
@@ -10,8 +12,10 @@
extern const struct argv_option ptyc_default_options[];
extern const ntapi_vtbl * ptyc_ntapi;
+extern const ntcon_vtbl * const ptyc_ntcon;
#define ntapi ptyc_ntapi
+#define ntcon ptyc_ntcon
enum app_tags {
TAG_HELP,