From 647b7dfc779ee1b222f0b2aa89059dbed17f1cf3 Mon Sep 17 00:00:00 2001 From: Wang Siyuan Date: Fri, 26 Dec 2025 10:47:53 +0000 Subject: [PATCH] Apply pseudo `Path` to sockets --- kernel/src/fs/pseudofs.rs | 14 ++++++++++ kernel/src/net/socket/ip/datagram/mod.rs | 11 ++++---- kernel/src/net/socket/ip/stream/mod.rs | 14 +++++----- kernel/src/net/socket/mod.rs | 26 +++++-------------- kernel/src/net/socket/netlink/common/mod.rs | 11 ++++---- kernel/src/net/socket/unix/datagram/socket.rs | 12 ++++----- kernel/src/net/socket/unix/stream/socket.rs | 17 +++++------- kernel/src/net/socket/vsock/stream/socket.rs | 14 +++++----- 8 files changed, 57 insertions(+), 62 deletions(-) diff --git a/kernel/src/fs/pseudofs.rs b/kernel/src/fs/pseudofs.rs index 1954168d4..6ac07f670 100644 --- a/kernel/src/fs/pseudofs.rs +++ b/kernel/src/fs/pseudofs.rs @@ -136,6 +136,20 @@ impl SockFs { PseudoFs::singleton(&SOCKFS, "sockfs", SOCKFS_MAGIC) } + /// Creates a pseudo `Path` for a socket. + pub fn new_path() -> Path { + let socket_inode = Arc::new(Self::singleton().alloc_inode( + InodeType::Socket, + mkmod!(a+rwx), + Uid::new_root(), + Gid::new_root(), + )); + + Path::new_pseudo(Self::mount_node().clone(), socket_inode, |inode| { + format!("socket:[{}]", inode.ino()) + }) + } + /// Returns the pseudo mount node of the socket file system. pub fn mount_node() -> &'static Arc { static SOCKFS_MOUNT: Once> = Once::new(); diff --git a/kernel/src/net/socket/ip/datagram/mod.rs b/kernel/src/net/socket/ip/datagram/mod.rs index 835f7911f..19460418c 100644 --- a/kernel/src/net/socket/ip/datagram/mod.rs +++ b/kernel/src/net/socket/ip/datagram/mod.rs @@ -9,13 +9,12 @@ use unbound::{BindOptions, UnboundDatagram}; use super::addr::UNSPECIFIED_LOCAL_ENDPOINT; use crate::{ events::IoEvents, - fs::utils::Inode, + fs::{path::Path, pseudofs::SockFs}, net::{ iface::is_broadcast_endpoint, socket::{ Socket, ip::options::{IpOptionSet, SetIpLevelOption}, - new_pseudo_inode, options::{Error as SocketError, SocketOption, macros::sock_option_mut}, private::SocketPrivate, util::{ @@ -41,7 +40,7 @@ pub struct DatagramSocket { is_nonblocking: AtomicBool, pollee: Pollee, - pseudo_inode: Arc, + pseudo_path: Path, } #[derive(Debug, Clone)] @@ -67,7 +66,7 @@ impl DatagramSocket { options: RwLock::new(OptionSet::new()), is_nonblocking: AtomicBool::new(is_nonblocking), pollee: Pollee::new(), - pseudo_inode: new_pseudo_inode(), + pseudo_path: SockFs::new_path(), }) } @@ -293,8 +292,8 @@ impl Socket for DatagramSocket { Ok(()) } - fn pseudo_inode(&self) -> &Arc { - &self.pseudo_inode + fn pseudo_path(&self) -> &Path { + &self.pseudo_path } } diff --git a/kernel/src/net/socket/ip/stream/mod.rs b/kernel/src/net/socket/ip/stream/mod.rs index a561493ce..c219a03ae 100644 --- a/kernel/src/net/socket/ip/stream/mod.rs +++ b/kernel/src/net/socket/ip/stream/mod.rs @@ -25,11 +25,11 @@ use super::{ }; use crate::{ events::IoEvents, - fs::{file_handle::FileLike, utils::Inode}, + fs::{file_handle::FileLike, path::Path, pseudofs::SockFs}, net::{ iface::Iface, socket::{ - Socket, new_pseudo_inode, + Socket, options::{ Error as SocketError, SocketOption, macros::{sock_option_mut, sock_option_ref}, @@ -63,7 +63,7 @@ pub struct StreamSocket { is_nonblocking: AtomicBool, pollee: Pollee, - pseudo_inode: Arc, + pseudo_path: Path, } enum State { @@ -108,7 +108,7 @@ impl StreamSocket { options: RwLock::new(OptionSet::new()), is_nonblocking: AtomicBool::new(is_nonblocking), pollee: Pollee::new(), - pseudo_inode: new_pseudo_inode(), + pseudo_path: SockFs::new_path(), }) } @@ -137,7 +137,7 @@ impl StreamSocket { state: RwLock::new(Takeable::new(State::Connected(connected_stream))), is_nonblocking: AtomicBool::new(false), pollee, - pseudo_inode: new_pseudo_inode(), + pseudo_path: SockFs::new_path(), }) } @@ -706,8 +706,8 @@ impl Socket for StreamSocket { Ok(()) } - fn pseudo_inode(&self) -> &Arc { - &self.pseudo_inode + fn pseudo_path(&self) -> &Path { + &self.pseudo_path } } diff --git a/kernel/src/net/socket/mod.rs b/kernel/src/net/socket/mod.rs index cd0f0933d..d02e78b8a 100644 --- a/kernel/src/net/socket/mod.rs +++ b/kernel/src/net/socket/mod.rs @@ -9,12 +9,11 @@ use crate::{ fs::{ file_handle::FileLike, file_table::FdFlags, - path::RESERVED_MOUNT_ID, + path::Path, pseudofs::SockFs, - utils::{CreationFlags, Inode, InodeType, StatusFlags, mkmod}, + utils::{CreationFlags, Inode, StatusFlags}, }, prelude::*, - process::{Gid, Uid}, util::{MultiRead, MultiWrite}, }; @@ -128,8 +127,8 @@ pub trait Socket: private::SocketPrivate + Send + Sync { flags: SendRecvFlags, ) -> Result<(usize, MessageHeader)>; - /// Returns a reference to the pseudo inode associated with this socket. - fn pseudo_inode(&self) -> &Arc; + /// Returns a reference to the pseudo path associated with this socket. + fn pseudo_path(&self) -> &Path; } impl FileLike for T { @@ -177,7 +176,7 @@ impl FileLike for T { } fn inode(&self) -> &Arc { - self.pseudo_inode() + self.pseudo_path().inode() } fn dump_proc_fdinfo(self: Arc, fd_flags: FdFlags) -> Box { @@ -190,8 +189,7 @@ impl FileLike for T { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { writeln!(f, "pos:\t{}", 0)?; writeln!(f, "flags:\t0{:o}", self.flags)?; - // TODO: This should be the mount ID of the pseudo filesystem. - writeln!(f, "mnt_id:\t{}", RESERVED_MOUNT_ID)?; + writeln!(f, "mnt_id:\t{}", SockFs::mount_node().id())?; writeln!(f, "ino:\t{}", self.ino) } } @@ -207,15 +205,3 @@ impl FileLike for T { }) } } - -/// Creates a new pseudo inode for a socket. -fn new_pseudo_inode() -> Arc { - let pseudo_inode = SockFs::singleton().alloc_inode( - InodeType::Socket, - mkmod!(a+rwx), - Uid::new_root(), - Gid::new_root(), - ); - - Arc::new(pseudo_inode) -} diff --git a/kernel/src/net/socket/netlink/common/mod.rs b/kernel/src/net/socket/netlink/common/mod.rs index be537d813..cee2c517d 100644 --- a/kernel/src/net/socket/netlink/common/mod.rs +++ b/kernel/src/net/socket/netlink/common/mod.rs @@ -8,11 +8,10 @@ use unbound::UnboundNetlink; use super::{GroupIdSet, NetlinkSocketAddr}; use crate::{ events::IoEvents, - fs::utils::Inode, + fs::{path::Path, pseudofs::SockFs}, net::socket::{ Socket, netlink::{AddMembership, DropMembership, table::SupportedNetlinkProtocol}, - new_pseudo_inode, options::{ Error as SocketError, SocketOption, macros::{sock_option_mut, sock_option_ref}, @@ -38,7 +37,7 @@ pub struct NetlinkSocket { is_nonblocking: AtomicBool, pollee: Pollee, - pseudo_inode: Arc, + pseudo_path: Path, } #[derive(Debug, Clone)] @@ -65,7 +64,7 @@ where options: RwLock::new(OptionSet::new()), is_nonblocking: AtomicBool::new(is_nonblocking), pollee: Pollee::new(), - pseudo_inode: new_pseudo_inode(), + pseudo_path: SockFs::new_path(), }) } @@ -222,8 +221,8 @@ where do_netlink_setsockopt(option, &mut inner) } - fn pseudo_inode(&self) -> &Arc { - &self.pseudo_inode + fn pseudo_path(&self) -> &Path { + &self.pseudo_path } } diff --git a/kernel/src/net/socket/unix/datagram/socket.rs b/kernel/src/net/socket/unix/datagram/socket.rs index a917ec3e3..35feb7eff 100644 --- a/kernel/src/net/socket/unix/datagram/socket.rs +++ b/kernel/src/net/socket/unix/datagram/socket.rs @@ -5,9 +5,9 @@ use core::sync::atomic::{AtomicBool, Ordering}; use super::message::{MessageQueue, MessageReceiver}; use crate::{ events::IoEvents, - fs::utils::Inode, + fs::{path::Path, pseudofs::SockFs}, net::socket::{ - Socket, new_pseudo_inode, + Socket, options::{Error as SocketError, SocketOption, macros::sock_option_mut}, private::SocketPrivate, unix::{UnixSocketAddr, ctrl_msg::AuxiliaryData}, @@ -28,7 +28,7 @@ pub struct UnixDatagramSocket { is_nonblocking: AtomicBool, is_write_shutdown: AtomicBool, - pseudo_inode: Arc, + pseudo_path: Path, } #[derive(Clone, Debug)] @@ -69,7 +69,7 @@ impl UnixDatagramSocket { options: RwLock::new(OptionSet::new()), is_nonblocking: AtomicBool::new(is_nonblocking), is_write_shutdown: AtomicBool::new(false), - pseudo_inode: new_pseudo_inode(), + pseudo_path: SockFs::new_path(), } } @@ -281,8 +281,8 @@ impl Socket for UnixDatagramSocket { Ok((received_bytes, message_header)) } - fn pseudo_inode(&self) -> &Arc { - &self.pseudo_inode + fn pseudo_path(&self) -> &Path { + &self.pseudo_path } } diff --git a/kernel/src/net/socket/unix/stream/socket.rs b/kernel/src/net/socket/unix/stream/socket.rs index 3e12d68a3..6a7ff9604 100644 --- a/kernel/src/net/socket/unix/stream/socket.rs +++ b/kernel/src/net/socket/unix/stream/socket.rs @@ -12,12 +12,9 @@ use super::{ }; use crate::{ events::IoEvents, - fs::{ - file_handle::FileLike, - utils::{EndpointState, Inode}, - }, + fs::{file_handle::FileLike, path::Path, pseudofs::SockFs, utils::EndpointState}, net::socket::{ - Socket, new_pseudo_inode, + Socket, options::{ Error as SocketError, PeerCred, PeerGroups, SocketOption, macros::sock_option_mut, }, @@ -45,7 +42,7 @@ pub struct UnixStreamSocket { is_nonblocking: AtomicBool, is_seqpacket: bool, - pseudo_inode: Arc, + pseudo_path: Path, } enum State { @@ -148,7 +145,7 @@ impl UnixStreamSocket { pollee: Pollee::new(), is_nonblocking: AtomicBool::new(is_nonblocking), is_seqpacket, - pseudo_inode: new_pseudo_inode(), + pseudo_path: SockFs::new_path(), }) } @@ -184,7 +181,7 @@ impl UnixStreamSocket { pollee: cloned_pollee, is_nonblocking: AtomicBool::new(is_nonblocking), is_seqpacket, - pseudo_inode: new_pseudo_inode(), + pseudo_path: SockFs::new_path(), }) } @@ -490,8 +487,8 @@ impl Socket for UnixStreamSocket { Ok((received_bytes, message_header)) } - fn pseudo_inode(&self) -> &Arc { - &self.pseudo_inode + fn pseudo_path(&self) -> &Path { + &self.pseudo_path } } diff --git a/kernel/src/net/socket/vsock/stream/socket.rs b/kernel/src/net/socket/vsock/stream/socket.rs index 1b12fedbf..2c71207ae 100644 --- a/kernel/src/net/socket/vsock/stream/socket.rs +++ b/kernel/src/net/socket/vsock/stream/socket.rs @@ -5,9 +5,9 @@ use core::sync::atomic::{AtomicBool, Ordering}; use super::{connected::Connected, connecting::Connecting, init::Init, listen::Listen}; use crate::{ events::IoEvents, - fs::{file_handle::FileLike, utils::Inode}, + fs::{file_handle::FileLike, path::Path, pseudofs::SockFs}, net::socket::{ - Socket, new_pseudo_inode, + Socket, private::SocketPrivate, util::{MessageHeader, SendRecvFlags, SockShutdownCmd, SocketAddr}, vsock::{VSOCK_GLOBAL, addr::VsockSocketAddr}, @@ -20,7 +20,7 @@ use crate::{ pub struct VsockStreamSocket { status: RwLock, is_nonblocking: AtomicBool, - pseudo_inode: Arc, + pseudo_path: Path, } pub enum Status { @@ -42,7 +42,7 @@ impl VsockStreamSocket { Ok(Self { status: RwLock::new(Status::Init(init)), is_nonblocking: AtomicBool::new(nonblocking), - pseudo_inode: new_pseudo_inode(), + pseudo_path: SockFs::new_path(), }) } @@ -50,7 +50,7 @@ impl VsockStreamSocket { Self { status: RwLock::new(Status::Connected(connected)), is_nonblocking: AtomicBool::new(false), - pseudo_inode: new_pseudo_inode(), + pseudo_path: SockFs::new_path(), } } @@ -310,8 +310,8 @@ impl Socket for VsockStreamSocket { } } - fn pseudo_inode(&self) -> &Arc { - &self.pseudo_inode + fn pseudo_path(&self) -> &Path { + &self.pseudo_path } }