--- configure.ac | 2 ++ src/pulse/util.c | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/configure.ac b/configure.ac index 837e81e..2b011fb 100644 --- a/configure.ac +++ b/configure.ac @@ -580,6 +580,8 @@ AC_SYS_LARGEFILE # Check for open64 to know if the current system does have open64() and similar functions AC_CHECK_FUNCS_ONCE([open64]) +AC_SEARCH_LIBS([dladdr], [dl], [HAVE_DLADDR=1], [HAVE_DLADDR=0]) +AC_DEFINE(HAVE_DLADDR, [1], [Have dladdr?]) ################################### # External libraries # diff --git a/src/pulse/util.c b/src/pulse/util.c index ace698c..67e23dc 100644 --- a/src/pulse/util.c +++ b/src/pulse/util.c @@ -32,6 +32,7 @@ #include <time.h> #include <unistd.h> #include <sys/types.h> +#include <dlfcn.h> #ifdef HAVE_PWD_H #include <pwd.h> @@ -64,6 +65,10 @@ #include "util.h" +#ifdef HAVE_DLADDR +extern int main(int, char*[]); +#endif + char *pa_get_user_name(char *s, size_t l) { const char *p; char *name = NULL; @@ -218,6 +223,19 @@ char *pa_get_binary_name(char *s, size_t l) { } #endif +#ifdef HAVE_DLADDR + { + Dl_info DLInfo; + int err = dladdr(&main, &DLInfo); + if (err != 0) { + char *p = pa_realpath(DLInfo.dli_fname); + if (p) { + return p; + } + } + } +#endif + #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME) { -- 2.1.0.rc1