On 2014-08-30 02:00, Felipe Sateler wrote:
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.
Hi Felipe,
Do you recognise this code would help something else than hurd? If not,
I think it would be safer to other OSes and compilers to have everything
you add inside an "ifdef hurd" section.
If it would help other OSes, at least the
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
and
#include <dlfcn.h>
...should be inside "#if defined(HAVE_DLADDR) &&
defined(PA_GCC_WEAKREF)" quotes just like the rest of code you add,
preferable all in one section, like this:
#if defined(HAVE_DLADDR) && defined(PA_GCC_WEAKREF)
/* This makes pa_get_binary_name work on Hurd */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
#include <dlfcn.h>
static int _main() PA_GCC_WEAKREF(main);
#endif
Change since last version: use a weak reference to main, so that we
don't crash when main cannot be found.
---
configure.ac | 2 ++
src/pulse/util.c | 24 ++++++++++++++++++++++++
2 files changed, 26 insertions(+)
diff --git a/configure.ac b/configure.ac
index 7b56210..e8e2034 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..9b76661 100644
--- a/src/pulse/util.c
+++ b/src/pulse/util.c
@@ -24,6 +24,10 @@
#include <config.h>
#endif
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+
#include <errno.h>
#include <limits.h>
#include <stdio.h>
@@ -32,6 +36,7 @@
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
+#include <dlfcn.h>
#ifdef HAVE_PWD_H
#include <pwd.h>
@@ -64,6 +69,10 @@
#include "util.h"
+#if defined(HAVE_DLADDR) && defined(PA_GCC_WEAKREF)
+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,21 @@ 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;
+ }
Unnecessary parenthesis around "return p".
+ }
+ }
+ }
+#endif
+
#if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
{
--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
_______________________________________________
pulseaudio-discuss mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss