diff options
Diffstat (limited to 'src/daemon/ltdl-bind-now.c')
| -rw-r--r-- | src/daemon/ltdl-bind-now.c | 110 | 
1 files changed, 29 insertions, 81 deletions
diff --git a/src/daemon/ltdl-bind-now.c b/src/daemon/ltdl-bind-now.c index 92e5d40d..8444cfb4 100644 --- a/src/daemon/ltdl-bind-now.c +++ b/src/daemon/ltdl-bind-now.c @@ -1,7 +1,7 @@  /***    This file is part of PulseAudio. -  Copyright 2004-2006 Lennart Poettering +  Copyright 2004-2008 Lennart Poettering    Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB    PulseAudio is free software; you can redistribute it and/or modify @@ -39,8 +39,6 @@  #include <pulse/i18n.h>  #include <pulsecore/macro.h> -#include <pulsecore/mutex.h> -#include <pulsecore/thread.h>  #include <pulsecore/log.h>  #include "ltdl-bind-now.h" @@ -53,30 +51,6 @@  #undef PA_BIND_NOW  #endif -#ifdef HAVE_LT_DLMUTEX_REGISTER - -static pa_mutex *libtool_mutex = NULL; - -static void libtool_lock(void) { -    pa_mutex_lock(libtool_mutex); -} - -static void libtool_unlock(void) { -    pa_mutex_unlock(libtool_mutex); -} - -#endif - -PA_STATIC_TLS_DECLARE_NO_FREE(libtool_tls); - -static void libtool_set_error(const char *error) { -    PA_STATIC_TLS_SET(libtool_tls, (char*) error); -} - -static const char *libtool_get_error(void) { -    return PA_STATIC_TLS_GET(libtool_tls); -} -  #ifdef PA_BIND_NOW  /* @@ -91,20 +65,13 @@ static const char *libtool_get_error(void) {    to set $LT_BIND_NOW before starting the pulsaudio binary.  */ -#ifndef HAVE_LT_DLADVISE -static lt_module bind_now_open(lt_user_data d, const char *fname) -#else -static lt_module bind_now_open(lt_user_data d, const char *fname, lt_dladvise advise) -#endif -{ +static lt_module bind_now_open(lt_user_data d, const char *fname, lt_dladvise advise) {      lt_module m;      pa_assert(fname);      if (!(m = dlopen(fname, PA_BIND_NOW))) { -#ifdef HAVE_LT_DLMUTEX_REGISTER -        libtool_set_error(dlerror()); -#endif +        lt_dlseterror(LT_ERROR_CANNOT_OPEN);          return NULL;      } @@ -116,9 +83,7 @@ static int bind_now_close(lt_user_data d, lt_module m) {      pa_assert(m);      if (dlclose(m) != 0){ -#ifdef HAVE_LT_DLMUTEX_REGISTER -        libtool_set_error(dlerror()); -#endif +        lt_dlseterror(LT_ERROR_CANNOT_CLOSE);          return 1;      } @@ -132,78 +97,61 @@ static lt_ptr bind_now_find_sym(lt_user_data d, lt_module m, const char *symbol)      pa_assert(symbol);      if (!(ptr = dlsym(m, symbol))) { -#ifdef HAVE_LT_DLMUTEX_REGISTER -        libtool_set_error(dlerror()); -#endif +        lt_dlseterror(LT_ERROR_SYMBOL_NOT_FOUND);          return NULL;      }      return ptr;  } +static lt_dlvtable *bindnow_loader = NULL;  #endif  void pa_ltdl_init(void) {  #ifdef PA_BIND_NOW -# ifdef HAVE_STRUCT_LT_USER_DLLOADER -    lt_dlloader *place; -    static const struct lt_user_dlloader loader = { -        .module_open = bind_now_open, -        .module_close = bind_now_close, -        .find_sym = bind_now_find_sym -    }; -# else -    static const lt_dlvtable *dlopen_loader; -    static lt_dlvtable bindnow_loader; -# endif +    const lt_dlvtable *dlopen_loader;  #endif      pa_assert_se(lt_dlinit() == 0); -#ifdef HAVE_LT_DLMUTEX_REGISTER -    pa_assert_se(libtool_mutex = pa_mutex_new(TRUE, FALSE)); -    pa_assert_se(lt_dlmutex_register(libtool_lock, libtool_unlock, libtool_set_error, libtool_get_error) == 0); -#endif -  #ifdef PA_BIND_NOW -# ifdef HAVE_STRUCT_LT_USER_DLLOADER - -    if (!(place = lt_dlloader_find("dlopen"))) -        place = lt_dlloader_next(NULL); - -    /* Add our BIND_NOW loader as the default module loader. */ -    if (lt_dlloader_add(place, &loader, "bind-now-loader") != 0) -        pa_log_warn(_("Failed to add bind-now-loader.")); -# else      /* Already initialised */ -    if (dlopen_loader) +    if (bindnow_loader)          return; -    if (!(dlopen_loader = lt_dlloader_find("dlopen"))) { -        pa_log_warn(_("Failed to find original dlopen loader.")); +    if (!(dlopen_loader = lt_dlloader_find((char*) "lt_dlopen"))) { +        pa_log_warn(_("Failed to find original lt_dlopen loader."));          return;      } -    memcpy(&bindnow_loader, dlopen_loader, sizeof(bindnow_loader)); -    bindnow_loader.name = "bind-now-loader"; -    bindnow_loader.module_open = bind_now_open; -    bindnow_loader.module_close = bind_now_close; -    bindnow_loader.find_sym = bind_now_find_sym; -    bindnow_loader.priority = LT_DLLOADER_PREPEND; +    if (!(bindnow_loader = malloc(sizeof(lt_dlvtable)))) { +        pa_log_error(_("Failed to allocate new dl loader.")); +        return; +    } + +    memcpy(bindnow_loader, dlopen_loader, sizeof(*bindnow_loader)); +    bindnow_loader->name = "bind-now-loader"; +    bindnow_loader->module_open = bind_now_open; +    bindnow_loader->module_close = bind_now_close; +    bindnow_loader->find_sym = bind_now_find_sym; +    bindnow_loader->priority = LT_DLLOADER_PREPEND;      /* Add our BIND_NOW loader as the default module loader. */ -    if (lt_dlloader_add(&bindnow_loader) != 0) +    if (lt_dlloader_add(bindnow_loader) != 0) {          pa_log_warn(_("Failed to add bind-now-loader.")); -# endif +        free(bindnow_loader); +        bindnow_loader = NULL; +    }  #endif  }  void pa_ltdl_done(void) {      pa_assert_se(lt_dlexit() == 0); -#ifdef HAVE_LT_DLMUTEX_REGISTER -    pa_mutex_free(libtool_mutex); -    libtool_mutex = NULL; +#ifdef PA_BIND_NOW +    /* lt_dlexit() will free our loader vtable, hence reset our +     * pointer to it here */ +    bindnow_loader = NULL;  #endif  }  | 
