From 2e820abea1ef62c1969ee17878f14ff2f4d224e8 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Thu, 16 Mar 2017 15:13:35 -0500 Subject: [PATCH] backtrace: Try to find absolute executable path This allows us to get backtraces from test_runner which does not start iwd from a current working directory that is a parent of the iwd executable. --- src/backtrace.c | 25 ++++++++++++++++++++++--- src/backtrace.h | 2 +- src/main.c | 2 +- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/backtrace.c b/src/backtrace.c index ec4c4701..759a8431 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -156,14 +156,33 @@ static void signal_handler(int signo) exit(EXIT_FAILURE); } -void __iwd_backtrace_init(const char *program) +void __iwd_backtrace_init() { static char path[PATH_MAX]; + static char cwd[PATH_MAX]; struct sigaction sa; sigset_t mask; + ssize_t len; - program_exec = program; - program_path = getcwd(path, sizeof(path)); + /* Attempt to get the full path to our executable */ + len = readlink("/proc/self/exe", path, sizeof(path) - 1); + if (len > 0) { + int i; + path[len] = '\0'; + + for (i = len - 1; i >= 0; i--) { + if (path[i] != '/') + continue; + + program_exec = path; + break; + } + } + + if (program_exec == NULL) + return; + + program_path = getcwd(cwd, sizeof(cwd)); sigemptyset(&mask); sa.sa_handler = signal_handler; diff --git a/src/backtrace.h b/src/backtrace.h index 973466a0..bfdc8583 100644 --- a/src/backtrace.h +++ b/src/backtrace.h @@ -20,6 +20,6 @@ * */ #ifdef __GLIBC__ -void __iwd_backtrace_init(const char *program); +void __iwd_backtrace_init(); void __iwd_backtrace_print(unsigned int offset); #endif diff --git a/src/main.c b/src/main.c index a75b3a34..3eb79486 100644 --- a/src/main.c +++ b/src/main.c @@ -197,7 +197,7 @@ int main(int argc, char *argv[]) l_debug_enable("*"); #ifdef __GLIBC__ - __iwd_backtrace_init(argv[0]); + __iwd_backtrace_init(); #endif l_info("Wireless daemon version %s", VERSION);