From 68b9939aecfb9a890549e820488812ae566b6aa9 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Sun, 1 May 2005 10:06:12 +0000 Subject: * fbsd-nat.c: Include . (fbsd_pid_to_exec_file): Use KERN_PROC_PATHNAME sysctl if available. Plug memory leak. Fixes PR gdb/1922. --- gdb/fbsd-nat.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) (limited to 'gdb/fbsd-nat.c') 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 #include +#include +#include #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 -- cgit v1.1