mikros: Implement OpenOptions and add File(Creation/Write/Open)Mode structs in os for RPC use
This commit is contained in:
parent
e44f9abc78
commit
fd1fa35d35
@ -14,6 +14,57 @@
|
|||||||
#[stable(feature = "mikros", since = "1.80.0")]
|
#[stable(feature = "mikros", since = "1.80.0")]
|
||||||
pub use errno::Errno;
|
pub use errno::Errno;
|
||||||
|
|
||||||
|
|
||||||
|
#[stable(feature = "mikros", since = "1.80.0")]
|
||||||
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||||
|
pub enum FileCreationMode {
|
||||||
|
NoCreate,
|
||||||
|
Create,
|
||||||
|
ForceCreate,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[stable(feature = "mikros", since = "1.80.0")]
|
||||||
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||||
|
pub enum FileWriteMode {
|
||||||
|
Start,
|
||||||
|
Truncate,
|
||||||
|
Append
|
||||||
|
}
|
||||||
|
|
||||||
|
#[stable(feature = "mikros", since = "1.80.0")]
|
||||||
|
#[derive(Copy, Clone, Debug)]
|
||||||
|
pub enum FileOpenMode {
|
||||||
|
Read,
|
||||||
|
Write(FileWriteMode, FileCreationMode),
|
||||||
|
ReadWrite(FileWriteMode, FileCreationMode),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FileOpenMode {
|
||||||
|
#[stable(feature = "mikros", since = "1.80.0")]
|
||||||
|
pub fn readable(self) -> bool {
|
||||||
|
match self {
|
||||||
|
Self::Read | Self::ReadWrite(_, _) => true,
|
||||||
|
Self::Write(_, _) => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[stable(feature = "mikros", since = "1.80.0")]
|
||||||
|
pub fn writable(self) -> bool {
|
||||||
|
match self {
|
||||||
|
Self::Write(_, _) | Self::ReadWrite(_, _) => true,
|
||||||
|
Self::Read => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[stable(feature = "mikros", since = "1.80.0")]
|
||||||
|
pub fn get_writing_details(self) -> Option<(FileWriteMode, FileCreationMode)> {
|
||||||
|
match self {
|
||||||
|
Self::Write(wr_mode, cr_mode) | Self::ReadWrite(wr_mode, cr_mode) => Some((wr_mode, cr_mode)),
|
||||||
|
Self::Read => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A prelude for conveniently writing platform-specific code.
|
/// A prelude for conveniently writing platform-specific code.
|
||||||
///
|
///
|
||||||
/// Includes all extension traits, and some important type definitions.
|
/// Includes all extension traits, and some important type definitions.
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
use crate::hash::{Hash, Hasher};
|
use crate::hash::{Hash, Hasher};
|
||||||
use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut, SeekFrom};
|
use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut, SeekFrom};
|
||||||
use crate::os::mikros::ipc::rpc;
|
use crate::os::mikros::ipc::rpc;
|
||||||
use crate::os::mikros::{Errno, syscalls};
|
use crate::os::mikros::{Errno, syscalls, FileOpenMode, FileCreationMode, FileWriteMode};
|
||||||
use crate::path::{Component, Path, PathBuf};
|
use crate::path::{Component, Path, PathBuf};
|
||||||
use crate::sys::time::SystemTime;
|
use crate::sys::time::SystemTime;
|
||||||
use crate::sys::unsupported;
|
use crate::sys::unsupported;
|
||||||
@ -149,7 +149,14 @@ pub struct DirEntry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct OpenOptions {}
|
pub struct OpenOptions {
|
||||||
|
read: bool,
|
||||||
|
write: bool,
|
||||||
|
append: bool,
|
||||||
|
truncate: bool,
|
||||||
|
create: bool,
|
||||||
|
create_new: bool,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Default)]
|
#[derive(Copy, Clone, Debug, Default)]
|
||||||
pub struct FileTimes {}
|
pub struct FileTimes {}
|
||||||
@ -313,19 +320,75 @@ pub fn file_type(&self) -> io::Result<FileType> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl OpenOptions {
|
impl OpenOptions {
|
||||||
pub fn new() -> OpenOptions {
|
pub fn new() -> OpenOptions {
|
||||||
OpenOptions {}
|
OpenOptions {
|
||||||
|
// generic
|
||||||
|
read: false,
|
||||||
|
write: false,
|
||||||
|
append: false,
|
||||||
|
truncate: false,
|
||||||
|
create: false,
|
||||||
|
create_new: false,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read(&mut self, _read: bool) {}
|
pub fn read(&mut self, read: bool) {
|
||||||
pub fn write(&mut self, _write: bool) {}
|
self.read = read;
|
||||||
pub fn append(&mut self, _append: bool) {}
|
}
|
||||||
pub fn truncate(&mut self, _truncate: bool) {}
|
pub fn write(&mut self, write: bool) {
|
||||||
pub fn create(&mut self, _create: bool) {}
|
self.write = write;
|
||||||
pub fn create_new(&mut self, _create_new: bool) {}
|
}
|
||||||
|
pub fn append(&mut self, append: bool) {
|
||||||
|
self.append = append;
|
||||||
|
}
|
||||||
|
pub fn truncate(&mut self, truncate: bool) {
|
||||||
|
self.truncate = truncate;
|
||||||
|
}
|
||||||
|
pub fn create(&mut self, create: bool) {
|
||||||
|
self.create = create;
|
||||||
|
}
|
||||||
|
pub fn create_new(&mut self, create_new: bool) {
|
||||||
|
self.create_new = create_new;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn get_open_mode(&self) -> io::Result<FileOpenMode> {
|
||||||
|
if !self.write && (self.append || self.truncate || self.create || self.create_new) {
|
||||||
|
return Err(Errno::EINVAL.into());
|
||||||
|
}
|
||||||
|
if self.append && self.truncate {
|
||||||
|
return Err(Errno::EINVAL.into());
|
||||||
|
}
|
||||||
|
if self.append && self.truncate {
|
||||||
|
return Err(Errno::EINVAL.into());
|
||||||
|
}
|
||||||
|
if !self.read && !self.write {
|
||||||
|
return Err(Errno::EINVAL.into());
|
||||||
|
}
|
||||||
|
if self.read && !self.write {
|
||||||
|
return Ok(FileOpenMode::Read);
|
||||||
|
}
|
||||||
|
let cr_mode = match (self.create, self.create_new) {
|
||||||
|
(false, false) => FileCreationMode::NoCreate,
|
||||||
|
(true, false) => FileCreationMode::Create,
|
||||||
|
(_, true) => FileCreationMode::ForceCreate,
|
||||||
|
};
|
||||||
|
let wr_mode = match (self.append, self.truncate) {
|
||||||
|
(false, false) => FileWriteMode::Start,
|
||||||
|
(false, true) => FileWriteMode::Truncate,
|
||||||
|
(true, false) => FileWriteMode::Append,
|
||||||
|
(true, true) => unreachable!()
|
||||||
|
};
|
||||||
|
match self.read {
|
||||||
|
false => Ok(FileOpenMode::Write(wr_mode, cr_mode)),
|
||||||
|
true => Ok(FileOpenMode::ReadWrite(wr_mode, cr_mode)),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl File {
|
impl File {
|
||||||
pub fn open(path: &Path, _opts: &OpenOptions) -> io::Result<File> {
|
pub fn open(path: &Path, _opts: &OpenOptions) -> io::Result<File> {
|
||||||
let path = path.canonicalize()?;
|
let path = path.canonicalize()?;
|
||||||
|
Loading…
Reference in New Issue
Block a user