2 #include "w32process.h"
3 #include "w32process-unix-internals.h"
5 #ifdef USE_DEFAULT_BACKEND
9 #ifdef PLATFORM_SOLARIS
10 /* procfs.h cannot be included if this define is set, but it seems to work fine if it is undefined */
11 #if _FILE_OFFSET_BITS == 64
12 #undef _FILE_OFFSET_BITS
14 #define _FILE_OFFSET_BITS 64
22 #include <sys/mkdev.h>
23 #elif defined MAJOR_IN_SYSMACROS
24 #include <sys/sysmacros.h>
27 #include "utils/mono-logger-internals.h"
30 #define MAXPATHLEN 242
34 mono_w32process_get_name (pid_t pid
)
41 #if defined(PLATFORM_SOLARIS)
42 filename
= g_strdup_printf ("/proc/%d/psinfo", pid
);
43 if ((fp
= fopen (filename
, "r")) != NULL
) {
47 nread
= fread (&info
, sizeof (info
), 1, fp
);
49 ret
= g_strdup (info
.pr_fname
);
56 memset (buf
, '\0', sizeof(buf
));
57 filename
= g_strdup_printf ("/proc/%d/exe", pid
);
58 if (readlink (filename
, buf
, 255) > 0) {
67 filename
= g_strdup_printf ("/proc/%d/cmdline", pid
);
68 if ((fp
= fopen (filename
, "r")) != NULL
) {
69 if (fgets (buf
, 256, fp
) != NULL
) {
81 filename
= g_strdup_printf ("/proc/%d/stat", pid
);
82 if ((fp
= fopen (filename
, "r")) != NULL
) {
83 if (fgets (buf
, 256, fp
) != NULL
) {
86 start
= strchr (buf
, '(');
88 end
= strchr (start
+ 1, ')');
91 ret
= g_strndup (start
+ 1,
106 mono_w32process_get_path (pid_t pid
)
108 return mono_w32process_get_name (pid
);
112 open_process_map (int pid
, const char *mode
)
115 const gchar
*proc_path
[] = {
116 "/proc/%d/maps", /* GNU/Linux */
117 "/proc/%d/map", /* FreeBSD */
121 for (i
= 0; proc_path
[i
]; i
++) {
125 filename
= g_strdup_printf (proc_path
[i
], pid
);
126 fp
= fopen (filename
, mode
);
138 mono_w32process_get_modules (pid_t pid
)
142 MonoW32ProcessModule
*mod
;
143 gchar buf
[MAXPATHLEN
+ 1], *p
, *endp
;
144 gchar
*start_start
, *end_start
, *prot_start
, *offset_start
;
145 gchar
*maj_dev_start
, *min_dev_start
, *inode_start
, prot_buf
[5];
146 gpointer address_start
, address_end
, address_offset
;
147 guint32 maj_dev
, min_dev
;
151 fp
= open_process_map (pid
, "r");
155 while (fgets (buf
, sizeof(buf
), fp
)) {
157 while (g_ascii_isspace (*p
)) ++p
;
159 if (!g_ascii_isxdigit (*start_start
)) {
162 address_start
= (gpointer
)strtoul (start_start
, &endp
, 16);
170 if (!g_ascii_isxdigit (*end_start
)) {
173 address_end
= (gpointer
)strtoul (end_start
, &endp
, 16);
175 if (!g_ascii_isspace (*p
)) {
179 while (g_ascii_isspace (*p
)) ++p
;
181 if (*prot_start
!= 'r' && *prot_start
!= '-') {
184 memcpy (prot_buf
, prot_start
, 4);
186 while (!g_ascii_isspace (*p
)) ++p
;
188 while (g_ascii_isspace (*p
)) ++p
;
190 if (!g_ascii_isxdigit (*offset_start
)) {
193 address_offset
= (gpointer
)strtoul (offset_start
, &endp
, 16);
195 if (!g_ascii_isspace (*p
)) {
199 while(g_ascii_isspace (*p
)) ++p
;
201 if (!g_ascii_isxdigit (*maj_dev_start
)) {
204 maj_dev
= strtoul (maj_dev_start
, &endp
, 16);
212 if (!g_ascii_isxdigit (*min_dev_start
)) {
215 min_dev
= strtoul (min_dev_start
, &endp
, 16);
217 if (!g_ascii_isspace (*p
)) {
221 while (g_ascii_isspace (*p
)) ++p
;
223 if (!g_ascii_isxdigit (*inode_start
)) {
226 inode
= (guint64
)strtol (inode_start
, &endp
, 10);
228 if (!g_ascii_isspace (*p
)) {
232 device
= makedev ((int)maj_dev
, (int)min_dev
);
233 if ((device
== 0) && (inode
== 0)) {
237 while(g_ascii_isspace (*p
)) ++p
;
238 /* p now points to the filename */
240 mod
= g_new0 (MonoW32ProcessModule
, 1);
241 mod
->address_start
= address_start
;
242 mod
->address_end
= address_end
;
243 mod
->perms
= g_strdup (prot_buf
);
244 mod
->address_offset
= address_offset
;
245 mod
->device
= device
;
247 mod
->filename
= g_strdup (g_strstrip (p
));
249 if (g_slist_find_custom (ret
, mod
, mono_w32process_module_equals
) == NULL
) {
250 ret
= g_slist_prepend (ret
, mod
);
252 mono_w32process_module_free (mod
);
256 ret
= g_slist_reverse (ret
);