Mercurial > minori
comparison dep/animia/src/bsd.cpp @ 97:18979b066284
animia/unix: fix a bunch of stuff that breaks OS X things
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Thu, 02 Nov 2023 13:14:15 -0400 |
parents | c912128af0eb |
children | f5940a575d83 |
comparison
equal
deleted
inserted
replaced
96:bd68e4393e6f | 97:18979b066284 |
---|---|
4 * - this also works for OS X :) | 4 * - this also works for OS X :) |
5 * more technical details: this is essentially a wrapper | 5 * more technical details: this is essentially a wrapper |
6 * around the very C-like BSD system functions that are... | 6 * around the very C-like BSD system functions that are... |
7 * kind of unnatural to use in modern C++. | 7 * kind of unnatural to use in modern C++. |
8 **/ | 8 **/ |
9 #include "bsd.h" | |
10 #include "os.h" | |
9 #include <assert.h> | 11 #include <assert.h> |
10 #include <fcntl.h> | 12 #include <fcntl.h> |
11 #include <iostream> | 13 #include <iostream> |
12 #include <string> | 14 #include <string> |
13 #include <sys/sysctl.h> | 15 #include <sys/sysctl.h> |
54 ret.push_back(result[i].kp_proc.p_pid); | 56 ret.push_back(result[i].kp_proc.p_pid); |
55 | 57 |
56 return ret; | 58 return ret; |
57 } | 59 } |
58 | 60 |
59 std::string get_process_name(int pid) { | 61 std::string get_process_name(const int pid) { |
60 std::string ret; | 62 std::string ret; |
61 #ifdef __FreeBSD__ | 63 #ifdef __FreeBSD__ |
62 struct kinfo_proc* proc = kinfo_getproc(pid); | 64 struct kinfo_proc* proc = kinfo_getproc(pid); |
63 if (!proc) | 65 if (!proc) |
64 return ""; | 66 return ""; |
73 ret = proc.pbi_comm; | 75 ret = proc.pbi_comm; |
74 #endif | 76 #endif |
75 return ret; | 77 return ret; |
76 } | 78 } |
77 | 79 |
78 std::vector<std::string> get_open_files(int pid) { | 80 std::vector<std::string> get_open_files(const int pid) { |
79 /* note: this is OS X only right now. eventually, I'll find a way | 81 /* note: this is OS X only right now. eventually, I'll find a way |
80 to do this in FreeBSD, OpenBSD and the like */ | 82 to do this in FreeBSD, OpenBSD and the like */ |
81 std::vector<std::string> ret; | 83 std::vector<std::string> ret; |
82 | 84 |
83 if (pid == 0) | 85 if (pid == 0) |
101 | 103 |
102 int sz = proc_pidfdinfo(pid, info[i].proc_fd, PROC_PIDFDVNODEPATHINFO, &vnodeInfo, PROC_PIDFDVNODEPATHINFO_SIZE); | 104 int sz = proc_pidfdinfo(pid, info[i].proc_fd, PROC_PIDFDVNODEPATHINFO, &vnodeInfo, PROC_PIDFDVNODEPATHINFO_SIZE); |
103 if (sz != PROC_PIDFDVNODEPATHINFO_SIZE) | 105 if (sz != PROC_PIDFDVNODEPATHINFO_SIZE) |
104 continue; | 106 continue; |
105 | 107 |
106 if (vnodeInfo.pfi.fi_openflags & O_WRONLY || vnodeInfo.pfi.fi_openflags & O_RDWR) | 108 /* I *think* this is correct. For some reason, with VLC on macOS this thinks files are read/write, |
109 which is totally unnecessary and even harmful. */ | |
110 if ((vnodeInfo.pfi.fi_status & O_ACCMODE) == O_WRONLY) | |
107 continue; | 111 continue; |
108 | 112 |
109 ret.push_back(vnodeInfo.pvip.vip_path); | 113 ret.push_back(vnodeInfo.pvip.vip_path); |
110 } | 114 } |
111 } | 115 } |
112 return ret; | 116 return ret; |
113 } | 117 } |
118 | |
119 std::vector<std::string> filter_system_files(const std::vector<std::string>& in) { | |
120 #ifdef ON_OSX | |
121 std::vector<std::string> ret; | |
122 for (const auto& str : in) | |
123 /* these are some places nobody would ever want to store media files. */ | |
124 if (str.find("/Library") && str.find("/System") && str.find("/Applications") && | |
125 str.find("/dev") && str.find("/private")) | |
126 ret.push_back(str); | |
127 return ret; | |
128 #else | |
129 return in; | |
130 #endif | |
131 } | |
132 | |
114 | 133 |
115 std::unordered_map<int, std::vector<std::string>> get_all_open_files() { | 134 std::unordered_map<int, std::vector<std::string>> get_all_open_files() { |
116 std::unordered_map<int, std::vector<std::string>> map; | 135 std::unordered_map<int, std::vector<std::string>> map; |
117 std::vector<int> pids = get_all_pids(); | 136 std::vector<int> pids = get_all_pids(); |
118 for (int i : pids) { | 137 for (int i : pids) { |