Add struct Path for VFS

Signed-off-by: Zhenchen Wang <m202372036@hust.edu.cn>
This commit is contained in:
plucky
2024-04-09 09:30:58 +08:00
committed by Tate, Hongliang Tian
parent bc1bf4cb53
commit 6d486c6c01
39 changed files with 561 additions and 447 deletions

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: MPL-2.0
use crate::{fs::utils::Dentry, net::socket::util::socket_addr::SocketAddr, prelude::*};
use crate::{fs::utils::Path, net::socket::util::socket_addr::SocketAddr, prelude::*};
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum UnixSocketAddr {
@ -10,7 +10,7 @@ pub enum UnixSocketAddr {
#[derive(Clone)]
pub(super) enum UnixSocketAddrBound {
Path(Arc<Dentry>),
Path(Arc<Path>),
Abstract(String),
}
@ -18,7 +18,9 @@ impl PartialEq for UnixSocketAddrBound {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::Abstract(l0), Self::Abstract(r0)) => l0 == r0,
(Self::Path(l0), Self::Path(r0)) => Arc::ptr_eq(l0.inode(), r0.inode()),
(Self::Path(l0), Self::Path(r0)) => {
Arc::ptr_eq(l0.dentry().inode(), r0.dentry().inode())
}
_ => false,
}
}
@ -38,8 +40,8 @@ impl TryFrom<SocketAddr> for UnixSocketAddr {
impl From<UnixSocketAddrBound> for UnixSocketAddr {
fn from(value: UnixSocketAddrBound) -> Self {
match value {
UnixSocketAddrBound::Path(dentry) => {
let abs_path = dentry.abs_path();
UnixSocketAddrBound::Path(path) => {
let abs_path = path.abs_path();
Self::Path(abs_path)
}
UnixSocketAddrBound::Abstract(name) => Self::Abstract(name),

View File

@ -7,7 +7,7 @@ use crate::{
events::IoEvents,
fs::{
fs_resolver::{split_path, FsPath},
utils::{Dentry, InodeMode, InodeType},
utils::{InodeMode, InodeType, Path},
},
net::socket::unix::addr::{UnixSocketAddr, UnixSocketAddrBound},
prelude::*,
@ -37,9 +37,9 @@ impl Init {
let bound_addr = match addr_to_bind {
UnixSocketAddr::Abstract(_) => todo!(),
UnixSocketAddr::Path(path) => {
let dentry = create_socket_file(path)?;
UnixSocketAddrBound::Path(dentry)
UnixSocketAddr::Path(pathname) => {
let path = create_socket_file(pathname)?;
UnixSocketAddrBound::Path(path)
}
};
@ -87,18 +87,19 @@ impl Init {
}
}
fn create_socket_file(path: &str) -> Result<Arc<Dentry>> {
let (parent_pathname, file_name) = split_path(path);
fn create_socket_file(pathname: &str) -> Result<Arc<Path>> {
let (parent_pathname, file_name) = split_path(pathname);
let parent = {
let current = current!();
let fs = current.fs().read();
let parent_path = FsPath::try_from(parent_pathname)?;
fs.lookup(&parent_path)?
};
let dentry = parent.create(
let dentry = parent.dentry().create(
file_name,
InodeType::Socket,
InodeMode::S_IRUSR | InodeMode::S_IWUSR,
)?;
Ok(dentry)
let path = Path::new(parent.mount_node().clone(), dentry.clone());
Ok(path)
}

View File

@ -9,7 +9,7 @@ use crate::{
events::IoEvents,
fs::{
file_handle::FileLike,
utils::{Dentry, Inode},
utils::{Inode, Path},
},
net::socket::{
unix::addr::{UnixSocketAddr, UnixSocketAddrBound},
@ -91,10 +91,10 @@ impl BacklogTable {
fn add_backlog(&self, addr: &UnixSocketAddrBound, backlog: usize) -> Result<()> {
let inode = {
let UnixSocketAddrBound::Path(dentry) = addr else {
let UnixSocketAddrBound::Path(path) = addr else {
todo!()
};
create_keyable_inode(dentry)
create_keyable_inode(path)
};
let mut backlog_sockets = self.backlog_sockets.write();
@ -108,10 +108,10 @@ impl BacklogTable {
fn get_backlog(&self, addr: &UnixSocketAddrBound) -> Result<Arc<Backlog>> {
let inode = {
let UnixSocketAddrBound::Path(dentry) = addr else {
let UnixSocketAddrBound::Path(path) = addr else {
todo!()
};
create_keyable_inode(dentry)
create_keyable_inode(path)
};
let backlog_sockets = self.backlog_sockets.read();
@ -212,8 +212,8 @@ impl Backlog {
}
}
fn create_keyable_inode(dentry: &Arc<Dentry>) -> KeyableWeak<dyn Inode> {
let weak_inode = Arc::downgrade(dentry.inode());
fn create_keyable_inode(path: &Arc<Path>) -> KeyableWeak<dyn Inode> {
let weak_inode = Arc::downgrade(path.dentry().inode());
KeyableWeak::from(weak_inode)
}

View File

@ -11,7 +11,7 @@ use crate::{
fs::{
file_handle::FileLike,
fs_resolver::FsPath,
utils::{Dentry, InodeType, StatusFlags},
utils::{InodeType, Path, StatusFlags},
},
net::socket::{
unix::{addr::UnixSocketAddrBound, UnixSocketAddr},
@ -161,9 +161,9 @@ impl Socket for UnixStreamSocket {
UnixSocketAddr::Abstract(abstract_name) => {
UnixSocketAddrBound::Abstract(abstract_name)
}
UnixSocketAddr::Path(path) => {
let dentry = lookup_socket_file(&path)?;
UnixSocketAddrBound::Path(dentry)
UnixSocketAddr::Path(pathname) => {
let path = lookup_socket_file(&pathname)?;
UnixSocketAddrBound::Path(path)
}
}
};
@ -287,20 +287,20 @@ impl Drop for UnixStreamSocket {
}
}
fn lookup_socket_file(path: &str) -> Result<Arc<Dentry>> {
let dentry = {
fn lookup_socket_file(pathname: &str) -> Result<Arc<Path>> {
let path = {
let current = current!();
let fs = current.fs().read();
let fs_path = FsPath::try_from(path)?;
let fs_path = FsPath::try_from(pathname)?;
fs.lookup(&fs_path)?
};
if dentry.type_() != InodeType::Socket {
if path.dentry().type_() != InodeType::Socket {
return_errno_with_message!(Errno::ENOTSOCK, "not a socket file")
}
if !dentry.mode()?.is_readable() || !dentry.mode()?.is_writable() {
if !path.dentry().mode()?.is_readable() || !path.dentry().mode()?.is_writable() {
return_errno_with_message!(Errno::EACCES, "the socket cannot be read or written")
}
Ok(dentry)
Ok(path)
}