util: Try finding out application name using dladdr if available
authorFelipe Sateler <fsateler@debian.org>
Sat, 11 Oct 2014 04:34:23 +0000 (01:34 -0300)
committerDavid Henningsson <david.henningsson@canonical.com>
Thu, 16 Oct 2014 13:57:21 +0000 (15:57 +0200)
This fixes getting the binary name in the Hurd, or any other port using
the GNU C library, but only in the case where the library is directly
linked to. Opening with dlopen will not work.

Change in v3: reorder header includes and definitions
Change in v2: use a weak reference to main, so that we
don't crash when main cannot be found.

configure.ac
src/pulse/util.c

index f13ddb0..74bea71 100644 (file)
@@ -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         #
index ace698c..d672f53 100644 (file)
 
 #include "util.h"
 
+#if defined(HAVE_DLADDR) && defined(PA_GCC_WEAKREF)
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+#include <dlfcn.h>
+
+static int _main() PA_GCC_WEAKREF(main);
+#endif
+
 char *pa_get_user_name(char *s, size_t l) {
     const char *p;
     char *name = NULL;
@@ -218,6 +227,20 @@ char *pa_get_binary_name(char *s, size_t l) {
     }
 #endif
 
+#if defined(HAVE_DLADDR) && defined(PA_GCC_WEAKREF)
+    {
+        Dl_info info;
+        if(_main) {
+            int err = dladdr(&_main, &info);
+            if (err != 0) {
+                char *p = pa_realpath(info.dli_fname);
+                if (p)
+                    return p;
+            }
+        }
+    }
+#endif
+
 #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
     {