annotate src/fd/netbsd.cc @ 30:a76e55e098d1

util: rewrite functions in C-ish there are C++ bindings still put in place. the code should be valid C, except for the use of <regex>, which ought to go anyway. eventually I'll actually *test* this stuff aside from the TrimRight crap
author Paper <paper@tflc.us>
date Sun, 09 Feb 2025 23:18:57 -0500
parents bc22d57076e3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
1 /*
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
2 * fd/netbsd.cc: support for NetBSD
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
3 *
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
4 * as with OpenBSD, completely untested
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
5 */
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
6 #include "animone/fd/bsd.h"
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
7 #include "animone.h"
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
8 #include "animone/fd.h"
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
9
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
10 #include <sys/file.h>
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
11 #include <sys/filedesc.h>
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
12 #include <sys/param.h>
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
13 #include <sys/queue.h>
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
14 #include <sys/sysctl.h>
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
15 #include <sys/types.h>
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
16 #include <sys/user.h>
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
17 #include <sys/vnode.h>
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
18
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
19 #include <string>
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
20
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
21 namespace animone::internal::netbsd {
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
22
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
23 static std::string Basename(const std::string& name) {
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
24 size_t s = name.find_last_of('/');
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
25
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
26 if (s == std::string::npos)
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
27 return name;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
28
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
29 return name.substr(s, name.size());
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
30 }
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
31
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
32 bool GetProcessName(pid_t pid, std::string& name) {
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
33 static const int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
34
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
35 struct kinfo_proc result;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
36
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
37 size_t length = 1;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
38 if (sysctl((int*)mib, (sizeof(mib) / sizeof(*mib)) - 1, &result, &length, NULL, 0) == -1)
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
39 return false;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
40
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
41 name = Basename(result.ki_comm);
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
42
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
43 return true;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
44 }
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
45
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
46 bool EnumerateOpenProcesses(process_proc_t process_proc) {
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
47 static const int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
48 size_t length = 0;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
49
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
50 sysctl((int*)mib, (sizeof(mib) / sizeof(*mib)) - 1, NULL, &length, NULL, 0);
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
51
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
52 std::unique_ptr<struct kinfo_proc[]> result;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
53 result.reset(new struct kinfo_proc[length]);
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
54
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
55 if (!result.get())
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
56 return false;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
57
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
58 /* actually get our results */
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
59 if (sysctl((const int*)mib, (sizeof(mib) / sizeof(*mib)) - 1, result.get(), &length, NULL, 0) == ENOMEM)
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
60 return false;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
61
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
62 if (length < sizeof(struct kinfo_proc))
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
63 return false;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
64
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
65 for (int i = 0; i < length / sizeof(result[0]); i++)
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
66 if (!process_proc({.platform = ExecutablePlatform::Posix, .pid = result[i].ki_pid, .comm = result[i].ki_comm}))
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
67 return false;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
68
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
69 return true;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
70 }
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
71
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
72 bool EnumerateOpenFiles(const std::set<pid_t>& pids, open_file_proc_t open_file_proc) {
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
73 /* I don't think NetBSD actually provides a real API for this. */
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
74 return false;
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
75 }
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
76
bc22d57076e3 dep/animone: separate *BSD into separate files
Paper <paper@paper.us.eu.org>
parents:
diff changeset
77 } // namespace animone::internal::netbsd