diff --git a/src/libos/src/fs/mod.rs b/src/libos/src/fs/mod.rs index 6151891f..00208c18 100644 --- a/src/libos/src/fs/mod.rs +++ b/src/libos/src/fs/mod.rs @@ -14,6 +14,7 @@ use self::inode_file::OpenOptions; pub use self::pipe::Pipe; pub use self::io_multiplexing::*; pub use self::access::{AccessModes, AccessFlags, AT_FDCWD, do_access, do_faccessat}; +use self::null::NullFile; use std::mem::uninitialized; mod file; @@ -24,6 +25,7 @@ mod pipe; mod sgx_impl; mod io_multiplexing; mod access; +mod null; pub fn do_open(path: &str, flags: u32, mode: u32) -> Result { @@ -37,7 +39,7 @@ pub fn do_open(path: &str, flags: u32, mode: u32) -> Result { let mut proc = current_ref.lock().unwrap(); let file = proc.open_file(path, flags, mode)?; - let file_ref: Arc> = Arc::new(Box::new(file)); + let file_ref: Arc> = Arc::new(file); let fd = { let close_on_spawn = flags.contains(OpenFlags::CLOEXEC); @@ -399,7 +401,10 @@ extern "C" { impl Process { /// Open a file on the process. But DO NOT add it to file table. - pub fn open_file(&self, path: &str, flags: OpenFlags, mode: u32) -> Result { + pub fn open_file(&self, path: &str, flags: OpenFlags, mode: u32) -> Result, Error> { + if path == "/dev/null" { + return Ok(Box::new(NullFile)); + } let inode = if flags.contains(OpenFlags::CREATE) { let (dir_path, file_name) = split_path(&path); let dir_inode = self.lookup_inode(dir_path)?; @@ -416,7 +421,7 @@ impl Process { } else { self.lookup_inode(&path)? }; - INodeFile::open(inode, flags.to_options()) + Ok(Box::new(INodeFile::open(inode, flags.to_options())?)) } /// Lookup INode from the cwd of the process diff --git a/src/libos/src/fs/null.rs b/src/libos/src/fs/null.rs new file mode 100644 index 00000000..454d7f12 --- /dev/null +++ b/src/libos/src/fs/null.rs @@ -0,0 +1,54 @@ +use super::*; + +#[derive(Debug)] +pub struct NullFile; + +impl File for NullFile { + fn read(&self, _buf: &mut [u8]) -> Result { + unimplemented!() + } + + fn write(&self, _buf: &[u8]) -> Result { + Ok(0) + } + + fn read_at(&self, _offset: usize, _buf: &mut [u8]) -> Result { + unimplemented!() + } + + fn write_at(&self, _offset: usize, _buf: &[u8]) -> Result { + unimplemented!() + } + + fn readv(&self, bufs: &mut [&mut [u8]]) -> Result { + unimplemented!() + } + + fn writev(&self, bufs: &[&[u8]]) -> Result { + unimplemented!() + } + + fn seek(&self, pos: SeekFrom) -> Result { + unimplemented!() + } + + fn metadata(&self) -> Result { + unimplemented!() + } + + fn set_len(&self, len: u64) -> Result<(), Error> { + unimplemented!() + } + + fn sync_all(&self) -> Result<(), Error> { + unimplemented!() + } + + fn sync_data(&self) -> Result<(), Error> { + unimplemented!() + } + + fn read_entry(&self) -> Result { + unimplemented!() + } +} diff --git a/src/libos/src/process/spawn/mod.rs b/src/libos/src/process/spawn/mod.rs index edf95126..fee26df7 100644 --- a/src/libos/src/process/spawn/mod.rs +++ b/src/libos/src/process/spawn/mod.rs @@ -101,7 +101,7 @@ fn init_files(parent_ref: &ProcessRef, file_actions: &[FileAction]) -> Result { let flags = OpenFlags::from_bits_truncate(oflag); let file = parent.open_file(path.as_str(), flags, mode)?; - let file_ref: Arc> = Arc::new(Box::new(file)); + let file_ref: Arc> = Arc::new(file); let close_on_spawn = flags.contains(OpenFlags::CLOEXEC); cloned_file_table.put_at(fd, file_ref, close_on_spawn);