On Wed, Sep 10, 2014 at 4:37 AM, David Henningsson <david.henningsson at canonical.com> wrote: > > > 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. In theory, it helps, in practice it doesn't. This should work with any glibc-based build. However, at the moment there are only linux (with other code path), kfreebsd (same) and hurd (addressed by this patch) systems using glibc. I heard some people were trying to build a debian GNU/Minix, but I don't think they have gone very far yet. > > 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 > OK, will do this. >> >> 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". Oops, will fix. > >> + } >> + } >> + } >> +#endif >> + >> #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME) >> { >> >> > -- Saludos, Felipe Sateler