From 9a76ca1888668356478a1ed74c7f0511772c57eb Mon Sep 17 00:00:00 2001 From: LI Qing Date: Thu, 13 May 2021 17:38:43 +0800 Subject: [PATCH] Add support for '/proc/[pid]/root' --- src/libos/src/fs/fs_view.rs | 18 ++++++++++++------ src/libos/src/fs/procfs/pid_inode.rs | 20 ++++++++++++++++++++ test/procfs/main.c | 11 +++++++++++ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/libos/src/fs/fs_view.rs b/src/libos/src/fs/fs_view.rs index 356025cb..248d38b2 100644 --- a/src/libos/src/fs/fs_view.rs +++ b/src/libos/src/fs/fs_view.rs @@ -3,14 +3,20 @@ use super::*; #[derive(Debug, Clone)] pub struct FsView { + root: String, cwd: String, } impl FsView { pub fn new() -> FsView { - Self { - cwd: "/".to_owned(), - } + let root = String::from("/"); + let cwd = root.clone(); + Self { root, cwd } + } + + /// Get the root directory + pub fn root(&self) -> &str { + &self.root } /// Get the current working directory. @@ -203,8 +209,8 @@ impl FsView { impl Default for FsView { fn default() -> Self { - Self { - cwd: "/".to_owned(), - } + let root = String::from("/"); + let cwd = root.clone(); + Self { root, cwd } } } diff --git a/src/libos/src/fs/procfs/pid_inode.rs b/src/libos/src/fs/procfs/pid_inode.rs index 630356fe..a1b01502 100644 --- a/src/libos/src/fs/procfs/pid_inode.rs +++ b/src/libos/src/fs/procfs/pid_inode.rs @@ -38,6 +38,10 @@ impl LockedPidDirINode { // fd let fd_inode = LockedProcFdDirINode::new(&file.process_ref, file.this.upgrade().unwrap()); file.entries.insert(String::from("fd"), fd_inode); + // root + let root_inode = ProcRootSymINode::new(&file.process_ref); + file.entries.insert(String::from("root"), root_inode); + Ok(()) } } @@ -166,6 +170,22 @@ impl ProcINode for ProcCwdSymINode { } } +pub struct ProcRootSymINode(ProcessRef); + +impl ProcRootSymINode { + pub fn new(process_ref: &ProcessRef) -> Arc { + Arc::new(SymLink::new(Self(Arc::clone(process_ref)))) + } +} + +impl ProcINode for ProcRootSymINode { + fn generate_data_in_bytes(&self) -> vfs::Result> { + let main_thread = self.0.main_thread().ok_or(FsError::EntryNotFound)?; + let fs = main_thread.fs().lock().unwrap(); + Ok(fs.root().to_owned().into_bytes()) + } +} + pub struct FdSymINode(FileRef); impl FdSymINode { diff --git a/test/procfs/main.c b/test/procfs/main.c index cc200bee..0a1ee0c9 100644 --- a/test/procfs/main.c +++ b/test/procfs/main.c @@ -66,6 +66,16 @@ static int test_readlink_from_proc_self_cwd() { return 0; } +static int test_readlink_from_proc_self_root() { + char root_buf[PATH_MAX] = { 0 }; + const char *proc_root = "/proc/self/root"; + + if (test_readlink_from_procfs(proc_root, root_buf, PATH_MAX, "/") < 0) { + THROW_ERROR("failed to call test_readlink_from_procfs"); + } + return 0; +} + static int test_read_from_proc_self_cmdline() { char absolute_path[PATH_MAX] = { 0 }; const char *proc_cmdline = "/proc/self/cmdline"; @@ -126,6 +136,7 @@ static int test_read_from_proc_cpuinfo() { static test_case_t test_cases[] = { TEST_CASE(test_readlink_from_proc_self_exe), TEST_CASE(test_readlink_from_proc_self_cwd), + TEST_CASE(test_readlink_from_proc_self_root), TEST_CASE(test_read_from_proc_self_cmdline), TEST_CASE(test_read_from_proc_meminfo), TEST_CASE(test_read_from_proc_cpuinfo),