diff options
author | Mark Kettenis <kettenis@gnu.org> | 2005-05-01 10:06:12 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2005-05-01 10:06:12 +0000 |
commit | 68b9939aecfb9a890549e820488812ae566b6aa9 (patch) | |
tree | f1235bae46e68286f7b6c0170b7ae0595cde778e /gdb/fbsd-nat.c | |
parent | 5308fd89d5975c9d37f072f83138571aa956f5ab (diff) | |
download | gdb-68b9939aecfb9a890549e820488812ae566b6aa9.zip gdb-68b9939aecfb9a890549e820488812ae566b6aa9.tar.gz gdb-68b9939aecfb9a890549e820488812ae566b6aa9.tar.bz2 |
* fbsd-nat.c: Include <sys/sysctl.h>.
(fbsd_pid_to_exec_file): Use KERN_PROC_PATHNAME sysctl if
available. Plug memory leak. Fixes PR gdb/1922.
Diffstat (limited to 'gdb/fbsd-nat.c')
-rw-r--r-- | gdb/fbsd-nat.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 2b19f70..05d00b5 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -27,8 +27,9 @@ #include "gdb_assert.h" #include "gdb_string.h" -#include <sys/procfs.h> #include <sys/types.h> +#include <sys/procfs.h> +#include <sys/sysctl.h> #include "elf-bfd.h" #include "fbsd-nat.h" @@ -39,18 +40,30 @@ char * fbsd_pid_to_exec_file (int pid) { + size_t len = MAXPATHLEN; + char *buf = xcalloc (len, sizeof (char)); char *path; - char *buf; - path = xstrprintf ("/proc/%d/file", pid); - buf = xcalloc (MAXPATHLEN, sizeof (char)); - make_cleanup (xfree, path); - make_cleanup (xfree, buf); +#ifdef KERN_PROC_PATHNAME + int mib[4]; - if (readlink (path, buf, MAXPATHLEN) > 0) + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PATHNAME; + mib[3] = pid; + if (sysctl (mib, 4, buf, &len, NULL, 0) == 0) return buf; +#endif + + path = xstrprintf ("/proc/%d/file", pid); + if (readlink (path, buf, MAXPATHLEN) == -1) + { + xfree (buf); + buf = NULL; + } - return NULL; + xfree (path); + return buf; } static int |