darwin_libproc/
pid_info.rs1use std::io;
2use std::mem;
3
4fn pid_info<T>(
5 pid: libc::pid_t,
6 flavor: libc::c_int,
7 arg: u64,
8) -> io::Result<T> {
9 let mut info = mem::MaybeUninit::<T>::uninit();
10 let size = mem::size_of::<T>() as libc::c_int;
11
12 let result = unsafe {
13 darwin_libproc_sys::proc_pidinfo(
14 pid,
15 flavor,
16 arg,
17 info.as_mut_ptr() as *mut libc::c_void,
18 size,
19 )
20 };
21
22 match result {
23 value if value <= 0 => Err(io::Error::last_os_error()),
24 value if value != size => Err(io::Error::new(
25 io::ErrorKind::Other,
26 "invalid value returned",
27 )),
28 _ => unsafe { Ok(info.assume_init()) },
29 }
30}
31
32pub fn task_info(
34 pid: libc::pid_t,
35) -> io::Result<darwin_libproc_sys::proc_taskinfo> {
36 pid_info(pid, darwin_libproc_sys::PROC_PIDTASKINFO, 0)
37}
38
39pub fn task_all_info(
41 pid: libc::pid_t,
42) -> io::Result<darwin_libproc_sys::proc_taskallinfo> {
43 pid_info(pid, darwin_libproc_sys::PROC_PIDTASKALLINFO, 0)
44}
45
46pub fn vnode_path_info(
48 pid: libc::pid_t,
49) -> io::Result<darwin_libproc_sys::proc_vnodepathinfo> {
50 pid_info(pid, darwin_libproc_sys::PROC_PIDVNODEPATHINFO, 0)
51}