$OpenBSD: patch-base_debug_debugger_posix_cc,v 1.1 2011/02/08 09:43:02 espie Exp $
--- base/debug/debugger_posix.cc.orig	Fri Jan 14 11:56:03 2011
+++ base/debug/debugger_posix.cc	Wed Jan 26 09:41:38 2011
@@ -9,8 +9,12 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/stat.h>
+#if defined(__OpenBSD__)
+#include <sys/param.h>
+#endif
 #include <sys/sysctl.h>
 #include <sys/types.h>
+#include <sys/user.h>
 #include <unistd.h>
 
 #include <string>
@@ -47,7 +51,7 @@ bool SpawnDebuggerOnProcess(unsigned /* process_id */)
   return false;
 }
 
-#if defined(OS_MACOSX)
+#if defined(OS_MACOSX) || defined(OS_OPENBSD)
 
 // Based on Apple's recommended method as described in
 // http://developer.apple.com/qa/qa2004/qa1361.html
@@ -65,15 +69,28 @@ bool BeingDebugged() {
   // we're looking for information about a specific process ID.
   int mib[] = {
     CTL_KERN,
+#if defined(OS_OPENBSD)
+    KERN_PROC2,
+#else
     KERN_PROC,
+#endif
     KERN_PROC_PID,
     getpid()
+#if defined(OS_OPENBSD)
+    , sizeof(struct kinfo_proc2),
+    400 /* XXX */
+#endif
   };
 
   // Caution: struct kinfo_proc is marked __APPLE_API_UNSTABLE.  The source and
   // binary interfaces may change.
+#if defined(OS_OPENBSD)
+  struct kinfo_proc2 info;
+  size_t info_size = sizeof(info);
+#else
   struct kinfo_proc info;
   size_t info_size = sizeof(info);
+#endif
 
   int sysctl_result = sysctl(mib, arraysize(mib), &info, &info_size, NULL, 0);
   DCHECK_EQ(sysctl_result, 0);
@@ -85,12 +102,38 @@ bool BeingDebugged() {
 
   // This process is being debugged if the P_TRACED flag is set.
   is_set = true;
+#if defined(OS_OPENBSD)
+  being_debugged = (info.p_flag & P_TRACED) != 0;
+#else
   being_debugged = (info.kp_proc.p_flag & P_TRACED) != 0;
+#endif
   return being_debugged;
 }
 
 #elif defined(OS_LINUX)
+  struct kinfo_proc info;
+  size_t info_size = sizeof(info);
 
+  int sysctl_result = sysctl(mib, arraysize(mib), &info, &info_size, NULL, 0);
+  DCHECK_EQ(sysctl_result, 0);
+  if (sysctl_result != 0) {
+    is_set = true;
+    being_debugged = false;
+    return being_debugged;
+  }
+
+  // This process is being debugged if the P_TRACED flag is set.
+  is_set = true;
+#if defined(OS_OPENBSD)
+  being_debugged = (info.kp_proc.p_flag & P_TRACED) != 0;
+#else
+  being_debugged = (info.kp_proc.p_flag & P_TRACED) != 0;
+#endif
+  return being_debugged;
+}
+
+#elif defined(OS_LINUX)
+
 // We can look in /proc/self/status for TracerPid.  We are likely used in crash
 // handling, so we are careful not to use the heap or have side effects.
 // Another option that is common is to try to ptrace yourself, but then we
@@ -127,7 +170,7 @@ bool BeingDebugged() {
 
 #elif defined(OS_FREEBSD)
 
-bool DebugUtil::BeingDebugged() {
+bool BeingDebugged() {
   // TODO(benl): can we determine this under FreeBSD?
   NOTIMPLEMENTED();
   return false;
