summaryrefslogtreecommitdiffhomepage
path: root/src/internal/ptycon_ioctl_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal/ptycon_ioctl_impl.h')
-rw-r--r--src/internal/ptycon_ioctl_impl.h79
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