comparison dep/animia/src/fd/bsd.cc @ 139:478f3b366199

dep/animia: separate lots of things, use base class for OS stuff
author Paper <mrpapersonic@gmail.com>
date Sun, 12 Nov 2023 16:43:07 -0500
parents 28842a8d0c6b
children 1e696863b54c
comparison
equal deleted inserted replaced
138:28842a8d0c6b 139:478f3b366199
1 /** 1 /**
2 * bsd.cpp 2 * fd/bsd.cpp
3 * - provides support for most* versions of BSD 3 * - this ONLY* supports OS X as of now
4 * - this also works for OS X :) 4 * (*there is some FreeBSD support code)
5 * more technical details: this is essentially a wrapper
6 * around the very C-like BSD system functions that are...
7 * kind of unnatural to use in modern C++.
8 **/ 5 **/
9 #include <fcntl.h> 6 #include <fcntl.h>
10 #include <iostream> 7 #include <iostream>
11 #include <string> 8 #include <string>
12 #include <sys/sysctl.h> 9 #include <sys/sysctl.h>
23 namespace animia::internal::unix { 20 namespace animia::internal::unix {
24 21
25 /* this is a cleaned up version of a function from... Apple? 22 /* this is a cleaned up version of a function from... Apple?
26 ...anyway, what it essentially does is gets the size and stuff from 23 ...anyway, what it essentially does is gets the size and stuff from
27 sysctl() and reserves the space in a vector to store the PIDs */ 24 sysctl() and reserves the space in a vector to store the PIDs */
28 bool GetAllPids(std::set<pid_t>& pids) { 25 bool UnixFdTools::GetAllPids(std::set<pid_t>& pids) {
29 struct kinfo_proc* result = NULL; 26 struct kinfo_proc* result = NULL;
30 size_t length = 0; 27 size_t length = 0;
31 static const int name[] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0}; 28 static const int name[] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
32 29
33 /* get appropriate length from sysctl() 30 /* get appropriate length from sysctl()
51 pids.reserve(length / sizeof(*result)); 48 pids.reserve(length / sizeof(*result));
52 for (int i = 0; i < length / sizeof(*result); i++) 49 for (int i = 0; i < length / sizeof(*result); i++)
53 pids.push_back(result[i].kp_proc.p_pid); 50 pids.push_back(result[i].kp_proc.p_pid);
54 } 51 }
55 52
56 bool GetProcessName(pid_t pid, std::string& result) { 53 bool UnixFdTools::GetProcessName(pid_t pid, std::string& result) {
57 #ifdef __FreeBSD__ 54 #ifdef __FreeBSD__
58 struct kinfo_proc* proc = kinfo_getproc(pid); 55 struct kinfo_proc* proc = kinfo_getproc(pid);
59 if (!proc) 56 if (!proc)
60 return false; 57 return false;
61 result = proc->ki_comm; 58 result = proc->ki_comm;
79 return true; 76 return true;
80 #endif 77 #endif
81 } 78 }
82 79
83 /* this only works on OS X :( */ 80 /* this only works on OS X :( */
84 bool EnumerateOpenFiles(const std::set<pid_t>& pids, std::vector<std::tuple<pid_t, std::string>>& files) { 81 bool UnixFdTools::EnumerateOpenFiles(const std::set<pid_t>& pids, std::vector<std::tuple<pid_t, std::string>>& files) {
85 for (const auto& pid : pids) { 82 for (const auto& pid : pids) {
86 int bufsz = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0); 83 int bufsz = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0);
87 if (bufsz == -1) 84 if (bufsz == -1)
88 return false; 85 return false;
89 86