From aff35892be178b01cfb468d056c2167c53439933 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jackpot51@gmail.com> Date: Mon, 24 Sep 2018 21:40:40 -0600 Subject: [PATCH] Add fs module --- src/fs.rs | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/io.rs | 1 + src/lib.rs | 2 ++ 3 files changed, 91 insertions(+) create mode 100644 src/fs.rs create mode 100644 src/io.rs diff --git a/src/fs.rs b/src/fs.rs new file mode 100644 index 00000000..097c40ca --- /dev/null +++ b/src/fs.rs @@ -0,0 +1,88 @@ +use c_str::CStr; +use header::fcntl::O_CREAT; +use header::unistd::{SEEK_SET, SEEK_CUR, SEEK_END}; +use io; +use platform; +use platform::{Pal, Sys}; +use platform::types::*; + +fn last_os_error() -> io::Error { + let errno = unsafe { platform::errno }; + io::Error::from_raw_os_error(errno) +} + +pub struct File(c_int); + +impl File { + pub fn open(path: &CStr, oflag: c_int) -> io::Result<Self> { + match Sys::open(path, oflag, 0) { + -1 => Err(last_os_error()), + ok => Ok(File(ok)), + } + } + + pub fn create(path: &CStr, oflag: c_int, mode: mode_t) -> io::Result<Self> { + match Sys::open(path, oflag | O_CREAT, mode) { + -1 => Err(last_os_error()), + ok => Ok(File(ok)), + } + } + + pub fn sync_all(&self) -> io::Result<()> { + match Sys::fsync(self.0) { + -1 => Err(last_os_error()), + _ok => Ok(()), + } + } + + pub fn set_len(&self, size: u64) -> io::Result<()> { + match Sys::ftruncate(self.0, size as off_t) { + -1 => Err(last_os_error()), + _ok => Ok(()), + } + } + + pub fn try_clone(&self) -> io::Result<Self> { + match Sys::dup(self.0) { + -1 => Err(last_os_error()), + ok => Ok(File(ok)), + } + } +} + +impl io::Read for File { + fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { + match Sys::read(self.0, buf) { + -1 => Err(last_os_error()), + ok => Ok(ok as usize), + } + } +} + +impl io::Write for File { + fn write(&mut self, buf: &[u8]) -> io::Result<usize> { + match Sys::write(self.0, buf) { + -1 => Err(last_os_error()), + ok => Ok(ok as usize), + } + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} + +impl io::Seek for File { + fn seek(&mut self, pos: io::SeekFrom) -> io::Result<u64> { + let (offset, whence) = match pos { + io::SeekFrom::Start(start) => (start as off_t, SEEK_SET), + io::SeekFrom::Current(current) => (current as off_t, SEEK_CUR), + io::SeekFrom::End(end) => (end as off_t, SEEK_END), + }; + + match Sys::lseek(self.0, offset, whence) { + -1 => Err(last_os_error()), + ok => Ok(ok as u64), + } + } +} diff --git a/src/io.rs b/src/io.rs new file mode 100644 index 00000000..42640cf1 --- /dev/null +++ b/src/io.rs @@ -0,0 +1 @@ +pub use core_io::*; diff --git a/src/lib.rs b/src/lib.rs index c2d8e919..75b32e3c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,7 +37,9 @@ extern crate spin; #[macro_use] mod macros; pub mod c_str; +pub mod fs; pub mod header; +pub mod io; pub mod platform; pub mod start; -- GitLab