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 #include +#ifdef __OpenBSD__ +#include +#include +#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; +#endif /* __linux__ */ +#ifdef __OpenBSD__ + int n; + kvm_t *kd; + struct kinfo_proc *kp; - v = proc->ki_ppid; - free(proc); -#endif + 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; }