mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-24 18:03:25 +00:00
Add as_device method for file handle
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
576578baf4
commit
2edbe1f725
@ -119,8 +119,13 @@ impl Inode for Ptmx {
|
||||
fn fs(&self) -> Arc<dyn FileSystem> {
|
||||
self.devpts()
|
||||
}
|
||||
|
||||
fn as_device(&self) -> Option<Arc<dyn Device>> {
|
||||
Some(Arc::new(self.inner))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
struct Inner;
|
||||
|
||||
impl Device for Inner {
|
||||
|
@ -107,4 +107,8 @@ impl Inode for PtySlaveInode {
|
||||
fn fs(&self) -> Arc<dyn FileSystem> {
|
||||
self.fs.upgrade().unwrap()
|
||||
}
|
||||
|
||||
fn as_device(&self) -> Option<Arc<dyn Device>> {
|
||||
Some(self.device.clone())
|
||||
}
|
||||
}
|
||||
|
@ -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<Arc<dyn Device>> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl dyn FileLike {
|
||||
|
@ -107,4 +107,8 @@ impl FileLike for InodeHandle<Rights> {
|
||||
// Close does not guarantee that the data has been successfully saved to disk.
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn as_device(&self) -> Option<Arc<dyn Device>> {
|
||||
self.dentry().vnode().as_device()
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -574,6 +574,10 @@ impl Inode for RamInode {
|
||||
Ok(device_inode)
|
||||
}
|
||||
|
||||
fn as_device(&self) -> Option<Arc<dyn Device>> {
|
||||
self.0.read().inner.as_device().cloned()
|
||||
}
|
||||
|
||||
fn create(&self, name: &str, type_: InodeType, mode: InodeMode) -> Result<Arc<dyn Inode>> {
|
||||
if self.0.read().metadata.type_ != InodeType::Dir {
|
||||
return_errno_with_message!(Errno::ENOTDIR, "self is not dir");
|
||||
|
@ -285,6 +285,10 @@ pub trait Inode: Any + Sync + Send {
|
||||
Err(Error::new(Errno::ENOTDIR))
|
||||
}
|
||||
|
||||
fn as_device(&self) -> Option<Arc<dyn Device>> {
|
||||
None
|
||||
}
|
||||
|
||||
fn readdir_at(&self, offset: usize, visitor: &mut dyn DirentVisitor) -> Result<usize> {
|
||||
Err(Error::new(Errno::ENOTDIR))
|
||||
}
|
||||
|
Reference in New Issue
Block a user