From: Jo?o Paulo Rechi Vita <jprvita@xxxxxxxxxxxxx> This new function checks if a certain module name is available in the system. --- configure.ac | 1 + src/pulsecore/module.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/pulsecore/module.h | 2 ++ 3 files changed, 58 insertions(+) diff --git a/configure.ac b/configure.ac index dd07a78..42cb8b8 100644 --- a/configure.ac +++ b/configure.ac @@ -1217,6 +1217,7 @@ PACTL_BINARY=${bindir}/pactl${EXEEXT} AX_DEFINE_DIR(PACTL_BINARY, PACTL_BINARY, [Location of pactl binary]) AC_SUBST(PA_SOEXT, [.so]) +AC_DEFINE(PA_SOEXT, [".so"], [Shared object extension]) AC_SUBST(pulseconfdir, ["${sysconfdir}/pulse"]) AX_DEFINE_DIR(PA_DEFAULT_CONFIG_DIR, pulseconfdir, [Location of configuration files]) diff --git a/src/pulsecore/module.c b/src/pulsecore/module.c index 16582b3..c57acac 100644 --- a/src/pulsecore/module.c +++ b/src/pulsecore/module.c @@ -28,6 +28,7 @@ #include <stdlib.h> #include <string.h> #include <errno.h> +#include <ltdl.h> #include <pulse/xmalloc.h> #include <pulse/proplist.h> @@ -47,6 +48,60 @@ #define PA_SYMBOL_GET_N_USED "pa__get_n_used" #define PA_SYMBOL_GET_DEPRECATE "pa__get_deprecated" +bool pa_module_exists(const char *name) { + const char *paths, *state = NULL; + char *n, *p, *pathname; + bool result; + + pa_assert(name); + + if (name[0] == PA_PATH_SEP_CHAR) { + result = access(name, F_OK) == 0 ? true : false; + pa_log_debug("Checking for existence of '%s': %s", name, result ? "success" : "failure"); + if (result) + return true; + } + + if (!(paths = lt_dlgetsearchpath())) + return false; + + /* strip .so from the end of name, if present */ + n = pa_xstrdup(name); + p = rindex(n, '.'); + if (p && pa_streq(p, PA_SOEXT)) + p[0] = 0; + + while ((p = pa_split(paths, ":", &state))) { + pathname = pa_sprintf_malloc("%s" PA_PATH_SEP "%s" PA_SOEXT, p, n); + result = access(pathname, F_OK) == 0 ? true : false; + pa_log_debug("Checking for existence of '%s': %s", pathname, result ? "success" : "failure"); + pa_xfree(pathname); + pa_xfree(p); + if (result) { + pa_xfree(n); + return true; + } + } + + state = NULL; + if (PA_UNLIKELY(pa_run_from_build_tree())) { + while ((p = pa_split(paths, ":", &state))) { + pathname = pa_sprintf_malloc("%s" PA_PATH_SEP ".libs" PA_PATH_SEP "%s" PA_SOEXT, p, n); + result = access(pathname, F_OK) == 0 ? true : false; + pa_log_debug("Checking for existence of '%s': %s", pathname, result ? "success" : "failure"); + pa_xfree(pathname); + pa_xfree(p); + if (result) { + pa_xfree(n); + return true; + } + } + } + + pa_xfree(n); + return false; +} + pa_module* pa_module_load(pa_core *c, const char *name, const char *argument) { pa_module *m = NULL; bool (*load_once)(void); diff --git a/src/pulsecore/module.h b/src/pulsecore/module.h index 5a330c6..af4e9d2 100644 --- a/src/pulsecore/module.h +++ b/src/pulsecore/module.h @@ -50,6 +50,8 @@ struct pa_module { pa_proplist *proplist; }; +bool pa_module_exists(const char *name); + pa_module* pa_module_load(pa_core *c, const char *name, const char *argument); void pa_module_unload(pa_core *c, pa_module *m, bool force); -- 1.8.3.1