diff options
Diffstat (limited to 'winnie/src/client_plugins.cc')
-rw-r--r-- | winnie/src/client_plugins.cc | 148 |
1 files changed, 77 insertions, 71 deletions
diff --git a/winnie/src/client_plugins.cc b/winnie/src/client_plugins.cc index a9f0cf8..3bb0c5f 100644 --- a/winnie/src/client_plugins.cc +++ b/winnie/src/client_plugins.cc @@ -19,94 +19,100 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. Author: Eleni Maria Stea <elene.mst@gmail.com> */ +#include "client_plugins.h" +#include <ctype.h> +#include <dlfcn.h> +#include <errno.h> #include <stdio.h> #include <string.h> -#include <errno.h> -#include <ctype.h> #include <vector> -#include <dlfcn.h> -#include "client_plugins.h" struct Plugin { - void *so; + void *so; - bool (*init)(); - void (*cleanup)(); + bool (*init)(); + void (*cleanup)(); }; static char *strip_wspace(char *s); static std::vector<Plugin> plugins; -bool init_client_plugins() +bool +init_client_plugins() { - FILE *fp = fopen("plugins.conf", "r"); - if(!fp) { - fprintf(stderr, "failed to load plugin list: plugins.conf: %s\n", strerror(errno)); - return false; - } - - plugins.clear(); - - char buf[512]; - while(fgets(buf, sizeof buf, fp)) { - char *line = strip_wspace(buf); - - if(!*line || *line == '#') { - continue; - } - - Plugin plugin; - - plugin.so = dlopen(line, RTLD_LAZY); - if(!plugin.so) { - fprintf(stderr, "failed to load plugin: %s: %s\n", line, dlerror()); - continue; - } - - if(!(plugin.init = (bool (*)())dlsym(plugin.so, "init"))) { - fprintf(stderr, "invalid plugin: %s: no init function\n", line); - dlclose(plugin.so); - continue; - } - plugin.cleanup = (void (*)())dlsym(plugin.so, "cleanup"); - - if(!plugin.init()) { - fprintf(stderr, "failed to initialize plugin: %s\n", line); - dlclose(plugin.so); - continue; - } - - printf("loaded plugin: %s\n", line); - plugins.push_back(plugin); - } - - fclose(fp); - return true; + FILE *fp = fopen("plugins.conf", "r"); + if (!fp) { + fprintf(stderr, + "failed to load plugin list: plugins.conf: %s\n", + strerror(errno)); + return false; + } + + plugins.clear(); + + char buf[512]; + while (fgets(buf, sizeof buf, fp)) { + char *line = strip_wspace(buf); + + if (!*line || *line == '#') { + continue; + } + + Plugin plugin; + + plugin.so = dlopen(line, RTLD_LAZY); + if (!plugin.so) { + fprintf(stderr, "failed to load plugin: %s: %s\n", line, dlerror()); + continue; + } + + if (!(plugin.init = (bool (*)()) dlsym(plugin.so, "init"))) { + fprintf(stderr, "invalid plugin: %s: no init function\n", line); + dlclose(plugin.so); + continue; + } + plugin.cleanup = (void (*)()) dlsym(plugin.so, "cleanup"); + + if (!plugin.init()) { + fprintf(stderr, "failed to initialize plugin: %s\n", line); + dlclose(plugin.so); + continue; + } + + printf("loaded plugin: %s\n", line); + plugins.push_back(plugin); + } + + fclose(fp); + return true; } -void destroy_client_plugins() +void +destroy_client_plugins() { - for(size_t i=0; i<plugins.size(); i++) { - if(plugins[i].cleanup) { - plugins[i].cleanup(); - } - dlclose(plugins[i].so); - } - plugins.clear(); + for (size_t i = 0; i < plugins.size(); i++) { + if (plugins[i].cleanup) { + plugins[i].cleanup(); + } + dlclose(plugins[i].so); + } + plugins.clear(); } -static char *strip_wspace(char *s) +static char * +strip_wspace(char *s) { - if(!s || !*s) { - return s; - } - - while(*s && isspace(*s)) s++; - - char *endp = s + strlen(s) - 1; - while(*endp && isspace(*endp)) { - *endp-- = 0; - } - return s; + if (!s || !*s) { + return s; + } + + while (*s && isspace(*s)) + s++; + + char *endp = s + strlen(s) - 1; + while (*endp && isspace(*endp)) { + *endp-- = 0; + } + return s; } |