summaryrefslogtreecommitdiff
path: root/lib/libexecinfo
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2013-08-29 14:58:56 +0000
committerchristos <christos@NetBSD.org>2013-08-29 14:58:56 +0000
commit10d41eb490deb42c846fbf81e59aca118b93fec5 (patch)
tree12d36cbb06ad33fe5f83afd6b66f4abd091370b9 /lib/libexecinfo
parent77fa8a9336aedef9f5ba3fce13d8ddc2bf62d995 (diff)
use sysctl to find the pathname argv[0] if available (from FreeBSD via
Ed Maste)
Diffstat (limited to 'lib/libexecinfo')
-rw-r--r--lib/libexecinfo/backtrace.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/lib/libexecinfo/backtrace.c b/lib/libexecinfo/backtrace.c
index 02ad1480372..e5a6e5824ae 100644
--- a/lib/libexecinfo/backtrace.c
+++ b/lib/libexecinfo/backtrace.c
@@ -1,4 +1,4 @@
-/* $NetBSD: backtrace.c,v 1.2 2012/07/09 03:11:59 christos Exp $ */
+/* $NetBSD: backtrace.c,v 1.3 2013/08/29 14:58:56 christos Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: backtrace.c,v 1.2 2012/07/09 03:11:59 christos Exp $");
+__RCSID("$NetBSD: backtrace.c,v 1.3 2013/08/29 14:58:56 christos Exp $");
#include <sys/param.h>
#include <assert.h>
@@ -50,9 +50,29 @@ __RCSID("$NetBSD: backtrace.c,v 1.2 2012/07/09 03:11:59 christos Exp $");
#ifdef __linux__
#define SELF "/proc/self/exe"
#else
+#include <sys/sysctl.h>
#define SELF "/proc/curproc/file"
#endif
+static int
+open_self(int flags)
+{
+ const char *pathname = SELF;
+#ifdef KERN_PROC_PATHNAME
+ static const int name[] = {
+ CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1,
+ };
+ char path[MAXPATHLEN];
+ size_t len;
+
+ len = sizeof(path);
+ if (sysctl(name, __arraycount(name), path, &len, NULL, 0) != -1)
+ pathname = path;
+#endif
+ return open(pathname, flags);
+}
+
+
static int __printflike(4, 5)
rasprintf(char **buf, size_t *bufsiz, size_t offs, const char *fmt, ...)
{
@@ -162,7 +182,7 @@ backtrace_symbols_fmt(void *const *trace, size_t len, const char *fmt)
symtab_t *st;
int fd;
- if ((fd = open(SELF, O_RDONLY)) != -1)
+ if ((fd = open_self(O_RDONLY)) != -1)
st = symtab_create(fd, -1, STT_FUNC);
else
st = NULL;