2010-04-03 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Sat, 3 Apr 2010 00:35:45 +0000 (00:35 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sat, 3 Apr 2010 00:35:45 +0000 (00:35 -0000)
* processes.c: Applied some openbsd changes from Robert Nagy <robert@openbsd.org>.

svn path=/trunk/mono/; revision=154747

mono/io-layer/ChangeLog
mono/io-layer/processes.c

index 8783e9ab7b857baf7912d9c03198c582a1bf4c94..ede8fed5064a10cf9607ec09636d7e73d5a0ab17 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-03  Zoltan Varga  <vargaz@gmail.com>
+
+       * processes.c: Applied some openbsd changes from Robert Nagy <robert@openbsd.org>.
+
 2010-03-26  Zoltan Varga  <vargaz@gmail.com>
 
        * sockets.c: Apply some openbsd changes from openbsd ports.
index b5917161551c6e7bbdf384b2ff0c62bf11c6141e..d830e1187b33237ff8ea2c83bbb3d3d30788a4ab 100644 (file)
 #include <sys/resource.h>
 #endif
 
-#ifdef PLATFORM_MACOSX
+#if defined(PLATFORM_MACOSX) || defined(__OpenBSD__)
 #include <sys/proc.h>
 #include <sys/sysctl.h>
-#include <sys/utsname.h>
+#  if !defined(__OpenBSD__)
+#    include <sys/utsname.h>
+#  endif
 #endif
 
 #ifdef PLATFORM_SOLARIS
@@ -1513,16 +1515,27 @@ static gboolean process_enum (gpointer handle, gpointer user_data)
 }
 #endif /* UNUSED_CODE */
 
-#ifdef PLATFORM_MACOSX
+#if defined(PLATFORM_MACOSX) || defined(__OpenBSD__)
 
 gboolean EnumProcesses (guint32 *pids, guint32 len, guint32 *needed)
 {
        guint32 count, fit, i, j;
        gint32 err;
        gboolean done;
+       size_t proclength, size;
+#if defined(__OpenBSD__)
+       struct kinfo_proc2 *result;
+       int name[6];
+       name[0] = CTL_KERN;
+       name[1] = KERN_PROC2;
+       name[2] = KERN_PROC_ALL;
+       name[3] = 0;
+       name[4] = sizeof(struct kinfo_proc2);
+       name[5] = 400; /* XXX */
+#else
        struct kinfo_proc *result;
-       size_t proclength;
        static const int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
+#endif
        
        mono_once (&process_current_once, process_set_current);
        
@@ -1531,14 +1544,20 @@ gboolean EnumProcesses (guint32 *pids, guint32 len, guint32 *needed)
        
        do {
                proclength = 0;
-               err = sysctl ((int *)name, (sizeof(name) / sizeof(*name)) - 1, NULL, &proclength, NULL, 0);
+#if defined(__OpenBSD__)
+               size = (sizeof(name) / sizeof(*name));
+#else
+               size = (sizeof(name) / sizeof(*name)) - 1;
+#endif
+               err = sysctl ((int *)name, size, NULL, &proclength, NULL, 0);
 
                if (err == 0) {
                        result = malloc (proclength);
+
                        if (result == NULL)
                                return FALSE;
                        
-                       err = sysctl ((int *) name, (sizeof(name) / sizeof(*name)) - 1, result, &proclength, NULL, 0);
+                       err = sysctl ((int *) name, size, result, &proclength, NULL, 0);
 
                        if (err == 0) 
                                done = TRUE;
@@ -1554,11 +1573,19 @@ gboolean EnumProcesses (guint32 *pids, guint32 len, guint32 *needed)
                }
                return(FALSE);
        }       
-       
+
+#if defined(__OpenBSD__)
+       count = proclength / sizeof(struct kinfo_proc2);
+#else
        count = proclength / sizeof(struct kinfo_proc);
+#endif
        fit = len / sizeof(guint32);
        for (i = 0, j = 0; j< fit && i < count; i++) {
+#if defined(__OpenBSD__)
+               pids [j++] = result [i].p_pid;
+#else
                pids [j++] = result [i].kp_proc.p_pid;
+#endif
        }
        free (result);
        result = NULL;