X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Frest-api.c;h=da331678f4dfb1dad99fe27029fca67d46c30b40;hb=98f5843474dcec55827279b6f42007341c171ae0;hp=1635d445415c07c7cf46647b0d3499ff94288be9;hpb=03bebc12f0fd5006a72e430084146a36d2db7c8d;p=src%2Fapp-framework-binder.git diff --git a/src/rest-api.c b/src/rest-api.c index 1635d445..da331678 100644 --- a/src/rest-api.c +++ b/src/rest-api.c @@ -22,6 +22,8 @@ #include "../include/local-def.h" +#include +#include #include #include @@ -629,20 +631,46 @@ STATIC AFB_plugin ** RegisterJsonPlugins(AFB_plugin **plugins) { } void initPlugins(AFB_session *session) { - static AFB_plugin * plugins[10]; + static AFB_plugin **plugins; + AFB_plugin* (*pluginRegisterFct)(void); + void *plugin; + char *pluginPath; + struct dirent *pluginDir; + DIR *dir; afbJsonType = json_object_new_string (AFB_MSG_JTYPE); int i = 0; - plugins[i++] = tokenRegister(session); - plugins[i++] = helloWorldRegister(session); - plugins[i++] = samplePostRegister(session); -#ifdef HAVE_AUDIO_PLUGIN - plugins[i++] = audioRegister(session); -#endif -#ifdef HAVE_RADIO_PLUGIN - plugins[i++] = radioRegister(session), -#endif + if ((dir = opendir(PLUGIN_INSTALL_DIR)) == NULL) { + fprintf(stderr, "Could not open plugin directory=%s\n", PLUGIN_INSTALL_DIR); + return; + } + + while ((pluginDir = readdir(dir)) != NULL) { + + if (!strstr (pluginDir->d_name, ".so")) + continue; + + asprintf (&pluginPath, PLUGIN_INSTALL_DIR "/%s", pluginDir->d_name); + plugin = dlopen (pluginPath, RTLD_NOW | RTLD_LOCAL); + pluginRegisterFct = dlsym (plugin, "pluginRegister"); + free (pluginPath); + if (!plugin) { + if (verbose) fprintf(stderr, "[%s] is not a binary plugin, continuing...\n", pluginDir->d_name); + continue; + } else if (!pluginRegisterFct) { + if (verbose) fprintf(stderr, "[%s] is not an AFB plugin, continuing...\n", pluginDir->d_name); + continue; + } + + if (verbose) fprintf(stderr, "[%s] is a valid AFB plugin, loading it\n", pluginDir->d_name); + plugins = (AFB_plugin **) realloc (plugins, (i+1)*sizeof(AFB_plugin)); + plugins[i] = (AFB_plugin *) malloc (sizeof(AFB_plugin)); + plugins[i] = (**pluginRegisterFct)(); + i++; + } plugins[i++] = NULL; + + closedir (dir); // complete plugins and save them within current sessions session->plugins = RegisterJsonPlugins(plugins);