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::(&mut lock).cast::(), ) } != 0 { unistd::close(master); return Err(()); } let mut ptn: c_int = 0; if unsafe { sys_ioctl::ioctl( master, sys_ioctl::TIOCGPTN, ptr::from_mut::(&mut ptn).cast::(), ) } != 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::(), fcntl::O_RDWR | fcntl::O_NOCTTY, 0, ) }; if slave < 0 { unistd::close(master); return Err(()); } Ok((master, slave)) }