diff options
Diffstat (limited to 'src/internal')
-rw-r--r-- | src/internal/ptycon_ioctl_impl.h | 79 |
1 files changed, 79 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 |