diff options
| author | christos <christos@NetBSD.org> | 2013-08-29 14:58:56 +0000 |
|---|---|---|
| committer | christos <christos@NetBSD.org> | 2013-08-29 14:58:56 +0000 |
| commit | 10d41eb490deb42c846fbf81e59aca118b93fec5 (patch) | |
| tree | 12d36cbb06ad33fe5f83afd6b66f4abd091370b9 /lib/libexecinfo | |
| parent | 77fa8a9336aedef9f5ba3fce13d8ddc2bf62d995 (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.c | 26 |
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; |
