Gerald Pfeifer <[email protected]> writes:
> Just a small note, in the following
>
> +#ifdef __FreeBSD__
> +# define DEFAULT_PROCESS_FILENAME "/proc/curproc/file"
> +#elif defined(HAVE_GETEXECNAME)
> +# define DEFAULT_PROCESS_FILENAME getexecname ()
> +#else
> +# define DEFAULT_PROCESS_FILENAME "/proc/self/exe"
> +#endif
>
> would it make sense to have the feature test (HAVE_GETEXECNAME) before
> the OS test (__FreeBSD__), so that when/if the OS implements the feature
> in newer versions that takes precedence?
Good point. I've incorporated this into my patch and regularly include
it in my *-*-solaris2.{9, 10, 11} and x86_64-unknown-linux-gnu
bootstraps.
Ok for mainline?
Rainer
2012-10-05 Rainer Orth <[email protected]>
Gerald Pfeifer <[email protected]>
libbacktrace:
* configure.ac: Check for getexecname.
* configure: Regenerate.
* config.h.in: Regenerate.
* internal.h (DEFAULT_PROCESS_FILENAME): Define.
* fileline.c (fileline_initialize): Use it.
* print.c (error_callback): Likewise.
Include <stdlib.h>.
# HG changeset patch
# Parent a6a174227cae12381edf325b21adc905e8fa50e6
Use getexecname() on Solaris
diff --git a/libbacktrace/configure.ac b/libbacktrace/configure.ac
--- a/libbacktrace/configure.ac
+++ b/libbacktrace/configure.ac
@@ -289,6 +289,19 @@ fi
AC_CHECK_DECLS(strnlen)
+# Check for getexecname function.
+if test -n "${with_target_subdir}"; then
+ case "${host}" in
+ *-*-solaris2*) have_getexecname=yes ;;
+ *) have_getexecname=no ;;
+ esac
+else
+ AC_CHECK_FUNC(getexecname, [have_getexecname=yes], [have_getexecname=no])
+fi
+if test "$have_getexecname" = "yes"; then
+ AC_DEFINE(HAVE_GETEXECNAME, 1, [Define if getexecname is available.])
+fi
+
AC_CACHE_CHECK([whether tests can run],
[libbacktrace_cv_sys_native],
[AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
diff --git a/libbacktrace/fileline.c b/libbacktrace/fileline.c
--- a/libbacktrace/fileline.c
+++ b/libbacktrace/fileline.c
@@ -82,7 +82,8 @@ fileline_initialize (struct backtrace_st
if (state->filename != NULL)
descriptor = backtrace_open (state->filename, error_callback, data, NULL);
else
- descriptor = backtrace_open ("/proc/self/exe", error_callback, data, NULL);
+ descriptor = backtrace_open (DEFAULT_PROCESS_FILENAME, error_callback,
+ data, NULL);
if (descriptor < 0)
failed = 1;
diff --git a/libbacktrace/internal.h b/libbacktrace/internal.h
--- a/libbacktrace/internal.h
+++ b/libbacktrace/internal.h
@@ -56,6 +56,14 @@ POSSIBILITY OF SUCH DAMAGE. */
# endif
#endif
+#ifdef HAVE_GETEXECNAME
+# define DEFAULT_PROCESS_FILENAME getexecname ()
+#elif defined(__FreeBSD__)
+# define DEFAULT_PROCESS_FILENAME "/proc/curproc/file"
+#else
+# define DEFAULT_PROCESS_FILENAME "/proc/self/exe"
+#endif
+
#ifndef HAVE_SYNC_FUNCTIONS
/* Define out the sync functions. These should never be called if
diff --git a/libbacktrace/print.c b/libbacktrace/print.c
--- a/libbacktrace/print.c
+++ b/libbacktrace/print.c
@@ -35,6 +35,7 @@ POSSIBILITY OF SUCH DAMAGE. */
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
+#include <stdlib.h>
#include "backtrace.h"
#include "internal.h"
@@ -73,7 +74,7 @@ error_callback (void *data, const char *
name = pdata->state->filename;
if (name == NULL)
- name = "/proc/self/exe";
+ name = DEFAULT_PROCESS_FILENAME;
fprintf (stderr, "%s: libbacktrace: %s", name, msg);
if (errnum > 0)
fprintf (stderr, ": %s", strerror (errnum));
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University