Skip to content

Commit

Permalink
Add support for /proc/<pid>/ns
Browse files Browse the repository at this point in the history
  • Loading branch information
Furisto committed Jul 11, 2021
1 parent 30ab949 commit 62d38f2
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 1 deletion.
3 changes: 3 additions & 0 deletions src/process/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ pub use stat::*;
mod mount;
pub use mount::*;

mod namespaces;
pub use namespaces::*;

mod status;
pub use status::*;

Expand Down
75 changes: 75 additions & 0 deletions src/process/namespaces.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
use std::{
ffi::{CString, OsString},
fs::{self},
os::unix::prelude::OsStrExt,
path::PathBuf,
};

use crate::ProcResult;

use super::Process;

impl Process {
/// Describes namespaces to which the process with the corresponding PID belongs.
/// Doc reference: https://man7.org/linux/man-pages/man7/namespaces.7.html
pub fn namespaces(&self) -> ProcResult<Vec<Namespace>> {
let ns = self.root.join("ns");
let mut namespaces = Vec::new();
for entry in fs::read_dir(ns)? {
let entry = entry?;
let path = entry.path();
let ns_type = entry.file_name();
let cstr = CString::new(path.as_os_str().as_bytes()).unwrap();

let mut stat = unsafe { std::mem::zeroed() };
if unsafe { libc::stat(cstr.as_ptr(), &mut stat) } != 0 {
return Err(build_internal_error!(format!("Unable to stat {:?}", path)));
}

namespaces.push(Namespace {
ns_type,
path,
identifier: stat.st_ino,
device_id: stat.st_dev,
})
}

Ok(namespaces)
}
}

/// Information about a namespace
///
/// See also the [Process::namespaces()] method
#[derive(Debug, Clone)]
pub struct Namespace {
/// Namespace type
pub ns_type: OsString,
/// Handle to the namespace
pub path: PathBuf,
/// Namespace identifier (inode number)
pub identifier: u64,
/// Device id of the namespace
pub device_id: u64,
}

impl PartialEq for Namespace {
fn eq(&self, other: &Self) -> bool {
// see https://lore.kernel.org/lkml/87poky5ca9.fsf@xmission.com/
self.identifier == other.identifier && self.device_id == other.device_id
}
}

impl Eq for Namespace {}

#[cfg(test)]
mod tests {
use crate::process::Process;

#[test]
fn test_namespaces() {
let myself = Process::myself().unwrap();
let namespaces = myself.namespaces().unwrap();
print!("{:?}", namespaces);
}
}
2 changes: 1 addition & 1 deletion support.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ This is an approximate list of all the files under the `/proc` mount, and an ind
* [x] `/proc/[pid]/mountinfo`
* [ ] `/proc/[pid]/mounts`
* [x] `/proc/[pid]/mountstats`
* [ ] `/proc/[pid]/ns/`
* [x] `/proc/[pid]/ns/`
* [ ] `/proc/[pid]/numa_maps`
* [ ] `/proc/[pid]/oom_adj`
* [x] `/proc/[pid]/oom_score`
Expand Down

0 comments on commit 62d38f2

Please sign in to comment.