Differential D23835 Diff 68823 lang/rust/files/patch-vendor_backtrace-sys_src_libbacktrace_fileline.c
Changeset View
Changeset View
Standalone View
Standalone View
lang/rust/files/patch-vendor_backtrace-sys_src_libbacktrace_fileline.c
This file is in the public domain. | https://github.com/ianlancetaylor/libbacktrace/commit/0f06cda953cc4e26f38751c5b9f15ae8dfa5ff2d | ||||
https://github.com/rust-lang-nursery/libbacktrace/pull/1 | |||||
--- vendor/backtrace-sys/src/libbacktrace/fileline.c.orig 2019-01-16 09:30:44 UTC | --- vendor/backtrace-sys/src/libbacktrace/fileline.c.orig 2020-02-19 21:11:31 UTC | ||||
+++ vendor/backtrace-sys/src/libbacktrace/fileline.c | +++ vendor/backtrace-sys/src/libbacktrace/fileline.c | ||||
@@ -39,8 +39,39 @@ POSSIBILITY OF SUCH DAMAGE. */ | @@ -39,6 +39,10 @@ POSSIBILITY OF SUCH DAMAGE. */ | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
+#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) | +#if defined (HAVE_KERN_PROC_ARGS) || defined (HAVE_KERN_PROC) | ||||
+#include <sys/sysctl.h> | +#include <sys/sysctl.h> | ||||
+#include <limits.h> | |||||
+#endif | +#endif | ||||
+ | + | ||||
#include "backtrace.h" | #include "backtrace.h" | ||||
#include "internal.h" | #include "internal.h" | ||||
@@ -46,6 +50,78 @@ POSSIBILITY OF SUCH DAMAGE. */ | |||||
#define getexecname() NULL | |||||
#endif | |||||
+#if !defined (HAVE_KERN_PROC_ARGS) && !defined (HAVE_KERN_PROC) | |||||
+ | + | ||||
+#if !defined(HAVE_GETEXECNAME) && defined(KERN_PROC_PATHNAME) | +#define sysctl_exec_name1(state, error_callback, data) NULL | ||||
+/* Return pathname of executable or 0 on failure. */ | +#define sysctl_exec_name2(state, error_callback, data) NULL | ||||
+#define HAVE_GETEXECNAME | + | ||||
+static char execname[PATH_MAX + 1]; | +#else /* defined (HAVE_KERN_PROC_ARGS) || |defined (HAVE_KERN_PROC) */ | ||||
+static const char * | + | ||||
+getexecname(void) | +static char * | ||||
+sysctl_exec_name (struct backtrace_state *state, | |||||
+ int mib0, int mib1, int mib2, int mib3, | |||||
+ backtrace_error_callback error_callback, void *data) | |||||
+{ | +{ | ||||
+ size_t path_len = sizeof(execname); | + int mib[4]; | ||||
+ int mib[] = { | + size_t len; | ||||
+ CTL_KERN, | + char *name; | ||||
+#if defined(__NetBSD__) | + size_t rlen; | ||||
+ KERN_PROC_ARGS, | + | ||||
+ -1, | + mib[0] = mib0; | ||||
+ KERN_PROC_PATHNAME, | + mib[1] = mib1; | ||||
+ mib[2] = mib2; | |||||
+ mib[3] = mib3; | |||||
+ | |||||
+ if (sysctl (mib, 4, NULL, &len, NULL, 0) < 0) | |||||
+ return NULL; | |||||
+ name = (char *) backtrace_alloc (state, len, error_callback, data); | |||||
+ if (name == NULL) | |||||
+ return NULL; | |||||
+ rlen = len; | |||||
+ if (sysctl (mib, 4, name, &rlen, NULL, 0) < 0) | |||||
+ { | |||||
+ backtrace_free (state, name, len, error_callback, data); | |||||
+ return NULL; | |||||
+ } | |||||
+ return name; | |||||
+} | |||||
+ | |||||
+#ifdef HAVE_KERN_PROC_ARGS | |||||
+ | |||||
+static char * | |||||
+sysctl_exec_name1 (struct backtrace_state *state, | |||||
+ backtrace_error_callback error_callback, void *data) | |||||
+{ | |||||
+ /* This variant is used on NetBSD. */ | |||||
+ return sysctl_exec_name (state, CTL_KERN, KERN_PROC_ARGS, -1, | |||||
+ KERN_PROC_PATHNAME, error_callback, data); | |||||
+} | |||||
+ | |||||
+#else | +#else | ||||
+ KERN_PROC, | + | ||||
+ KERN_PROC_PATHNAME, | +#define sysctl_exec_name1(state, error_callback, data) NULL | ||||
+ -1, | + | ||||
+#endif | +#endif | ||||
+ }; | + | ||||
+ u_int miblen = sizeof(mib) / sizeof(mib[0]); | +#ifdef HAVE_KERN_PROC | ||||
+ int rc = sysctl(mib, miblen, execname, &path_len, NULL, 0); | + | ||||
+ return rc ? NULL : execname; | +static char * | ||||
+sysctl_exec_name2 (struct backtrace_state *state, | |||||
+ backtrace_error_callback error_callback, void *data) | |||||
+{ | |||||
+ /* This variant is used on FreeBSD. */ | |||||
+ return sysctl_exec_name (state, CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1, | |||||
+ error_callback, data); | |||||
+} | +} | ||||
+#endif /* !HAVE_GETEXECNAME && KERN_PROC_PATHNAME */ | + | ||||
+#else | |||||
+ | |||||
+#define sysctl_exec_name2(state, error_callback, data) NULL | |||||
+ | |||||
+#endif | |||||
+ | |||||
+#endif /* defined (HAVE_KERN_PROC_ARGS) || |defined (HAVE_KERN_PROC) */ | |||||
+ | |||||
/* Initialize the fileline information from the executable. Returns 1 | |||||
on success, 0 on failure. */ | |||||
#ifndef HAVE_GETEXECNAME | @@ -83,7 +159,7 @@ fileline_initialize (struct backtrace_state *state, | ||||
#define getexecname() NULL | |||||
descriptor = -1; | |||||
called_error_callback = 0; | |||||
- for (pass = 0; pass < 5; ++pass) | |||||
+ for (pass = 0; pass < 7; ++pass) | |||||
{ | |||||
int does_not_exist; | |||||
@@ -105,6 +181,12 @@ fileline_initialize (struct backtrace_state *state, | |||||
snprintf (buf, sizeof (buf), "/proc/%ld/object/a.out", | |||||
(long) getpid ()); | |||||
filename = buf; | |||||
+ break; | |||||
+ case 5: | |||||
+ filename = sysctl_exec_name1 (state, error_callback, data); | |||||
+ break; | |||||
+ case 6: | |||||
+ filename = sysctl_exec_name2 (state, error_callback, data); | |||||
break; | |||||
default: | |||||
abort (); |