diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/driver/ptyc_amain.c | 3 | ||||
-rw-r--r-- | src/driver/ptyc_driver_ctx.c | 1 | ||||
-rw-r--r-- | src/internal/ptycon_ioctl_impl.h | 22 | ||||
-rw-r--r-- | src/pty/ptyc_pty_ctx.c | 92 |
4 files changed, 118 insertions, 0 deletions
diff --git a/src/driver/ptyc_amain.c b/src/driver/ptyc_amain.c index 4762d3a..3a5ca68 100644 --- a/src/driver/ptyc_amain.c +++ b/src/driver/ptyc_amain.c @@ -70,5 +70,8 @@ int ptyc_main(int argc, char ** argv, char ** envp) if ((ptyc_version(dctx)) < 0) return ptyc_exit(dctx,2); + if (ptyc_alloc_pty(dctx)) + return ptyc_exit(dctx,2); + return ptyc_exit(dctx,ret); } diff --git a/src/driver/ptyc_driver_ctx.c b/src/driver/ptyc_driver_ctx.c index 78ffb54..d403a98 100644 --- a/src/driver/ptyc_driver_ctx.c +++ b/src/driver/ptyc_driver_ctx.c @@ -236,6 +236,7 @@ int ptyc_create_driver_ctx( static void ptyc_free_driver_ctx_impl(struct ptyc_driver_ctx_alloc * ictx) { + ptyc_free_pty(&ictx->ctx.ctx); argv_free(ictx->meta); free(ictx); } diff --git a/src/internal/ptycon_ioctl_impl.h b/src/internal/ptycon_ioctl_impl.h new file mode 100644 index 0000000..dacd689 --- /dev/null +++ b/src/internal/ptycon_ioctl_impl.h @@ -0,0 +1,22 @@ +#ifndef PTYCON_IOCTL_IMPL_H +#define PTYCON_IOCTL_IMPL_H + +#include <ntapi/ntapi.h> + +static int32_t ptyc_grant(nt_pty * hptm) +{ + nt_tty_sigctl_info ctlinfo; + nt_iosb iosb; + + ntapi->tt_aligned_block_memset( + &ctlinfo,0,sizeof(ctlinfo)); + + return ntapi->pty_ioctl( + hptm, + 0,0,0, + &iosb,TTY_TIOCSPTLCK, + &ctlinfo,sizeof(ctlinfo), + &ctlinfo,sizeof(ctlinfo)); +} + +#endif diff --git a/src/pty/ptyc_pty_ctx.c b/src/pty/ptyc_pty_ctx.c new file mode 100644 index 0000000..31a9c26 --- /dev/null +++ b/src/pty/ptyc_pty_ctx.c @@ -0,0 +1,92 @@ +/*********************************************************/ +/* 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_driver_impl.h" +#include "ptycon_ioctl_impl.h" +#include "ptycon_status_impl.h" + +static int32_t ptyc_pty_open(nt_pty * hptm, nt_guid * pty_guid, nt_pty ** hpty) +{ + nt_vfd_dev_name pty_name; + nt_oa oa = {sizeof(oa),0,0,0,0,0}; + + ntapi->vfd_dev_name_init( + &pty_name,pty_guid); + + oa.obj_name = &pty_name.name; + oa.root_dir = hptm; + + return ntapi->pty_open( + 0,hpty, + NT_FILE_ALL_ACCESS, + &oa,0,0,0); +} + +static int32_t ptyc_ptm_open(const struct ptyc_common_ctx * cctx) +{ + nt_guid pty_guid = TTY_PTM_GUID; + return ptyc_pty_open( + 0,&pty_guid, + (nt_pty **)&cctx->hptm); +} + +static int32_t ptyc_pts_open(const struct ptyc_common_ctx * cctx) +{ + int32_t status; + nt_guid pty_guid = TTY_PTS_GUID; + + if ((status = ptyc_grant(cctx->hptm))) + return status; + + return ptyc_pty_open( + cctx->hptm,&pty_guid, + (nt_pty **)&cctx->hpts); +} + +int ptyc_alloc_pty(struct ptyc_driver_ctx * dctx) +{ + int32_t status; + + if (dctx->cctx->hpts || dctx->cctx->hptm) + return ptyc_set_status( + dctx,NT_STATUS_DEVICE_ALREADY_ATTACHED); + + if ((status = ptyc_ptm_open(dctx->cctx))) + return ptyc_set_status( + dctx,status); + + if (!(dctx->cctx->drvflags & PTYC_DRIVER_DBG_OVEN) + && !(dctx->cctx->drvflags & PTYC_DRIVER_DBG_RAW)) + return ptyc_set_status( + dctx,NT_STATUS_SUCCESS); + + if ((status = ptyc_pts_open(dctx->cctx))) + return ptyc_set_status( + dctx,status); + + return ptyc_set_status( + dctx,NT_STATUS_SUCCESS); +} + +void ptyc_free_pty(struct ptyc_driver_ctx * dctx) +{ + struct ptyc_common_ctx * cctx; + + cctx = (struct ptyc_common_ctx *)dctx->cctx; + + if (cctx->hpts) { + ntapi->pty_close(cctx->hpts); + cctx->hpts = 0; + } + + if (cctx->hptm) { + ntapi->pty_close(cctx->hptm); + cctx->hptm = 0; + } +} |