openbsd-ports/lang/mono/patches/patch-mono_utils_mono-proclib_c
robert 281e83e581 Fix kinfo_proc2 code and add support for more mono stuff using sysctl to
get process informations. Remove the mkbundle.cs patch and replace it
with one that uses configure.in so the libgc dependency ends up in the
pkg-config file. Move disabled features to configure.in from our Makefile
2010-04-08 12:12:33 +00:00

126 lines
3.2 KiB
Plaintext

$OpenBSD: patch-mono_utils_mono-proclib_c,v 1.6 2010/04/08 12:12:33 robert Exp $
--- mono/utils/mono-proclib.c.orig Sat Oct 31 05:22:03 2009
+++ mono/utils/mono-proclib.c Thu Apr 8 11:55:46 2010
@@ -13,6 +13,9 @@
#endif
/* FIXME: bsds untested */
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
+#include <sys/param.h>
+#endif
#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
#include <sys/types.h>
#include <sys/sysctl.h>
@@ -21,8 +24,13 @@
#include <sys/user.h>
#endif
#ifdef HAVE_STRUCT_KINFO_PROC_KP_PROC
-#define kinfo_pid_member kp_proc.p_pid
-#define kinfo_name_member kp_proc.p_comm
+# ifdef KERN_PROC2
+# define kinfo_pid_member p_pid
+# define kinfo_name_member p_comm
+# else
+# define kinfo_pid_member kp_proc.p_pid
+# define kinfo_name_member kp_proc.p_comm
+# endif
#else
#define kinfo_pid_member ki_pid
#define kinfo_name_member ki_comm
@@ -41,10 +49,16 @@ gpointer*
mono_process_list (int *size)
{
#if USE_SYSCTL
- int mib [4];
int res, i;
+#ifdef KERN_PROC2
+ int mib [6];
+ size_t data_len = sizeof (struct kinfo_proc2) * 400;
+ struct kinfo_proc2 *processes = malloc (data_len);
+#else
+ int mib [4];
size_t data_len = sizeof (struct kinfo_proc) * 400;
struct kinfo_proc *processes = malloc (data_len);
+#endif
void **buf = NULL;
if (size)
@@ -52,17 +66,33 @@ mono_process_list (int *size)
if (!processes)
return NULL;
+#ifdef KERN_PROC2
mib [0] = CTL_KERN;
+ mib [1] = KERN_PROC2;
+ mib [2] = KERN_PROC_ALL;
+ mib [3] = 0;
+ mib [4] = sizeof(struct kinfo_proc2);
+ mib [5] = 400; /* XXX */
+
+ res = sysctl (mib, 6, processes, &data_len, NULL, 0);
+#else
+ mib [0] = CTL_KERN;
mib [1] = KERN_PROC;
mib [2] = KERN_PROC_ALL;
mib [3] = 0;
res = sysctl (mib, 4, processes, &data_len, NULL, 0);
+#endif /* KERN_PROC2 */
+
if (res < 0) {
free (processes);
return NULL;
}
+#ifdef KERN_PROC2
+ res = data_len/sizeof (struct kinfo_proc2);
+#else
res = data_len/sizeof (struct kinfo_proc);
+#endif /* KERN_PROC2 */
buf = g_realloc (buf, res * sizeof (void*));
for (i = 0; i < res; ++i)
buf [i] = GINT_TO_POINTER (processes [i].kinfo_pid_member);
@@ -155,14 +185,34 @@ char*
mono_process_get_name (gpointer pid, char *buf, int len)
{
#if USE_SYSCTL
- int mib [4];
int res;
+#ifdef KERN_PROC2
+ int mib [6];
+ size_t data_len = sizeof (struct kinfo_proc2);
+ struct kinfo_proc2 processi;
+#else
+ int mib [4];
size_t data_len = sizeof (struct kinfo_proc);
struct kinfo_proc processi;
+#endif /* KERN_PROC2 */
memset (buf, 0, len);
+#ifdef KERN_PROC2
mib [0] = CTL_KERN;
+ mib [1] = KERN_PROC2;
+ mib [2] = KERN_PROC_PID;
+ mib [3] = GPOINTER_TO_UINT (pid);
+ mib [4] = sizeof(struct kinfo_proc2);
+ mib [5] = 400; /* XXX */
+
+ res = sysctl (mib, 6, &processi, &data_len, NULL, 0);
+
+ if (res < 0 || data_len != sizeof (struct kinfo_proc2)) {
+ return buf;
+ }
+#else
+ mib [0] = CTL_KERN;
mib [1] = KERN_PROC;
mib [2] = KERN_PROC_PID;
mib [3] = GPOINTER_TO_UINT (pid);
@@ -171,6 +221,7 @@ mono_process_get_name (gpointer pid, char *buf, int le
if (res < 0 || data_len != sizeof (struct kinfo_proc)) {
return buf;
}
+#endif /* KERN_PROC2 */
strncpy (buf, processi.kinfo_name_member, len - 1);
return buf;
#else