5 #include "w32process.h"
6 #include "w32process-unix-internals.h"
8 #ifdef USE_DEFAULT_BACKEND
13 /* procfs.h cannot be included if this define is set, but it seems to work fine if it is undefined */
14 #if _FILE_OFFSET_BITS == 64
15 #undef _FILE_OFFSET_BITS
17 #define _FILE_OFFSET_BITS 64
25 #include <sys/mkdev.h>
26 #elif defined MAJOR_IN_SYSMACROS
27 #include <sys/sysmacros.h>
30 #include "utils/mono-logger-internals.h"
33 #define MAXPATHLEN 242
37 mono_w32process_get_name (pid_t pid)
44 #if defined(HOST_SOLARIS)
45 filename = g_strdup_printf ("/proc/%d/psinfo", pid);
46 if ((fp = fopen (filename, "r")) != NULL) {
50 nread = fread (&info, sizeof (info), 1, fp);
52 ret = g_strdup (info.pr_fname);
59 memset (buf, '\0', sizeof(buf));
60 filename = g_strdup_printf ("/proc/%d/exe", pid);
61 if (readlink (filename, buf, 255) > 0) {
70 filename = g_strdup_printf ("/proc/%d/cmdline", pid);
71 if ((fp = fopen (filename, "r")) != NULL) {
72 if (fgets (buf, 256, fp) != NULL) {
84 filename = g_strdup_printf ("/proc/%d/stat", pid);
85 if ((fp = fopen (filename, "r")) != NULL) {
86 if (fgets (buf, 256, fp) != NULL) {
89 start = strchr (buf, '(');
91 end = strchr (start + 1, ')');
94 ret = g_strndup (start + 1,
109 mono_w32process_get_path (pid_t pid)
111 return mono_w32process_get_name (pid);
115 open_process_map (int pid, const char *mode)
118 const gchar *proc_path[] = {
119 "/proc/%d/maps", /* GNU/Linux */
120 "/proc/%d/map", /* FreeBSD */
124 for (i = 0; proc_path [i]; i++) {
128 filename = g_strdup_printf (proc_path[i], pid);
129 fp = fopen (filename, mode);
141 mono_w32process_get_modules (pid_t pid)
145 MonoW32ProcessModule *mod;
146 gchar buf[MAXPATHLEN + 1], *p, *endp;
147 gchar *start_start, *end_start, *prot_start, *offset_start;
148 gchar *maj_dev_start, *min_dev_start, *inode_start, prot_buf[5];
149 gpointer address_start, address_end, address_offset;
150 guint32 maj_dev, min_dev;
154 fp = open_process_map (pid, "r");
156 mono_trace (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't open process map file for pid %d", __func__, pid);
160 while (fgets (buf, sizeof(buf), fp)) {
162 while (g_ascii_isspace (*p)) ++p;
164 if (!g_ascii_isxdigit (*start_start)) {
167 address_start = (gpointer)strtoul (start_start, &endp, 16);
175 if (!g_ascii_isxdigit (*end_start)) {
178 address_end = (gpointer)strtoul (end_start, &endp, 16);
180 if (!g_ascii_isspace (*p)) {
184 while (g_ascii_isspace (*p)) ++p;
186 if (*prot_start != 'r' && *prot_start != '-') {
189 memcpy (prot_buf, prot_start, 4);
191 while (!g_ascii_isspace (*p)) ++p;
193 while (g_ascii_isspace (*p)) ++p;
195 if (!g_ascii_isxdigit (*offset_start)) {
198 address_offset = (gpointer)strtoul (offset_start, &endp, 16);
200 if (!g_ascii_isspace (*p)) {
204 while(g_ascii_isspace (*p)) ++p;
206 if (!g_ascii_isxdigit (*maj_dev_start)) {
209 maj_dev = strtoul (maj_dev_start, &endp, 16);
217 if (!g_ascii_isxdigit (*min_dev_start)) {
220 min_dev = strtoul (min_dev_start, &endp, 16);
222 if (!g_ascii_isspace (*p)) {
226 while (g_ascii_isspace (*p)) ++p;
228 if (!g_ascii_isxdigit (*inode_start)) {
231 inode = (guint64)strtol (inode_start, &endp, 10);
233 if (!g_ascii_isspace (*p)) {
237 device = makedev ((int)maj_dev, (int)min_dev);
238 if ((device == 0) && (inode == 0)) {
242 while(g_ascii_isspace (*p)) ++p;
243 /* p now points to the filename */
245 mod = g_new0 (MonoW32ProcessModule, 1);
246 mod->address_start = address_start;
247 mod->address_end = address_end;
248 mod->perms = g_strdup (prot_buf);
249 mod->address_offset = address_offset;
250 mod->device = device;
252 mod->filename = g_strdup (g_strstrip (p));
254 if (g_slist_find_custom (ret, mod, mono_w32process_module_equals) == NULL) {
255 ret = g_slist_prepend (ret, mod);
257 mono_w32process_module_free (mod);
261 ret = g_slist_reverse (ret);