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