Mercurial > libanimone
comparison src/fd/xnu.cc @ 6:f26b08274dcf
dep/animone: filter open files by access mode
| author | Paper <paper@paper.us.eu.org> |
|---|---|
| date | Fri, 12 Apr 2024 19:13:50 -0400 |
| parents | a76fa32bdc92 |
| children | efbb8316395f |
comparison
equal
deleted
inserted
replaced
| 5:6d6d2b51517b | 6:f26b08274dcf |
|---|---|
| 11 #include <fcntl.h> | 11 #include <fcntl.h> |
| 12 #include <libproc.h> | 12 #include <libproc.h> |
| 13 #include <sys/sysctl.h> | 13 #include <sys/sysctl.h> |
| 14 #include <sys/types.h> | 14 #include <sys/types.h> |
| 15 #include <sys/user.h> | 15 #include <sys/user.h> |
| 16 | |
| 17 /* you may be asking: WTF is FWRITE? | |
| 18 * well, from bsd/sys/fcntl.h in the XNU kernel: | |
| 19 * | |
| 20 * Kernel encoding of open mode; separate read and write bits that are | |
| 21 * independently testable: 1 greater than [O_RDONLY and O_WRONLY]. | |
| 22 * | |
| 23 * It's just how the kernel defines write mode. | |
| 24 */ | |
| 25 #ifndef FWRITE | |
| 26 #define FWRITE 0x0002 | |
| 27 #endif | |
| 16 | 28 |
| 17 namespace animone::internal::xnu { | 29 namespace animone::internal::xnu { |
| 18 | 30 |
| 19 bool EnumerateOpenProcesses(process_proc_t process_proc) { | 31 bool EnumerateOpenProcesses(process_proc_t process_proc) { |
| 20 size_t pids_size = 256; | 32 size_t pids_size = 256; |
| 64 int sz = proc_pidfdinfo(pid, info[i].proc_fd, PROC_PIDFDVNODEPATHINFO, &vnodeInfo, | 76 int sz = proc_pidfdinfo(pid, info[i].proc_fd, PROC_PIDFDVNODEPATHINFO, &vnodeInfo, |
| 65 PROC_PIDFDVNODEPATHINFO_SIZE); | 77 PROC_PIDFDVNODEPATHINFO_SIZE); |
| 66 if (sz != PROC_PIDFDVNODEPATHINFO_SIZE) | 78 if (sz != PROC_PIDFDVNODEPATHINFO_SIZE) |
| 67 return false; | 79 return false; |
| 68 | 80 |
| 69 // This doesn't work (for unknown reasons). I assume somethings fucked up with | 81 /* why would a media player open a file in write mode? */ |
| 70 // my assumptions; I don't care enough to look into it tbh | 82 if (vnodeInfo.pfi.fi_openflags & FWRITE) |
| 71 // | 83 continue; |
| 72 // if (vnodeInfo.pfi.fi_openflags & O_WRONLY || vnodeInfo.pfi.fi_openflags & O_RDWR) | |
| 73 // continue; | |
| 74 | 84 |
| 75 if (!open_file_proc({pid, vnodeInfo.pvip.vip_path})) | 85 if (!open_file_proc({pid, vnodeInfo.pvip.vip_path})) |
| 76 return false; | 86 return false; |
| 77 } | 87 } |
| 78 } | 88 } |
