diff options
Diffstat (limited to 'libbacktrace/fileline.c')
-rw-r--r-- | libbacktrace/fileline.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/libbacktrace/fileline.c b/libbacktrace/fileline.c index c9fd86b..d2900aa 100644 --- a/libbacktrace/fileline.c +++ b/libbacktrace/fileline.c @@ -47,6 +47,10 @@ POSSIBILITY OF SUCH DAMAGE. */ #include <mach-o/dyld.h> #endif +#ifdef __hpux__ +#include <dl.h> +#endif + #ifdef HAVE_WINDOWS_H #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN @@ -66,6 +70,33 @@ POSSIBILITY OF SUCH DAMAGE. */ #define getexecname() NULL #endif +#ifdef __hpux__ +static char * +hpux_get_executable_path (struct backtrace_state *state, + backtrace_error_callback error_callback, void *data) +{ + struct shl_descriptor *desc; + size_t len = sizeof (struct shl_descriptor); + + desc = backtrace_alloc (state, len, error_callback, data); + if (desc == NULL) + return NULL; + + if (shl_get_r (0, desc) == -1) + { + backtrace_free (state, desc, len, error_callback, data); + return NULL; + } + + return desc->filename; +} + +#else + +#define hpux_get_executable_path(state, error_callback, data) NULL + +#endif + #if !defined (HAVE_KERN_PROC_ARGS) && !defined (HAVE_KERN_PROC) #define sysctl_exec_name1(state, error_callback, data) NULL @@ -245,7 +276,7 @@ fileline_initialize (struct backtrace_state *state, descriptor = -1; called_error_callback = 0; - for (pass = 0; pass < 10; ++pass) + for (pass = 0; pass < 11; ++pass) { int does_not_exist; @@ -285,6 +316,9 @@ fileline_initialize (struct backtrace_state *state, case 9: filename = windows_get_executable_path (buf, error_callback, data); break; + case 10: + filename = hpux_get_executable_path (state, error_callback, data); + break; default: abort (); } |