5 #include "w32process.h"
6 #include "w32process-unix-internals.h"
12 #include <sys/sysctl.h>
13 #if !defined(__OpenBSD__)
14 #include <sys/utsname.h>
16 #if defined(__FreeBSD__)
17 #include <sys/user.h> /* struct kinfo_proc */
22 #include "utils/mono-logger-internals.h"
25 mono_w32process_get_name (pid_t pid)
29 struct kinfo_proc *pi;
32 #if defined(__FreeBSD__)
35 mib [2] = KERN_PROC_PID;
37 if (sysctl(mib, 4, NULL, &size, NULL, 0) < 0) {
38 mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: sysctl() failed: %d", __func__, errno);
42 if ((pi = g_malloc (size)) == NULL)
45 if (sysctl (mib, 4, pi, &size, NULL, 0) < 0) {
46 if (errno == ENOMEM) {
48 mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Didn't allocate enough memory for kproc info", __func__);
53 ret = strlen (pi->ki_comm) > 0 ? g_strdup (pi->ki_comm) : NULL;
56 #elif defined(__OpenBSD__)
59 mib [2] = KERN_PROC_PID;
61 mib [4] = sizeof(struct kinfo_proc);
65 if (sysctl(mib, 6, NULL, &size, NULL, 0) < 0) {
66 mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: sysctl() failed: %d", __func__, errno);
70 if ((pi = g_malloc (size)) == NULL)
73 mib[5] = (int)(size / sizeof(struct kinfo_proc));
75 if ((sysctl (mib, 6, pi, &size, NULL, 0) < 0) ||
76 (size != sizeof (struct kinfo_proc))) {
77 if (errno == ENOMEM) {
84 ret = strlen (pi->p_comm) > 0 ? g_strdup (pi->p_comm) : NULL;
93 mono_w32process_get_path (pid_t pid)
95 return mono_w32process_get_name (pid);
99 mono_w32process_get_modules_callback (struct dl_phdr_info *info, gsize size, gpointer ptr)
101 if (size < offsetof (struct dl_phdr_info, dlpi_phnum) + sizeof (info->dlpi_phnum))
104 struct dl_phdr_info *cpy = g_calloc (1, sizeof(struct dl_phdr_info));
108 memcpy(cpy, info, sizeof(*info));
110 g_ptr_array_add ((GPtrArray *)ptr, cpy);
116 mono_w32process_get_modules (pid_t pid)
119 MonoW32ProcessModule *mod;
120 GPtrArray *dlarray = g_ptr_array_new();
123 if (dl_iterate_phdr (mono_w32process_get_modules_callback, dlarray) < 0)
126 for (i = 0; i < dlarray->len; i++) {
127 struct dl_phdr_info *info = g_ptr_array_index (dlarray, i);
129 mod = g_new0 (MonoW32ProcessModule, 1);
130 mod->address_start = (gpointer)(info->dlpi_addr + info->dlpi_phdr[0].p_vaddr);
131 mod->address_end = (gpointer)(info->dlpi_addr + info->dlpi_phdr[info->dlpi_phnum - 1].p_vaddr);
132 mod->perms = g_strdup ("r--p");
133 mod->address_offset = 0;
135 mod->filename = g_strdup (info->dlpi_name);
137 mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: inode=%d, filename=%s, address_start=%p, address_end=%p",
138 __func__, mod->inode, mod->filename, mod->address_start, mod->address_end);
142 if (g_slist_find_custom (ret, mod, mono_w32process_module_equals) == NULL) {
143 ret = g_slist_prepend (ret, mod);
145 mono_w32process_module_free (mod);
149 g_ptr_array_free (dlarray, TRUE);
151 return g_slist_reverse (ret);