summaryrefslogtreecommitdiff
path: root/lang/rust/files/patch-src_libbacktrace_fileline.c
blob: 88e16025ddfc1609dee95e7c62eab9f3b4bf555d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
--- src/libbacktrace/fileline.c.orig	2017-06-06 00:42:59 UTC
+++ src/libbacktrace/fileline.c
@@ -38,8 +38,39 @@ POSSIBILITY OF SUCH DAMAGE.  */
 #include <fcntl.h>
 #include <stdlib.h>
 
+#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__)
+#include <sys/sysctl.h>
+#include <limits.h>
+#endif
+
 #include "backtrace.h"
 #include "internal.h"
+
+#if !defined(HAVE_GETEXECNAME) && defined(KERN_PROC_PATHNAME)
+/* Return pathname of executable or 0 on failure. */
+#define HAVE_GETEXECNAME
+static char execname[PATH_MAX + 1];
+static const char *
+getexecname(void)
+{
+  size_t path_len = sizeof(execname);
+  int mib[] = {
+    CTL_KERN,
+#if defined(__NetBSD__)
+    KERN_PROC_ARGS,
+    -1,
+    KERN_PROC_PATHNAME,
+#else
+    KERN_PROC,
+    KERN_PROC_PATHNAME,
+    -1,
+#endif
+  };
+  u_int miblen = sizeof(mib) / sizeof(mib[0]);
+  int rc = sysctl(mib, miblen, execname, &path_len, NULL, 0);
+  return rc ? NULL : execname;
+}
+#endif /* !HAVE_GETEXECNAME && KERN_PROC_PATHNAME */
 
 #ifndef HAVE_GETEXECNAME
 #define getexecname() NULL