From: Jo?o Paulo Rechi Vita <jprvita@xxxxxxxxxxxxx> This new function checks if a certain module name is available in the system. --- src/pulsecore/module.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/pulsecore/module.h | 2 ++ 2 files changed, 51 insertions(+) diff --git a/src/pulsecore/module.c b/src/pulsecore/module.c index 16582b3..bc53f07 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,54 @@ #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 *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 */ + p = rindex(name, '.'); + if (p && pa_streq(p, ".so")) + p[0] = 0; + + while ((p = pa_split(paths, ":", &state))) { + pathname = pa_sprintf_malloc("%s" PA_PATH_SEP "%s.so", p, name); + 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) + 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.so", p, name); + 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) + return true; + } + } + + 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