use core::fmt;
use crate::{
eprintln,
syscalls::{
close,
write,
},
};
pub type RawFd = i32;
pub trait AsRawFd {
fn as_raw_fd(&self) -> RawFd;
}
impl AsRawFd for RawFd {
fn as_raw_fd(&self) -> RawFd {
*self
}
}
pub struct OwnedFd(RawFd);
impl OwnedFd {
pub fn new(fd: RawFd) -> Self {
Self(fd)
}
}
impl AsRawFd for OwnedFd {
fn as_raw_fd(&self) -> RawFd {
self.0
}
}
impl fmt::Write for OwnedFd {
fn write_str(&mut self, s: &str) -> fmt::Result {
if write(self, s.as_bytes()).is_err() {
return Err(fmt::Error);
}
Ok(())
}
}
impl Drop for OwnedFd {
fn drop(&mut self) {
if let Err(e) = close(self) {
eprintln!("close({fd}): {e}", fd = self.as_raw_fd());
}
}
}