Since we do not provide KERN_PROC_PATHNAME I picked up robets@'s "hack"
form www/chromium/patches/patch-base_base_paths_posix_cc.

It certainly won't work in all cases, but it's enough for me in this context.
This implementation only makes sense if we don't call it too often.

Is KERN_PROC_PATHNAME something we generally don't want? Or was it
simply not implied?

Rafael

Index: kwin/Makefile
===================================================================
RCS file: /cvs/ports/x11/kde-plasma/kwin/Makefile,v
diff -u -p -r1.41 Makefile
--- kwin/Makefile       4 Jan 2026 09:12:01 -0000       1.41
+++ kwin/Makefile       4 Jan 2026 11:55:27 -0000
@@ -1,6 +1,6 @@
 COMMENT =              Wayland window manager for KDE Plasma Desktops
 DISTNAME =             kwin-${VERSION}
-REVISION =             2
+REVISION =             3
 
 SHARED_LIBS +=  kcmkwincommon             1.0 # 0.0
 SHARED_LIBS +=  kwin                      1.0 # 0.0
Index: kwin/patches/patch-src_utils_executable_path_sysctl_cpp
===================================================================
RCS file: 
/cvs/ports/x11/kde-plasma/kwin/patches/patch-src_utils_executable_path_sysctl_cpp,v
diff -u -p -r1.1 patch-src_utils_executable_path_sysctl_cpp
--- kwin/patches/patch-src_utils_executable_path_sysctl_cpp     4 Jan 2026 
08:03:42 -0000       1.1
+++ kwin/patches/patch-src_utils_executable_path_sysctl_cpp     4 Jan 2026 
11:55:27 -0000
@@ -2,11 +2,103 @@ https://invent.kde.org/plasma/kwin/-/mer
 Index: src/utils/executable_path_sysctl.cpp
 --- src/utils/executable_path_sysctl.cpp.orig
 +++ src/utils/executable_path_sysctl.cpp
-@@ -12,11 +12,13 @@
+@@ -7,16 +7,105 @@
+ #include <sys/param.h>
+ #include <sys/sysctl.h>
+ #include <sys/types.h>
++#if defined(__OpenBSD__)
++#include <QDebug>
+ 
++#include <kvm.h>
++#include <limits.h>
++#include <stdlib.h>
++#include <string.h>
++#include <sys/stat.h>
++#include <unistd.h>
++#endif
++
+ #include "executable_path.h"
  
  QString executablePathFromPid(pid_t pid)
  {
-+#if !defined(__OpenBSD__)
++#if defined(__OpenBSD__)
++    char resolved_path[PATH_MAX];
++
++    char errbuf[_POSIX2_LINE_MAX];
++    kvm_t *kd = NULL;
++    struct kinfo_proc *proc = NULL;
++    char **argv_proc = NULL;
++
++    auto cleanup = [&](QString const &sErr) {
++        if (kd != NULL) {
++            kvm_close(kd);
++        }
++        qWarning() << sErr;
++        return QString();
++    };
++    // Try to resolve path from argv[0] by searching in PATH
++    auto search_path = [](const char *argv0, char *buf, size_t bufsize) {
++        char *path_env;
++        char *path;
++        char *dir;
++        char testpath[PATH_MAX];
++        struct stat sb;
++
++        if (strchr(argv0, '/') != NULL) {
++            return realpath(argv0, buf) ? 0 : -1;
++        }
++
++        // Search in PATH
++        path_env = getenv("PATH");
++        if (path_env == NULL) {
++            return -1;
++        }
++
++        path = strdup(path_env);
++        if (path == NULL) {
++            return -1;
++        }
++
++        dir = strtok(path, ":");
++        while (dir != NULL) {
++            snprintf(testpath, sizeof(testpath), "%s/%s", dir, argv0);
++            if (stat(testpath, &sb) == 0 && (sb.st_mode & S_IXUSR)) {
++                char *result = realpath(testpath, buf);
++                if (result != NULL && strlen(result) < bufsize) {
++                    free(path);
++                    return 0;
++                }
++            }
++            dir = strtok(NULL, ":");
++        }
++
++        free(path);
++        return -1;
++    };
++
++    kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, errbuf);
++    if (kd == NULL) {
++        return cleanup("kvm_openfiles failed: " + 
QString::fromLocal8Bit(errbuf));
++    }
++
++    int cnt;
++    proc = kvm_getprocs(kd, KERN_PROC_PID, pid, sizeof(struct kinfo_proc), 
&cnt);
++    if (proc == NULL || cnt == 0) {
++        return cleanup("Process with PID: " + 
QString::number(static_cast<int>(pid)) + " not found");
++    }
++
++    argv_proc = kvm_getargv(kd, proc, 0);
++    if (argv_proc == NULL || argv_proc[0] == NULL) {
++        return cleanup("Could not get argv for PID: " + 
QString::number(static_cast<int>(pid)));
++    }
++
++    // Try to resolve via PATH or direct path
++    if (search_path(argv_proc[0], resolved_path, sizeof(resolved_path)) == 0) 
{
++        return QString::fromLocal8Bit(resolved_path);
++    } else {
++        return cleanup("Could not resolve path for: " + 
QString::fromLocal8Bit(argv_proc[0]));
++    }
++#else
      const int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, 
static_cast<int>(pid)};
      char buf[MAXPATHLEN];
      size_t cb = sizeof(buf);
Index: kwin-x11/Makefile
===================================================================
RCS file: /cvs/ports/x11/kde-plasma/kwin-x11/Makefile,v
diff -u -p -r1.9 Makefile
--- kwin-x11/Makefile   4 Jan 2026 09:17:00 -0000       1.9
+++ kwin-x11/Makefile   4 Jan 2026 11:55:27 -0000
@@ -1,6 +1,6 @@
 COMMENT =              X11 window manager for KDE Plasma Desktops
 DISTNAME =             kwin-x11-${VERSION}
-REVISION =             2
+REVISION =             3
 
 SHARED_LIBS +=  kcmkwincommon-x11         0.0 # 0.0
 SHARED_LIBS +=  kwin-x11                  0.0 # 0.0
Index: kwin-x11/patches/patch-src_utils_executable_path_sysctl_cpp
===================================================================
RCS file: 
/cvs/ports/x11/kde-plasma/kwin-x11/patches/patch-src_utils_executable_path_sysctl_cpp,v
diff -u -p -r1.1 patch-src_utils_executable_path_sysctl_cpp
--- kwin-x11/patches/patch-src_utils_executable_path_sysctl_cpp 4 Jan 2026 
08:58:17 -0000       1.1
+++ kwin-x11/patches/patch-src_utils_executable_path_sysctl_cpp 4 Jan 2026 
11:55:27 -0000
@@ -2,11 +2,103 @@ https://invent.kde.org/plasma/kwin/-/mer
 Index: src/utils/executable_path_sysctl.cpp
 --- src/utils/executable_path_sysctl.cpp.orig
 +++ src/utils/executable_path_sysctl.cpp
-@@ -12,11 +12,13 @@
+@@ -7,16 +7,105 @@
+ #include <sys/param.h>
+ #include <sys/sysctl.h>
+ #include <sys/types.h>
++#if defined(__OpenBSD__)
++#include <QDebug>
+ 
++#include <kvm.h>
++#include <limits.h>
++#include <stdlib.h>
++#include <string.h>
++#include <sys/stat.h>
++#include <unistd.h>
++#endif
++
+ #include "executable_path.h"
  
  QString executablePathFromPid(pid_t pid)
  {
-+#if !defined(__OpenBSD__)
++#if defined(__OpenBSD__)
++    char resolved_path[PATH_MAX];
++
++    char errbuf[_POSIX2_LINE_MAX];
++    kvm_t *kd = NULL;
++    struct kinfo_proc *proc = NULL;
++    char **argv_proc = NULL;
++
++    auto cleanup = [&](QString const &sErr) {
++        if (kd != NULL) {
++            kvm_close(kd);
++        }
++        qWarning() << sErr;
++        return QString();
++    };
++    // Try to resolve path from argv[0] by searching in PATH
++    auto search_path = [](const char *argv0, char *buf, size_t bufsize) {
++        char *path_env;
++        char *path;
++        char *dir;
++        char testpath[PATH_MAX];
++        struct stat sb;
++
++        if (strchr(argv0, '/') != NULL) {
++            return realpath(argv0, buf) ? 0 : -1;
++        }
++
++        // Search in PATH
++        path_env = getenv("PATH");
++        if (path_env == NULL) {
++            return -1;
++        }
++
++        path = strdup(path_env);
++        if (path == NULL) {
++            return -1;
++        }
++
++        dir = strtok(path, ":");
++        while (dir != NULL) {
++            snprintf(testpath, sizeof(testpath), "%s/%s", dir, argv0);
++            if (stat(testpath, &sb) == 0 && (sb.st_mode & S_IXUSR)) {
++                char *result = realpath(testpath, buf);
++                if (result != NULL && strlen(result) < bufsize) {
++                    free(path);
++                    return 0;
++                }
++            }
++            dir = strtok(NULL, ":");
++        }
++
++        free(path);
++        return -1;
++    };
++
++    kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, errbuf);
++    if (kd == NULL) {
++        return cleanup("kvm_openfiles failed: " + 
QString::fromLocal8Bit(errbuf));
++    }
++
++    int cnt;
++    proc = kvm_getprocs(kd, KERN_PROC_PID, pid, sizeof(struct kinfo_proc), 
&cnt);
++    if (proc == NULL || cnt == 0) {
++        return cleanup("Process with PID: " + 
QString::number(static_cast<int>(pid)) + " not found");
++    }
++
++    argv_proc = kvm_getargv(kd, proc, 0);
++    if (argv_proc == NULL || argv_proc[0] == NULL) {
++        return cleanup("Could not get argv for PID: " + 
QString::number(static_cast<int>(pid)));
++    }
++
++    // Try to resolve via PATH or direct path
++    if (search_path(argv_proc[0], resolved_path, sizeof(resolved_path)) == 0) 
{
++        return QString::fromLocal8Bit(resolved_path);
++    } else {
++        return cleanup("Could not resolve path for: " + 
QString::fromLocal8Bit(argv_proc[0]));
++    }
++#else
      const int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, 
static_cast<int>(pid)};
      char buf[MAXPATHLEN];
      size_t cb = sizeof(buf);

Reply via email to