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