tCode added to scan the plugins directory and try to load anything that fits th… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit fa1f616f2d2c004b76502c61ed3f2ea026311e02 | |
parent 93a4266fc985b6405024b7b0677c440993e3833c | |
Author: Ben Webb <[email protected]> | |
Date: Mon, 13 May 2002 15:37:55 +0000 | |
Code added to scan the plugins directory and try to load anything that | |
fits the libfoo.so pattern. | |
Diffstat: | |
M src/sound.c | 73 ++++++++++++++++++++++++++---… | |
1 file changed, 61 insertions(+), 12 deletions(-) | |
--- | |
diff --git a/src/sound.c b/src/sound.c | |
t@@ -27,6 +27,9 @@ | |
#include <glib.h> | |
#ifdef PLUGINS | |
+#include <sys/types.h> | |
+#include <dirent.h> | |
+#include <string.h> | |
#include <dlfcn.h> | |
#else | |
#include "plugins/sound_sdl.h" | |
t@@ -48,23 +51,69 @@ static void AddPlugin(InitFunc ifunc) | |
} | |
} | |
-void SoundInit(void) | |
-{ | |
#ifdef PLUGINS | |
+static void OpenModule(const gchar *modname, const gchar *fullname) | |
+{ | |
InitFunc ifunc; | |
- | |
- soundmodule = dlopen("libsound_esd.so", RTLD_NOW); | |
- if (!soundmodule) { | |
- /* FIXME: using dlerror() here causes a segfault later in the program */ | |
- g_print("dlopen failed\n"); | |
- return; | |
+ gint len = strlen(modname); | |
+ | |
+ if (len > 6 && strncmp(modname, "lib", 3) == 0 | |
+ && strcmp(modname + len - 3, ".so") == 0) { | |
+ GString *funcname; | |
+ | |
+ soundmodule = dlopen(fullname, RTLD_NOW); | |
+ if (!soundmodule) { | |
+ /* FIXME: using dlerror() here causes a segfault later in the program */ | |
+ g_print("dlopen of %s failed: %s\n", fullname, dlerror()); | |
+ return; | |
+ } | |
+ g_print("%s opened OK\n", fullname); | |
+ | |
+ funcname = g_string_new(modname); | |
+ g_string_truncate(funcname, len - 3); | |
+ g_string_erase(funcname, 0, 3); | |
+ g_string_append(funcname, "_init"); | |
+ ifunc = dlsym(soundmodule, funcname->str); | |
+ if (ifunc) { | |
+ AddPlugin(ifunc); | |
+ } else { | |
+ g_print("dlsym (%s) failed: %s\n", funcname->str, dlerror()); | |
+ } | |
+ g_string_free(funcname, TRUE); | |
} | |
- ifunc = dlsym(soundmodule, "sound_esd_init"); | |
- if (ifunc) { | |
- AddPlugin(ifunc); | |
+} | |
+ | |
+static void ScanPluginDir(const gchar *dirname) | |
+{ | |
+ DIR *dir; | |
+ | |
+ dir = opendir(dirname); | |
+ if (dir) { | |
+ struct dirent *fileinfo; | |
+ GString *modname; | |
+ | |
+ modname = g_string_new(""); | |
+ do { | |
+ fileinfo = readdir(dir); | |
+ if (fileinfo) { | |
+ g_string_assign(modname, dirname); | |
+ g_string_append_c(modname, G_DIR_SEPARATOR); | |
+ g_string_append(modname, fileinfo->d_name); | |
+ OpenModule(fileinfo->d_name, modname->str); | |
+ } | |
+ } while (fileinfo); | |
+ g_string_free(modname, TRUE); | |
+ closedir(dir); | |
} else { | |
- g_print("dlsym failed: %s\n", dlerror()); | |
+ g_print("Cannot open dir %s\n", dirname); | |
} | |
+} | |
+#endif | |
+ | |
+void SoundInit(void) | |
+{ | |
+#ifdef PLUGINS | |
+ ScanPluginDir("src/plugins/.libs"); | |
#else | |
#ifdef HAVE_ESD | |
AddPlugin(sound_esd_init); |