darwin_libproc/
pid_cwd.rs

1use std::ffi::OsStr;
2use std::io;
3use std::os::unix::ffi::OsStrExt;
4use std::path::PathBuf;
5use std::slice;
6
7use super::vnode_path_info;
8
9/// Fetch current working directory for process with `pid` provided.
10pub fn pid_cwd(pid: libc::pid_t) -> io::Result<PathBuf> {
11    let vnode_path = vnode_path_info(pid)?;
12    let raw_path = unsafe {
13        slice::from_raw_parts(
14            vnode_path.pvi_cdir.vip_path.as_ptr() as *const u8,
15            vnode_path.pvi_cdir.vip_path.len(),
16        )
17    };
18    let first_null = memchr::memchr(0x00, &raw_path).unwrap_or(0);
19
20    let os_str = OsStr::from_bytes(&raw_path[..first_null]);
21
22    Ok(PathBuf::from(os_str.to_os_string()))
23}