84 lines
1.7 KiB
Rust
84 lines
1.7 KiB
Rust
use fortanix_sgx_abi::Fd;
|
|
|
|
use super::abi::usercalls;
|
|
use crate::io::{self, IoSlice, IoSliceMut};
|
|
use crate::mem;
|
|
use crate::sys::{AsInner, FromInner, IntoInner};
|
|
|
|
#[derive(Debug)]
|
|
pub struct FileDesc {
|
|
fd: Fd,
|
|
}
|
|
|
|
impl FileDesc {
|
|
pub fn new(fd: Fd) -> FileDesc {
|
|
FileDesc { fd: fd }
|
|
}
|
|
|
|
pub fn raw(&self) -> Fd {
|
|
self.fd
|
|
}
|
|
|
|
/// Extracts the actual file descriptor without closing it.
|
|
pub fn into_raw(self) -> Fd {
|
|
let fd = self.fd;
|
|
mem::forget(self);
|
|
fd
|
|
}
|
|
|
|
pub fn read(&self, buf: &mut [u8]) -> io::Result<usize> {
|
|
usercalls::read(self.fd, &mut [IoSliceMut::new(buf)])
|
|
}
|
|
|
|
pub fn read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
|
|
usercalls::read(self.fd, bufs)
|
|
}
|
|
|
|
#[inline]
|
|
pub fn is_read_vectored(&self) -> bool {
|
|
true
|
|
}
|
|
|
|
pub fn write(&self, buf: &[u8]) -> io::Result<usize> {
|
|
usercalls::write(self.fd, &[IoSlice::new(buf)])
|
|
}
|
|
|
|
pub fn write_vectored(&self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
|
|
usercalls::write(self.fd, bufs)
|
|
}
|
|
|
|
#[inline]
|
|
pub fn is_write_vectored(&self) -> bool {
|
|
true
|
|
}
|
|
|
|
pub fn flush(&self) -> io::Result<()> {
|
|
usercalls::flush(self.fd)
|
|
}
|
|
}
|
|
|
|
impl AsInner<Fd> for FileDesc {
|
|
fn as_inner(&self) -> &Fd {
|
|
&self.fd
|
|
}
|
|
}
|
|
|
|
impl IntoInner<Fd> for FileDesc {
|
|
fn into_inner(self) -> Fd {
|
|
let fd = self.fd;
|
|
mem::forget(self);
|
|
fd
|
|
}
|
|
}
|
|
|
|
impl FromInner<Fd> for FileDesc {
|
|
fn from_inner(fd: Fd) -> FileDesc {
|
|
FileDesc { fd }
|
|
}
|
|
}
|
|
|
|
impl Drop for FileDesc {
|
|
fn drop(&mut self) {
|
|
usercalls::close(self.fd)
|
|
}
|
|
}
|