summaryrefslogtreecommitdiff
path: root/x11/waycheck/files/patch-src_window.cpp
blob: 6e976a9c5ffb300cfabe1f9e321b3dfcf5dee0d9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
--- src/window.cpp.orig	2025-06-27 19:43:51 UTC
+++ src/window.cpp
@@ -13,7 +13,24 @@
 #include <unistd.h>
 #include <wayland-client-protocol.h>
 
+#if defined(__FreeBSD__)
+#include <sys/types.h>
+#include <sys/ucred.h>
+#include <sys/un.h>
+#include <sys/user.h>
+#include <libutil.h>
+#endif
+
 static pid_t pid_from_fd(const int fd) {
+#if defined(__FreeBSD__)
+    xucred cred{};
+    socklen_t len = sizeof(struct xucred);
+    if (getsockopt(fd, SOL_LOCAL, LOCAL_PEERCRED, &cred, &len) == -1) {
+        perror("getsockopt failed");
+        exit(1);
+    }
+    return cred.cr_pid;
+#else
     ucred cred{};
     socklen_t len = sizeof(struct ucred);
     if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cred, &len) == -1) {
@@ -21,9 +38,19 @@ static pid_t pid_from_fd(const int fd) {
         exit(1);
     }
     return cred.pid;
+#endif
 }
 
 static std::string process_name_from_pid(const pid_t pid) {
+#if defined(__FreeBSD__)
+    struct kinfo_proc *proc = kinfo_getproc(pid);
+
+    if (proc) {
+        std::string out = proc->ki_comm;
+        free(proc);
+        return out;
+    }
+#else
     const std::string procpath = QString::asprintf("/proc/%d/comm", pid).toStdString();
 
     std::ifstream infile(procpath);
@@ -38,7 +65,7 @@ static std::string process_name_from_pid(const pid_t p
         // running in a flatpak or a snap, most likely
         return "Unknown (Sandboxed)";
     }
-
+#endif
     return "Unknown";
 }