From 2edbe1f725b4dd8c0593f9e10256836d8fd2a037 Mon Sep 17 00:00:00 2001 From: LI Qing Date: Thu, 10 Aug 2023 11:52:01 +0800 Subject: [PATCH] Add as_device method for file handle --- services/libs/jinux-std/src/fs/devpts/ptmx.rs | 5 +++++ services/libs/jinux-std/src/fs/devpts/slave.rs | 4 ++++ services/libs/jinux-std/src/fs/file_handle.rs | 9 +++++++-- services/libs/jinux-std/src/fs/inode_handle/dyn_cap.rs | 4 ++++ services/libs/jinux-std/src/fs/inode_handle/mod.rs | 1 + services/libs/jinux-std/src/fs/ramfs/fs.rs | 4 ++++ services/libs/jinux-std/src/fs/utils/inode.rs | 4 ++++ 7 files changed, 29 insertions(+), 2 deletions(-) diff --git a/services/libs/jinux-std/src/fs/devpts/ptmx.rs b/services/libs/jinux-std/src/fs/devpts/ptmx.rs index fcba7bab2..148db47eb 100644 --- a/services/libs/jinux-std/src/fs/devpts/ptmx.rs +++ b/services/libs/jinux-std/src/fs/devpts/ptmx.rs @@ -119,8 +119,13 @@ impl Inode for Ptmx { fn fs(&self) -> Arc { self.devpts() } + + fn as_device(&self) -> Option> { + Some(Arc::new(self.inner)) + } } +#[derive(Clone, Copy)] struct Inner; impl Device for Inner { diff --git a/services/libs/jinux-std/src/fs/devpts/slave.rs b/services/libs/jinux-std/src/fs/devpts/slave.rs index 83e7ffc99..86f474b00 100644 --- a/services/libs/jinux-std/src/fs/devpts/slave.rs +++ b/services/libs/jinux-std/src/fs/devpts/slave.rs @@ -107,4 +107,8 @@ impl Inode for PtySlaveInode { fn fs(&self) -> Arc { self.fs.upgrade().unwrap() } + + fn as_device(&self) -> Option> { + Some(self.device.clone()) + } } diff --git a/services/libs/jinux-std/src/fs/file_handle.rs b/services/libs/jinux-std/src/fs/file_handle.rs index 2036d7557..76ed8d00b 100644 --- a/services/libs/jinux-std/src/fs/file_handle.rs +++ b/services/libs/jinux-std/src/fs/file_handle.rs @@ -1,7 +1,8 @@ //! Opend File Handle -use crate::events::{IoEvents, Observer}; -use crate::fs::utils::{AccessMode, IoctlCmd, Metadata, SeekFrom, StatusFlags}; +use crate::events::Observer; +use crate::fs::device::Device; +use crate::fs::utils::{AccessMode, IoEvents, IoctlCmd, Metadata, Poller, SeekFrom, StatusFlags}; use crate::net::socket::Socket; use crate::prelude::*; use crate::process::signal::Poller; @@ -73,6 +74,10 @@ pub trait FileLike: Send + Sync + Any { fn as_socket(&self) -> Option<&dyn Socket> { None } + + fn as_device(&self) -> Option> { + None + } } impl dyn FileLike { diff --git a/services/libs/jinux-std/src/fs/inode_handle/dyn_cap.rs b/services/libs/jinux-std/src/fs/inode_handle/dyn_cap.rs index b286aa581..0e397e281 100644 --- a/services/libs/jinux-std/src/fs/inode_handle/dyn_cap.rs +++ b/services/libs/jinux-std/src/fs/inode_handle/dyn_cap.rs @@ -107,4 +107,8 @@ impl FileLike for InodeHandle { // Close does not guarantee that the data has been successfully saved to disk. Ok(()) } + + fn as_device(&self) -> Option> { + self.dentry().vnode().as_device() + } } diff --git a/services/libs/jinux-std/src/fs/inode_handle/mod.rs b/services/libs/jinux-std/src/fs/inode_handle/mod.rs index aa9101f16..e3e778d04 100644 --- a/services/libs/jinux-std/src/fs/inode_handle/mod.rs +++ b/services/libs/jinux-std/src/fs/inode_handle/mod.rs @@ -5,6 +5,7 @@ mod static_cap; use core::sync::atomic::{AtomicU32, Ordering}; +use crate::fs::device::Device; use crate::fs::file_handle::FileLike; use crate::fs::utils::{ AccessMode, Dentry, DirentVisitor, InodeType, IoctlCmd, Metadata, SeekFrom, StatusFlags, diff --git a/services/libs/jinux-std/src/fs/ramfs/fs.rs b/services/libs/jinux-std/src/fs/ramfs/fs.rs index 317d2834c..d7bdc01e2 100644 --- a/services/libs/jinux-std/src/fs/ramfs/fs.rs +++ b/services/libs/jinux-std/src/fs/ramfs/fs.rs @@ -574,6 +574,10 @@ impl Inode for RamInode { Ok(device_inode) } + fn as_device(&self) -> Option> { + self.0.read().inner.as_device().cloned() + } + fn create(&self, name: &str, type_: InodeType, mode: InodeMode) -> Result> { if self.0.read().metadata.type_ != InodeType::Dir { return_errno_with_message!(Errno::ENOTDIR, "self is not dir"); diff --git a/services/libs/jinux-std/src/fs/utils/inode.rs b/services/libs/jinux-std/src/fs/utils/inode.rs index 5a0132a4b..2573ff159 100644 --- a/services/libs/jinux-std/src/fs/utils/inode.rs +++ b/services/libs/jinux-std/src/fs/utils/inode.rs @@ -285,6 +285,10 @@ pub trait Inode: Any + Sync + Send { Err(Error::new(Errno::ENOTDIR)) } + fn as_device(&self) -> Option> { + None + } + fn readdir_at(&self, offset: usize, visitor: &mut dyn DirentVisitor) -> Result { Err(Error::new(Errno::ENOTDIR)) }