annotate src/fd/xnu.cc @ 11:89adf9798083

dep/animone/x11: remove stupid debugging code
author Paper <paper@paper.us.eu.org>
date Wed, 08 May 2024 16:20:37 -0400
parents f26b08274dcf
children efbb8316395f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
1 #include "animone/fd/xnu.h"
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
2 #include "animone.h"
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
3 #include "animone/util/osx.h"
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
4
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
5 #include <cassert>
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
6 #include <memory>
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
7 #include <string>
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
8 #include <unordered_map>
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
9 #include <vector>
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
10
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
11 #include <fcntl.h>
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
12 #include <libproc.h>
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
13 #include <sys/sysctl.h>
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
14 #include <sys/types.h>
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
15 #include <sys/user.h>
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
16
6
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
17 /* you may be asking: WTF is FWRITE?
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
18 * well, from bsd/sys/fcntl.h in the XNU kernel:
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
19 *
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
20 * Kernel encoding of open mode; separate read and write bits that are
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
21 * independently testable: 1 greater than [O_RDONLY and O_WRONLY].
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
22 *
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
23 * It's just how the kernel defines write mode.
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
24 */
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
25 #ifndef FWRITE
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
26 #define FWRITE 0x0002
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
27 #endif
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
28
0
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
29 namespace animone::internal::xnu {
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
30
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
31 bool EnumerateOpenProcesses(process_proc_t process_proc) {
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
32 size_t pids_size = 256;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
33 std::unique_ptr<pid_t[]> pids;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
34
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
35 int returned_size = 0;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
36 do {
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
37 pids.reset(new pid_t[pids_size *= 2]);
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
38 returned_size = proc_listpids(PROC_ALL_PIDS, 0, pids.get(), pids_size * sizeof(pid_t));
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
39 if (returned_size == -1)
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
40 return false;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
41 } while ((pids_size * sizeof(size_t)) < returned_size);
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
42
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
43 for (int i = 0; i < pids_size; i++) {
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
44 std::string result;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
45 osx::util::GetProcessName(pids[i], result);
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
46 if (!process_proc({pids[i], result}))
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
47 return false;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
48 }
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
49
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
50 return true;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
51 }
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
52
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
53 bool EnumerateOpenFiles(const std::set<pid_t>& pids, open_file_proc_t open_file_proc) {
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
54 if (!open_file_proc)
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
55 return false;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
56
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
57 for (const auto& pid : pids) {
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
58 const int bufsz = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0);
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
59 if (bufsz < 0)
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
60 return false;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
61
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
62 const size_t info_len = bufsz / sizeof(struct proc_fdinfo);
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
63 if (info_len < 1)
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
64 return false;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
65
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
66 std::unique_ptr<struct proc_fdinfo[]> info(new struct proc_fdinfo[info_len]);
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
67 if (!info)
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
68 return false;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
69
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
70 proc_pidinfo(pid, PROC_PIDLISTFDS, 0, info.get(), bufsz);
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
71
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
72 for (size_t i = 0; i < info_len; i++) {
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
73 if (info[i].proc_fdtype == PROX_FDTYPE_VNODE) {
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
74 struct vnode_fdinfowithpath vnodeInfo;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
75
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
76 int sz = proc_pidfdinfo(pid, info[i].proc_fd, PROC_PIDFDVNODEPATHINFO, &vnodeInfo,
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
77 PROC_PIDFDVNODEPATHINFO_SIZE);
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
78 if (sz != PROC_PIDFDVNODEPATHINFO_SIZE)
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
79 return false;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
80
6
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
81 /* why would a media player open a file in write mode? */
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
82 if (vnodeInfo.pfi.fi_openflags & FWRITE)
f26b08274dcf dep/animone: filter open files by access mode
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
83 continue;
0
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
84
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
85 if (!open_file_proc({pid, vnodeInfo.pvip.vip_path}))
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
86 return false;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
87 }
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
88 }
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
89 }
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
90
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
91 return true;
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
92 }
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
93
a76fa32bdc92 *: HUUUGE changes
Paper <paper@paper.us.eu.org>
parents:
diff changeset
94 } // namespace animone::internal::xnu