34 lines
809 B
Rust
34 lines
809 B
Rust
use crate::{
|
|
error::ResultExt,
|
|
header::{fcntl, unistd},
|
|
platform::{
|
|
Pal, Sys,
|
|
types::{c_char, c_int, ssize_t},
|
|
},
|
|
};
|
|
|
|
pub(super) unsafe fn openpty(name: &mut [u8]) -> Result<(c_int, c_int), ()> {
|
|
let master = unsafe { fcntl::open(c"/scheme/pty".as_ptr(), fcntl::O_RDWR, 0) };
|
|
if master < 0 {
|
|
return Err(());
|
|
}
|
|
|
|
// TODO: better error handling
|
|
let count = Sys::fpath(master, name)
|
|
.map(|u| u as ssize_t)
|
|
.or_minus_one_errno();
|
|
if count < 0 {
|
|
unistd::close(master);
|
|
return Err(());
|
|
}
|
|
name[count as usize] = 0;
|
|
|
|
let slave = unsafe { fcntl::open(name.as_ptr() as *const c_char, fcntl::O_RDWR, 0) };
|
|
if slave < 0 {
|
|
unistd::close(master);
|
|
return Err(());
|
|
}
|
|
|
|
Ok((master, slave))
|
|
}
|