diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/internal/ptycon_ioctl_impl.h | 79 | ||||
-rw-r--r-- | src/pty/ptyc_pty_ctx.c | 5 |
2 files changed, 84 insertions, 0 deletions
diff --git a/src/internal/ptycon_ioctl_impl.h b/src/internal/ptycon_ioctl_impl.h index a3d902d..d87ff3a 100644 --- a/src/internal/ptycon_ioctl_impl.h +++ b/src/internal/ptycon_ioctl_impl.h @@ -67,4 +67,83 @@ static int32_t ptyc_set_client_info( return NT_STATUS_SUCCESS; } +static int32_t ptyc_pty_own( + nt_pty * hpty, + nt_runtime_data * rtdata) +{ + int32_t status; + nt_tty_session_info sessioninfo; + nt_tty_sigctl_info ctlinfo; + nt_pty_client_info ptyinfo; + nt_iosb iosb; + + /* inherited session info */ + if ((status = ntapi->tty_client_session_query( + rtdata->hsession, + &sessioninfo))) + return status; + + /* simulated fork */ + sessioninfo.pid = rtdata->cid_self.process_id; + sessioninfo.pgid = sessioninfo.pgid ? sessioninfo.pgid : -1; + sessioninfo.sid = 0; + sessioninfo.syspid = 0; + + if ((status = ntapi->tty_client_session_set( + rtdata->hsession, + &sessioninfo))) + return status; + + /* setsid() */ + sessioninfo.pid = rtdata->cid_self.process_id; + sessioninfo.pgid = rtdata->cid_self.process_id; + sessioninfo.sid = rtdata->cid_self.process_id; + sessioninfo.syspid = 0; + + if ((status = ntapi->tty_client_session_set( + rtdata->hsession, + &sessioninfo))) + return status; + + /* ctty */ + ntapi->tt_aligned_block_memset( + &ctlinfo,0,sizeof(ctlinfo)); + + if ((status = ntapi->pty_ioctl( + hpty, + 0,0,0, + &iosb, + TTY_TIOCSCTTY, + &ctlinfo,sizeof(ctlinfo), + &ctlinfo,sizeof(ctlinfo)))) + return status; + + /* tcsetpgrp */ + ntapi->tt_aligned_block_memset( + &ctlinfo,0,sizeof(ctlinfo)); + + ctlinfo.ctxarg[0] = rtdata->cid_self.process_id; + + if ((status = ntapi->pty_ioctl( + hpty, + 0,0,0, + &iosb, + TTY_TIOCSPGRP, + &ctlinfo,sizeof(ctlinfo), + &ctlinfo,sizeof(ctlinfo)))) + return status; + + /* [ptycon daemon loop]: ctty signals */ + ntapi->tt_aligned_block_memset( + &ptyinfo,0,sizeof(ptyinfo)); + + if ((status = ntapi->pty_set( + hpty,&iosb, + &ptyinfo,sizeof(ptyinfo), + NT_PTY_CLIENT_INFORMATION))) + return status; + + return NT_STATUS_SUCCESS; +} + #endif diff --git a/src/pty/ptyc_pty_ctx.c b/src/pty/ptyc_pty_ctx.c index 99d8c69..e5245c8 100644 --- a/src/pty/ptyc_pty_ctx.c +++ b/src/pty/ptyc_pty_ctx.c @@ -214,6 +214,11 @@ int ptyc_alloc_pty(struct ptyc_driver_ctx * dctx) return ptyc_set_status( dctx,status); + if (cctx->drvflags & (PTYC_DRIVER_DBG_RAW|PTYC_DRIVER_DBG_OVEN)) + if ((status = ptyc_pty_own(cctx->hpts,ictx->rtdata))) + return ptyc_set_status( + dctx,status); + return ptyc_set_status( dctx,NT_STATUS_SUCCESS); } |