aboutsummaryrefslogtreecommitdiff
path: root/devel/electron37/files/patch-base_process_process__handle__openbsd.cc
diff options
context:
space:
mode:
Diffstat (limited to 'devel/electron37/files/patch-base_process_process__handle__openbsd.cc')
-rw-r--r--devel/electron37/files/patch-base_process_process__handle__openbsd.cc138
1 files changed, 138 insertions, 0 deletions
diff --git a/devel/electron37/files/patch-base_process_process__handle__openbsd.cc b/devel/electron37/files/patch-base_process_process__handle__openbsd.cc
new file mode 100644
index 000000000000..4dfafb34d672
--- /dev/null
+++ b/devel/electron37/files/patch-base_process_process__handle__openbsd.cc
@@ -0,0 +1,138 @@
+--- base/process/process_handle_openbsd.cc.orig 2025-03-24 20:50:14 UTC
++++ base/process/process_handle_openbsd.cc
+@@ -3,17 +3,25 @@
+ // found in the LICENSE file.
+
+ #include "base/process/process_handle.h"
++#include "base/files/file_util.h"
+
+ #include <stddef.h>
++#include <stdlib.h>
++#include <sys/param.h>
++#include <sys/proc.h>
++#include <sys/stat.h>
+ #include <sys/sysctl.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+
++#include <kvm.h>
++
+ namespace base {
+
+ ProcessId GetParentProcessId(ProcessHandle process) {
+- struct kinfo_proc info;
++ struct kinfo_proc *info;
+ size_t length;
++ pid_t ppid;
+ int mib[] = {
+ CTL_KERN, KERN_PROC, KERN_PROC_PID, process, sizeof(struct kinfo_proc),
+ 0};
+@@ -22,37 +30,87 @@ ProcessId GetParentProcessId(ProcessHandle process) {
+ return -1;
+ }
+
+- mib[5] = (length / sizeof(struct kinfo_proc));
++ info = (struct kinfo_proc *)malloc(length);
+
+- if (sysctl(mib, std::size(mib), &info, &length, NULL, 0) < 0) {
+- return -1;
++ mib[5] = static_cast<int>((length / sizeof(struct kinfo_proc)));
++
++ if (sysctl(mib, std::size(mib), info, &length, NULL, 0) < 0) {
++ ppid = -1;
++ goto out;
+ }
+
+- return info.p_ppid;
++ ppid = info->p_ppid;
++
++out:
++ free(info);
++ return ppid;
+ }
+
+ FilePath GetProcessExecutablePath(ProcessHandle process) {
+- struct kinfo_proc kp;
++ struct kinfo_file *files;
++ kvm_t *kd = NULL;
++ char errbuf[_POSIX2_LINE_MAX];
++ char **retvalargs, *cpath, retval[PATH_MAX];
++ int cnt;
+ size_t len;
+- int mib[] = {
+- CTL_KERN, KERN_PROC, KERN_PROC_PID, process, sizeof(struct kinfo_proc),
+- 0};
++ char *tokens[2];
++ struct stat sb;
++ FilePath result;
+
+- if (sysctl(mib, std::size(mib), NULL, &len, NULL, 0) == -1) {
+- return FilePath();
++ int mib[] = { CTL_KERN, KERN_PROC_ARGS, process, KERN_PROC_ARGV };
++
++ if ((cpath = getenv("CHROME_EXE_PATH")) != NULL)
++ result = FilePath(cpath);
++ else
++ result = FilePath("/usr/local/chrome/chrome");
++
++ if (sysctl(mib, std::size(mib), NULL, &len, NULL, 0) != -1) {
++ retvalargs = static_cast<char**>(malloc(len));
++ if (!retvalargs)
++ return result;
++
++ if (sysctl(mib, std::size(mib), retvalargs, &len, NULL, 0) < 0) {
++ free(retvalargs);
++ return result;
++ }
++
++ if ((*tokens = strtok(retvalargs[0], ":")) == NULL) {
++ free(retvalargs);
++ return result;
++ }
++
++ free(retvalargs);
++
++ if (tokens[0] == NULL)
++ return result;
++
++ if (realpath(tokens[0], retval) == NULL)
++ return result;
++
++ if (stat(retval, &sb) < 0)
++ return result;
++
++ if ((kd = kvm_openfiles(NULL, NULL, NULL, (int)KVM_NO_FILES,
++ errbuf)) == NULL)
++ return result;
++
++ if ((files = kvm_getfiles(kd, KERN_FILE_BYPID, process,
++ sizeof(struct kinfo_file), &cnt)) == NULL) {
++ kvm_close(kd);
++ return result;
++ }
++
++ for (int i = 0; i < cnt; i++) {
++ if (files[i].fd_fd == KERN_FILE_TEXT &&
++ files[i].va_fsid == static_cast<uint32_t>(sb.st_dev) &&
++ files[i].va_fileid == sb.st_ino) {
++ kvm_close(kd);
++ result = FilePath(retval);
++ }
++ }
+ }
+- mib[5] = (len / sizeof(struct kinfo_proc));
+- if (sysctl(mib, std::size(mib), &kp, &len, NULL, 0) < 0) {
+- return FilePath();
+- }
+- if ((kp.p_flag & P_SYSTEM) != 0) {
+- return FilePath();
+- }
+- if (strcmp(kp.p_comm, "chrome") == 0) {
+- return FilePath(kp.p_comm);
+- }
+
+- return FilePath();
++ return result;
+ }
+
+ } // namespace base