annotate dep/animia/src/bsd.cpp @ 118:39521c47c7a3

*: another huge megacommit, SORRY The torrents page works a lot better now Added the edit option to the anime list right click menu Vectorized currently playing files Available player and extensions are now loaded at runtime from files in (dotpath)/players.json and (dotpath)/extensions.json These paths are not permanent and will likely be moved to (dotpath)/recognition ... ... ...
author Paper <mrpapersonic@gmail.com>
date Tue, 07 Nov 2023 23:40:54 -0500
parents f5940a575d83
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1 /**
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
2 * bsd.cpp
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
3 * - provides support for most* versions of BSD
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
4 * - this also works for OS X :)
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
5 * more technical details: this is essentially a wrapper
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
6 * around the very C-like BSD system functions that are...
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
7 * kind of unnatural to use in modern C++.
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
8 **/
97
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
9 #include "bsd.h"
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
10 #include "os.h"
86
c912128af0eb *: various macos fixes
Paper <mrpapersonic@gmail.com>
parents: 84
diff changeset
11 #include <assert.h>
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
12 #include <fcntl.h>
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
13 #include <iostream>
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
14 #include <string>
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
15 #include <sys/sysctl.h>
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
16 #include <sys/types.h>
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
17 #include <sys/user.h>
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
18 #include <unordered_map>
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
19 #include <vector>
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
20 #ifdef __FreeBSD__
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
21 # include <libutil.h>
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
22 #elif defined(__APPLE__)
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
23 # include <libproc.h>
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
24 #endif
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
25
84
eab9e623eb84 dep/animia: update from upstream
Paper <mrpapersonic@gmail.com>
parents: 78
diff changeset
26 namespace Animia { namespace Unix {
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
27
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
28 /* this is a cleaned up version of a function from... Apple?
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
29 ...anyway, what it essentially does is gets the size and stuff from
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
30 sysctl() and reserves the space in a vector to store the PIDs */
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
31 std::vector<int> get_all_pids() {
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
32 std::vector<int> ret;
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
33 struct kinfo_proc* result = NULL;
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
34 size_t length = 0;
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
35 static const int name[] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
36
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
37 /* get appropriate length from sysctl()
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
38 note: the reason this isn't checked is actually because this will
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
39 *always* return an error on OS X (or... maybe I'm doing it wrong :) ) */
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
40 sysctl((int*)name, (sizeof(name) / sizeof(*name)) - 1, NULL, &length, NULL, 0);
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
41
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
42 result = (struct kinfo_proc*)malloc(length);
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
43 if (result == NULL)
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
44 return std::vector<int>();
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
45
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
46 /* actually get our results */
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
47 if (sysctl((int*)name, (sizeof(name) / sizeof(*name)) - 1, result, &length, NULL, 0) == ENOMEM) {
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
48 assert(result != NULL);
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
49 free(result);
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
50 throw std::bad_alloc();
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
51 }
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
52
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
53 /* add pids to our vector */
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
54 ret.reserve(length / sizeof(*result));
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
55 for (int i = 0; i < length / sizeof(*result); i++)
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
56 ret.push_back(result[i].kp_proc.p_pid);
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
57
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
58 return ret;
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
59 }
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
60
97
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
61 std::string get_process_name(const int pid) {
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
62 std::string ret;
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
63 #ifdef __FreeBSD__
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
64 struct kinfo_proc* proc = kinfo_getproc(pid);
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
65 if (!proc)
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
66 return "";
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
67 ret = proc->ki_comm;
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
68 free(proc);
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
69 #elif defined(__APPLE__)
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
70 struct proc_bsdinfo proc;
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
71
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
72 int st = proc_pidinfo(pid, PROC_PIDTBSDINFO, 0, &proc, PROC_PIDTBSDINFO_SIZE);
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
73 if (st != PROC_PIDTBSDINFO_SIZE)
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
74 return "";
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
75 ret = proc.pbi_comm;
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
76 #endif
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
77 return ret;
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
78 }
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
79
97
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
80 std::vector<std::string> get_open_files(const int pid) {
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
81 /* note: this is OS X only right now. eventually, I'll find a way
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
82 to do this in FreeBSD, OpenBSD and the like */
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
83 std::vector<std::string> ret;
78
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
84
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
85 if (pid == 0)
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
86 return ret;
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
87
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
88 int bufsz = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0);
78
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
89 if (bufsz == -1)
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
90 return ret;
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
91
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
92 struct proc_fdinfo* info = (struct proc_fdinfo*)malloc(bufsz);
78
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
93 if (!info)
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
94 return ret;
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
95
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
96 proc_pidinfo(pid, PROC_PIDLISTFDS, 0, info, bufsz);
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
97
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
98 // iterate over stuff
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
99 ret.reserve(bufsz / sizeof(info[0]));
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
100 for (int i = 0; i < bufsz / sizeof(info[0]); i++) {
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
101 if (info[i].proc_fdtype == PROX_FDTYPE_VNODE) {
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
102 struct vnode_fdinfowithpath vnodeInfo;
78
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
103
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
104 int sz = proc_pidfdinfo(pid, info[i].proc_fd, PROC_PIDFDVNODEPATHINFO, &vnodeInfo, PROC_PIDFDVNODEPATHINFO_SIZE);
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
105 if (sz != PROC_PIDFDVNODEPATHINFO_SIZE)
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
106 continue;
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
107
100
f5940a575d83 track/constants: add many more video formats
Paper <mrpapersonic@gmail.com>
parents: 97
diff changeset
108 /* I'm 99.9% sure this is incorrect. We can't pick up QuickTime files with this :(
f5940a575d83 track/constants: add many more video formats
Paper <mrpapersonic@gmail.com>
parents: 97
diff changeset
109
f5940a575d83 track/constants: add many more video formats
Paper <mrpapersonic@gmail.com>
parents: 97
diff changeset
110 Actually, we can't pick up QuickTime files regardless. WTF? */
97
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
111 if ((vnodeInfo.pfi.fi_status & O_ACCMODE) == O_WRONLY)
78
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
112 continue;
1ce00c1c8ddc dep/animia: update to upstream
Paper <mrpapersonic@gmail.com>
parents: 62
diff changeset
113
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
114 ret.push_back(vnodeInfo.pvip.vip_path);
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
115 }
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
116 }
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
117 return ret;
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
118 }
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
119
97
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
120 std::vector<std::string> filter_system_files(const std::vector<std::string>& in) {
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
121 #ifdef ON_OSX
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
122 std::vector<std::string> ret;
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
123 for (const auto& str : in)
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
124 /* these are some places nobody would ever want to store media files. */
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
125 if (str.find("/Library") && str.find("/System") && str.find("/Applications") &&
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
126 str.find("/dev") && str.find("/private"))
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
127 ret.push_back(str);
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
128 return ret;
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
129 #else
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
130 return in;
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
131 #endif
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
132 }
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
133
18979b066284 animia/unix: fix a bunch of stuff that breaks OS X things
Paper <mrpapersonic@gmail.com>
parents: 86
diff changeset
134
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
135 std::unordered_map<int, std::vector<std::string>> get_all_open_files() {
62
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
136 std::unordered_map<int, std::vector<std::string>> map;
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
137 std::vector<int> pids = get_all_pids();
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
138 for (int i : pids) {
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
139 map[i] = get_open_files(i);
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
140 }
4c6dd5999b39 *: update
Paper <mrpapersonic@gmail.com>
parents: 56
diff changeset
141 return map;
56
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
142 }
6ff7aabeb9d7 deps: add animia for open files detection
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
143
84
eab9e623eb84 dep/animia: update from upstream
Paper <mrpapersonic@gmail.com>
parents: 78
diff changeset
144 } // namespace Unix
eab9e623eb84 dep/animia: update from upstream
Paper <mrpapersonic@gmail.com>
parents: 78
diff changeset
145 } // namespace Animia