diff --git a/src/lib.rs b/src/lib.rs index e0c7763b7616168833fda812e6f66db2fdcaa400..bca9cc91388f784c8f4893abf38ca0759446ea79 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,11 +13,11 @@ use syscall::{ StatVfs, TimeSpec, EBADF, EINTR, EINVAL, ENOENT, EOPNOTSUPP, }; -pub use self::scheme_block::SchemeBlock; pub use self::scheme::Scheme; +pub use self::scheme_block::SchemeBlock; -mod scheme_block; mod scheme; +mod scheme_block; pub struct CallerCtx { pub pid: usize, @@ -89,6 +89,7 @@ pub enum RequestKind { MsyncMsg, MunmapMsg, MmapMsg, + OnClose { id: usize }, } impl CallRequest { @@ -226,8 +227,6 @@ impl CallRequest { ) } - Opcode::Close => scheme.close(a), - Opcode::MmapPrep => scheme.mmap_prep(a, args[3], b, MapFlags::from_bits_retain(c)), Opcode::Munmap => scheme.munmap(a, args[3], b, MunmapFlags::from_bits_retain(c)), @@ -386,8 +385,6 @@ impl CallRequest { .transpose()? } - Opcode::Close => scheme.close(a).transpose()?, - Opcode::MmapPrep => scheme .mmap_prep(a, args[3], b, MapFlags::from_bits_retain(c)) .transpose()?, @@ -467,6 +464,9 @@ impl Request { Some(Opcode::Msync) => RequestKind::MsyncMsg, //Some(Opcode::Munmap) => RequestKind::MunmapMsg, Some(Opcode::RequestMmap) => RequestKind::MmapMsg, + Some(Opcode::CloseMsg) => RequestKind::OnClose { + id: self.sqe.args[0] as usize, + }, _ => RequestKind::Call(CallRequest { inner: Request { sqe: self.sqe }, @@ -481,7 +481,7 @@ pub struct Socket { impl Socket { fn create_inner(name: &str, nonblock: bool) -> Result<Self> { - let mut flags = flag::O_FSYNC; + let mut flags = flag::O_FSYNC | 0x0020_0000 /* O_EXLOCK */; if nonblock { flags |= flag::O_NONBLOCK; diff --git a/src/scheme.rs b/src/scheme.rs index 14e2e72fd72ddb4e025b4e53a8f0765855ee8fa3..07542c4eb5821d85fa99ce264d3f6477243bd2be 100644 --- a/src/scheme.rs +++ b/src/scheme.rs @@ -121,11 +121,6 @@ pub trait Scheme { Err(Error::new(EBADF)) } - #[allow(unused_variables)] - fn close(&mut self, id: usize) -> Result<usize> { - Err(Error::new(EBADF)) - } - #[allow(unused_variables)] fn mmap_prep(&mut self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result<usize> { Err(Error::new(EOPNOTSUPP)) diff --git a/src/scheme_block.rs b/src/scheme_block.rs index fa1e2945387c1997e9936b230786a7f6555d8abd..e365c366c0695acb901b8a996a9378bcb5106108 100644 --- a/src/scheme_block.rs +++ b/src/scheme_block.rs @@ -38,7 +38,13 @@ pub trait SchemeBlock { Err(Error::new(EBADF)) } #[allow(unused_variables)] - fn read(&mut self, id: usize, buf: &mut [u8], offset: u64, fcntl_flags: u32) -> Result<Option<usize>> { + fn read( + &mut self, + id: usize, + buf: &mut [u8], + offset: u64, + fcntl_flags: u32, + ) -> Result<Option<usize>> { self.read_old(id, buf) } @@ -47,7 +53,13 @@ pub trait SchemeBlock { Err(Error::new(EBADF)) } #[allow(unused_variables)] - fn write(&mut self, id: usize, buf: &[u8], offset: u64, fcntl_flags: u32) -> Result<Option<usize>> { + fn write( + &mut self, + id: usize, + buf: &[u8], + offset: u64, + fcntl_flags: u32, + ) -> Result<Option<usize>> { self.write_old(id, buf) } @@ -122,17 +134,24 @@ pub trait SchemeBlock { } #[allow(unused_variables)] - fn close(&mut self, id: usize) -> Result<Option<usize>> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn mmap_prep(&mut self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result<Option<usize>> { + fn mmap_prep( + &mut self, + id: usize, + offset: u64, + size: usize, + flags: MapFlags, + ) -> Result<Option<usize>> { Err(Error::new(EOPNOTSUPP)) } #[allow(unused_variables)] - fn munmap(&mut self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result<Option<usize>> { + fn munmap( + &mut self, + id: usize, + offset: u64, + size: usize, + flags: MunmapFlags, + ) -> Result<Option<usize>> { Err(Error::new(EOPNOTSUPP)) } }