Files
RedBear-OS/src/header/pty/linux.rs
T
2024-01-11 13:08:06 +00:00

53 lines
1.1 KiB
Rust

use crate::{
header::{fcntl, sys_ioctl, unistd},
io::{Cursor, Write},
platform::types::*,
};
pub(super) unsafe fn openpty(name: &mut [u8]) -> Result<(c_int, c_int), ()> {
const O_NOCTTY: c_int = 0x100;
//TODO: wrap in auto-close struct
let master = fcntl::open(c_str!("/dev/ptmx").as_ptr(), fcntl::O_RDWR | O_NOCTTY, 0);
if master < 0 {
return Err(());
}
let mut lock: c_int = 0;
if sys_ioctl::ioctl(
master,
sys_ioctl::TIOCSPTLCK,
&mut lock as *mut c_int as *mut c_void,
) != 0
{
unistd::close(master);
return Err(());
}
let mut ptn: c_int = 0;
if sys_ioctl::ioctl(
master,
sys_ioctl::TIOCGPTN,
&mut ptn as *mut c_int as *mut c_void,
) != 0
{
unistd::close(master);
return Err(());
}
let mut cursor = Cursor::new(name);
write!(cursor, "/dev/pts/{}", ptn);
let slave = fcntl::open(
cursor.get_ref().as_ptr() as *const c_char,
fcntl::O_RDWR | O_NOCTTY,
0,
);
if slave < 0 {
unistd::close(master);
return Err(());
}
Ok((master, slave))
}