62 lines
1.7 KiB
Rust

#![allow(missing_docs)]
pub mod device {
pub use abi::io::{DeviceRequest, Framebuffer, MountOptions, UnmountOptions};
}
pub mod terminal {
pub use abi::io::{
TerminalInputOptions, TerminalLineOptions, TerminalOptions, TerminalOutputOptions,
TerminalSize,
};
}
pub mod message_channel {
pub use abi::io::{
ChannelPublisherId, MessageDestination, ReceivedMessageMetadata, SentMessage,
};
}
pub mod poll {
pub use abi::io::PollControl;
}
use core::str::FromStr;
pub use abi::io::{
AccessMode, DirectoryEntry, FileAttr, FileMetadataUpdate, FileMetadataUpdateMode, FileMode,
FileType, OpenOptions, PipeOptions, RawFd, SeekFrom, TimerOptions,
};
use abi::{error::Error, io::DeviceRequest, process::ProcessOption, util::FixedString};
use alloc::string::String;
pub fn current_directory<T, F: FnOnce(&str) -> T>(mapper: F) -> Result<T, Error> {
let mut option = ProcessOption::Directory(FixedString::empty());
unsafe { crate::sys::get_process_option(&mut option) }?;
let ProcessOption::Directory(path) = &option else {
unreachable!()
};
Ok(mapper(path.as_ref()))
}
pub fn current_directory_string() -> Result<String, Error> {
current_directory(|s| s.into())
}
pub fn set_current_directory(path: &str) -> Result<(), Error> {
let mut option = ProcessOption::Directory(FixedString::from_str(path)?);
unsafe { crate::sys::set_process_option(&mut option) }?;
Ok(())
}
pub fn is_terminal(f: RawFd) -> bool {
let mut option = DeviceRequest::IsTerminal(false);
let res = unsafe { crate::sys::device_request(f, &mut option) };
match (res, option) {
(Ok(()), DeviceRequest::IsTerminal(true)) => true,
_ => false,
}
}