Module Name:    src
Committed By:   christos
Date:           Thu Aug 29 14:58:56 UTC 2013

Modified Files:
        src/lib/libexecinfo: backtrace.c

Log Message:
use sysctl to find the pathname argv[0] if available (from FreeBSD via
Ed Maste)


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/lib/libexecinfo/backtrace.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libexecinfo/backtrace.c
diff -u src/lib/libexecinfo/backtrace.c:1.2 src/lib/libexecinfo/backtrace.c:1.3
--- src/lib/libexecinfo/backtrace.c:1.2	Sun Jul  8 23:11:59 2012
+++ src/lib/libexecinfo/backtrace.c	Thu Aug 29 10:58:56 2013
@@ -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
 #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
 	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;

Reply via email to