1 //! linux_raw syscalls supporting `rustix::pty`.
2 //!
3 //! # Safety
4 //!
5 //! See the `rustix::backend` module documentation for details.
6 #![allow(unsafe_code, clippy::undocumented_unsafe_blocks)]
7 
8 use crate::backend::conv::{by_ref, c_uint, ret};
9 use crate::fd::BorrowedFd;
10 use crate::io;
11 use linux_raw_sys::ioctl::TIOCSPTLCK;
12 #[cfg(feature = "alloc")]
13 use {
14     crate::backend::c, crate::ffi::CString, crate::path::DecInt, alloc::vec::Vec,
15     core::mem::MaybeUninit, linux_raw_sys::ioctl::TIOCGPTN,
16 };
17 
18 #[cfg(feature = "alloc")]
19 #[inline]
ptsname(fd: BorrowedFd<'_>, mut buffer: Vec<u8>) -> io::Result<CString>20 pub(crate) fn ptsname(fd: BorrowedFd<'_>, mut buffer: Vec<u8>) -> io::Result<CString> {
21     unsafe {
22         let mut n = MaybeUninit::<c::c_int>::uninit();
23         ret(syscall!(__NR_ioctl, fd, c_uint(TIOCGPTN), &mut n))?;
24 
25         buffer.clear();
26         buffer.extend_from_slice(b"/dev/pts/");
27         buffer.extend_from_slice(DecInt::new(n.assume_init()).as_bytes());
28         buffer.push(b'\0');
29         Ok(CString::from_vec_with_nul_unchecked(buffer))
30     }
31 }
32 
33 #[inline]
unlockpt(fd: BorrowedFd<'_>) -> io::Result<()>34 pub(crate) fn unlockpt(fd: BorrowedFd<'_>) -> io::Result<()> {
35     unsafe {
36         ret(syscall_readonly!(
37             __NR_ioctl,
38             fd,
39             c_uint(TIOCSPTLCK),
40             by_ref(&0)
41         ))
42     }
43 }
44