[pulseaudio-discuss] [RFCv3 41/43] module: Create pa_module_exists()
jprvita at gmail.com
jprvita at gmail.com
Fri Sep 13 16:34:48 PDT 2013
From: João Paulo Rechi Vita <jprvita at openbossa.org>
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..3708fae 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 (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
More information about the pulseaudio-discuss
mailing list