summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorbakkeby <[email protected]>2020-09-11 17:21:38 +0200
committerbakkeby <[email protected]>2020-09-11 17:21:38 +0200
commitdc9e57a6b6e9495a53c65b9402593ab81ef510a7 (patch)
tree0faf7144ff36359e63dd9dd6ecc544c1728bb129
parent4a35cd2704678656f74c066816feb7e045720efb (diff)
downloaddwm-flexipatch-dc9e57a6b6e9495a53c65b9402593ab81ef510a7.tar.gz
dwm-flexipatch-dc9e57a6b6e9495a53c65b9402593ab81ef510a7.zip
swallow: upgrading to latest version with OpenBSD support
-rw-r--r--dwm.c4
-rw-r--r--patch/swallow.c45
2 files changed, 40 insertions, 9 deletions
diff --git a/dwm.c b/dwm.c
index d1bbfe9..194d46f 100644
--- a/dwm.c
+++ b/dwm.c
@@ -4394,7 +4394,11 @@ main(int argc, char *argv[])
#endif // COOL_AUTOSTART_PATCH
setup();
#ifdef __OpenBSD__
+ #if SWALLOW_PATCH
+ if (pledge("stdio rpath proc exec ps", NULL) == -1)
+ #else
if (pledge("stdio rpath proc exec", NULL) == -1)
+ #endif // SWALLOW_PATCH
die("pledge");
#endif /* __OpenBSD__ */
scan();
diff --git a/patch/swallow.c b/patch/swallow.c
index 30b213a..397c0e8 100644
--- a/patch/swallow.c
+++ b/patch/swallow.c
@@ -1,5 +1,9 @@
#include <X11/Xlib-xcb.h>
#include <xcb/res.h>
+#ifdef __OpenBSD__
+#include <sys/sysctl.h>
+#include <kvm.h>
+#endif /* __OpenBSD__ */
static int scanner;
static xcb_connection_t *xcon;
@@ -64,6 +68,7 @@ winpid(Window w)
{
pid_t result = 0;
+ #ifdef __linux__
xcb_res_client_id_spec_t spec = {0};
spec.client = w;
spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID;
@@ -89,6 +94,23 @@ winpid(Window w)
if (result == (pid_t)-1)
result = 0;
+
+ #endif /* __linux__ */
+ #ifdef __OpenBSD__
+ Atom type;
+ int format;
+ unsigned long len, bytes;
+ unsigned char *prop;
+ pid_t ret;
+
+ if (XGetWindowProperty(dpy, w, XInternAtom(dpy, "_NET_WM_PID", 1), 0, 1, False, AnyPropertyType, &type, &format, &len, &bytes, &prop) != Success || !prop)
+ return 0;
+
+ ret = *(pid_t*)prop;
+ XFree(prop);
+ result = ret;
+ #endif /* __OpenBSD__ */
+
return result;
}
@@ -97,7 +119,7 @@ getparentprocess(pid_t p)
{
unsigned int v = 0;
-#if defined(__linux__)
+#ifdef __linux__
FILE *f;
char buf[256];
snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p);
@@ -108,14 +130,19 @@ getparentprocess(pid_t p)
if (fscanf(f, "%*u %*s %*c %u", (unsigned *)&v) != 1)
v = (pid_t)0;
fclose(f);
-#elif defined(__FreeBSD__)
- struct kinfo_proc *proc = kinfo_getproc(p);
- if (!proc)
- return (pid_t)0;
-
- v = proc->ki_ppid;
- free(proc);
-#endif
+#endif /* __linux__ */
+#ifdef __OpenBSD__
+ int n;
+ kvm_t *kd;
+ struct kinfo_proc *kp;
+
+ kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, NULL);
+ if (!kd)
+ return 0;
+
+ kp = kvm_getprocs(kd, KERN_PROC_PID, p, sizeof(*kp), &n);
+ v = kp->p_ppid;
+#endif /* __OpenBSD__ */
return (pid_t)v;
}