diff --git a/kernel/aster-nix/src/fs/procfs/pid/cmdline.rs b/kernel/aster-nix/src/fs/procfs/pid/cmdline.rs new file mode 100644 index 000000000..aa633ae74 --- /dev/null +++ b/kernel/aster-nix/src/fs/procfs/pid/cmdline.rs @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MPL-2.0 + +use crate::{ + fs::{ + procfs::template::{FileOps, ProcFileBuilder}, + utils::Inode, + }, + prelude::*, + Process, +}; + +/// Represents the inode at `/proc/[pid]/cmdline`. +pub struct CmdlineFileOps(Arc); + +impl CmdlineFileOps { + pub fn new_inode(process_ref: Arc, parent: Weak) -> Arc { + ProcFileBuilder::new(Self(process_ref)) + .parent(parent) + .build() + .unwrap() + } +} + +impl FileOps for CmdlineFileOps { + fn data(&self) -> Result> { + let cmdline_output = if self.0.is_zombie() { + // Returns 0 characters for zombie process. + Vec::new() + } else { + let Ok(argv_cstrs) = self.0.vm().init_stack_reader().argv() else { + return Ok(Vec::new()); + }; + argv_cstrs + .into_iter() + .flat_map(|c_str| c_str.into_bytes_with_nul().into_iter()) + .collect() + }; + Ok(cmdline_output) + } +} diff --git a/kernel/aster-nix/src/fs/procfs/pid/comm.rs b/kernel/aster-nix/src/fs/procfs/pid/comm.rs index 7b906a7f9..91bcb9938 100644 --- a/kernel/aster-nix/src/fs/procfs/pid/comm.rs +++ b/kernel/aster-nix/src/fs/procfs/pid/comm.rs @@ -1,6 +1,13 @@ // SPDX-License-Identifier: MPL-2.0 -use super::*; +use crate::{ + fs::{ + procfs::template::{FileOps, ProcFileBuilder}, + utils::Inode, + }, + prelude::*, + Process, +}; /// Represents the inode at `/proc/[pid]/comm`. pub struct CommFileOps(Arc); diff --git a/kernel/aster-nix/src/fs/procfs/pid/exe.rs b/kernel/aster-nix/src/fs/procfs/pid/exe.rs index 016f13746..74299c924 100644 --- a/kernel/aster-nix/src/fs/procfs/pid/exe.rs +++ b/kernel/aster-nix/src/fs/procfs/pid/exe.rs @@ -1,6 +1,13 @@ // SPDX-License-Identifier: MPL-2.0 -use super::*; +use crate::{ + fs::{ + procfs::{ProcSymBuilder, SymOps}, + utils::Inode, + }, + prelude::*, + Process, +}; /// Represents the inode at `/proc/[pid]/exe`. pub struct ExeSymOps(Arc); diff --git a/kernel/aster-nix/src/fs/procfs/pid/fd.rs b/kernel/aster-nix/src/fs/procfs/pid/fd.rs index 2c2315625..8773a7810 100644 --- a/kernel/aster-nix/src/fs/procfs/pid/fd.rs +++ b/kernel/aster-nix/src/fs/procfs/pid/fd.rs @@ -1,7 +1,18 @@ // SPDX-License-Identifier: MPL-2.0 -use super::*; -use crate::fs::{file_handle::FileLike, file_table::FileDesc, inode_handle::InodeHandle}; +use crate::{ + fs::{ + file_handle::FileLike, + file_table::FileDesc, + inode_handle::InodeHandle, + procfs::{ + pid::FdEvents, DirOps, Observer, ProcDir, ProcDirBuilder, ProcSymBuilder, SymOps, + }, + utils::{DirEntryVecExt, Inode}, + }, + prelude::*, + Process, +}; /// Represents the inode at `/proc/[pid]/fd`. pub struct FdDirOps(Arc); diff --git a/kernel/aster-nix/src/fs/procfs/pid/mod.rs b/kernel/aster-nix/src/fs/procfs/pid/mod.rs index 9d0b3d45a..8d2b7fbcd 100644 --- a/kernel/aster-nix/src/fs/procfs/pid/mod.rs +++ b/kernel/aster-nix/src/fs/procfs/pid/mod.rs @@ -1,9 +1,7 @@ // SPDX-License-Identifier: MPL-2.0 -use self::{comm::CommFileOps, exe::ExeSymOps, fd::FdDirOps}; -use super::template::{ - DirOps, FileOps, ProcDir, ProcDirBuilder, ProcFileBuilder, ProcSymBuilder, SymOps, -}; +use self::{cmdline::CmdlineFileOps, comm::CommFileOps, exe::ExeSymOps, fd::FdDirOps}; +use super::template::{DirOps, ProcDir, ProcDirBuilder}; use crate::{ events::Observer, fs::{ @@ -14,6 +12,7 @@ use crate::{ process::Process, }; +mod cmdline; mod comm; mod exe; mod fd; @@ -51,6 +50,7 @@ impl DirOps for PidDirOps { "exe" => ExeSymOps::new_inode(self.0.clone(), this_ptr.clone()), "comm" => CommFileOps::new_inode(self.0.clone(), this_ptr.clone()), "fd" => FdDirOps::new_inode(self.0.clone(), this_ptr.clone()), + "cmdline" => CmdlineFileOps::new_inode(self.0.clone(), this_ptr.clone()), _ => return_errno!(Errno::ENOENT), }; Ok(inode) @@ -70,6 +70,9 @@ impl DirOps for PidDirOps { }); cached_children.put_entry_if_not_found("fd", || { FdDirOps::new_inode(self.0.clone(), this_ptr.clone()) - }) + }); + cached_children.put_entry_if_not_found("cmdline", || { + CmdlineFileOps::new_inode(self.0.clone(), this_ptr.clone()) + }); } }