62 lines
1.7 KiB
Rust
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,
|
|
}
|
|
}
|