comparison dep/animia/src/fd/xnu.cc @ 154:d43d68408d3c

dep/animia: fix XnuFdTools also we use anitomy directly now. HG Enter commit message. Lines beginning with 'HG:' are removed.
author Paper <mrpapersonic@gmail.com>
date Wed, 15 Nov 2023 14:14:17 -0500
parents bd439dd6ffc5
children d2bbb5773616
comparison
equal deleted inserted replaced
153:bd439dd6ffc5 154:d43d68408d3c
6 #include "animia.h" 6 #include "animia.h"
7 7
8 #include <unordered_map> 8 #include <unordered_map>
9 #include <vector> 9 #include <vector>
10 #include <string> 10 #include <string>
11 #include <cassert>
11 12
12 #include <fcntl.h> 13 #include <fcntl.h>
13 #include <sys/sysctl.h> 14 #include <sys/sysctl.h>
14 #include <sys/types.h> 15 #include <sys/types.h>
15 #include <sys/user.h> 16 #include <sys/user.h>
16 #include <libproc.h> 17 #include <libproc.h>
17 18
18 namespace animia::internal::xnu { 19 namespace animia::internal::xnu {
19 20
20 static bool GetProcessName(pid_t pid, std::string& result) { 21 static std::string GetProcessName(pid_t pid) {
21 struct proc_bsdinfo proc; 22 struct proc_bsdinfo proc;
22 23
23 int st = proc_pidinfo(pid, PROC_PIDTBSDINFO, 0, &proc, PROC_PIDTBSDINFO_SIZE); 24 int st = proc_pidinfo(pid, PROC_PIDTBSDINFO, 0, &proc, PROC_PIDTBSDINFO_SIZE);
24 if (st != PROC_PIDTBSDINFO_SIZE) 25 if (st != PROC_PIDTBSDINFO_SIZE)
25 return false; 26 return "";
26 27
27 /* fixme: is this right? pbi_comm is an alternative, but it reduces the string size to 28 /* fixme: is this right? pbi_comm is an alternative, but it reduces the string size to
28 16 chars. does pbi_name do the same, or is it different? */ 29 16 chars. does pbi_name do the same, or is it different? */
29 result = proc.pbi_name; 30 return proc.pbi_name;
30 return true;
31 } 31 }
32 32
33 /* this is a cleaned up version of a function from... Apple? 33 /* this is a cleaned up version of a function from... Apple?
34 ...anyway, what it essentially does is gets the size and stuff from 34 ...anyway, what it essentially does is gets the size and stuff from
35 sysctl() and reserves the space in a vector to store the PIDs */ 35 sysctl() and reserves the space in a vector to store the PIDs */
58 for (int i = 0; i < length / sizeof(*result); i++) { 58 for (int i = 0; i < length / sizeof(*result); i++) {
59 const pid_t pid = result[i].kp_proc.p_pid; 59 const pid_t pid = result[i].kp_proc.p_pid;
60 if (!process_proc({pid, GetProcessName(pid)})) 60 if (!process_proc({pid, GetProcessName(pid)}))
61 return false; 61 return false;
62 } 62 }
63
64 return true;
63 } 65 }
64 66
65 bool XnuFdTools::EnumerateOpenFiles(const std::set<pid_t>& pids, open_file_proc_t open_file_proc) { 67 bool XnuFdTools::EnumerateOpenFiles(const std::set<pid_t>& pids, open_file_proc_t open_file_proc) {
66 if (!open_file_proc) 68 if (!open_file_proc)
67 return false; 69 return false;
93 if (!open_file_proc({pid, vnodeInfo.pvip.vip_path})) 95 if (!open_file_proc({pid, vnodeInfo.pvip.vip_path}))
94 return false; 96 return false;
95 } 97 }
96 } 98 }
97 } 99 }
100
98 return true; 101 return true;
99 } 102 }
100 103
101 } // namespace animia::internal::unix 104 } // namespace animia::internal::unix