diff options
Diffstat (limited to 'wrapper/plugin-load.h')
-rw-r--r-- | wrapper/plugin-load.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/wrapper/plugin-load.h b/wrapper/plugin-load.h new file mode 100644 index 0000000..504057c --- /dev/null +++ b/wrapper/plugin-load.h @@ -0,0 +1,97 @@ +/* wrapper/plugin-load.h -- load rvs plugins into mem + system depens: <string.h> <unistd.h> <dirent.h> <sys/stat.h> <error.h> + Copyright (C) 2009 Luke Shumaker + + This file is part of rvs. + + rvs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your + option) any later version. + + rvs is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with rvs; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +#ifndef FILE_plugin_load_h_SEEN +#define FILE_plugin_load_h_SEEN + +#include "rvs.h" +#include "plugins.h" +#include "plugin-parse.h" + +/*- plugin_load ----------------------------------------------------*\ + assume we're in rvs's libexecdir, where plugins are + now, load plugin plug_name, +\* whose configuration file is plugin_conf */ +struct plugin * +plugin_load (const char *plug_name, const char *plugin_conf) +{ + struct plugin *plugin=xmalloc( sizeof(*plugin) ); + plugin->name=stralloc(plug_name); + puts(plugin->name); + plugin->next=NULL; + + xchdir(plug_name); + FILE *file = xfopen(plugin_conf,"r"); + plugin->commands=plugin_parse(file); + fclose( file ); + xchdir(".."); + + return plugin; +} + +/*- load_plugins ---------------------------------------------------*\ + Load all the plugins in `libexecdir' + Use `plugin_conf' as the name of the config file for each plugin + Note that the method we use to loop through all the directories in + `libexecdir' is a horible kludge, uses a ton of system functions, +\* and generally needs to be rewritten. */ +#include <string.h> +#include <unistd.h> +#include <dirent.h> +#include <sys/stat.h> +#include <error.h> + +struct plugin * +load_plugins (const char *libexecdir, const char *plugin_conf) +{ + struct plugin *first=NULL; /* we return this */ + struct plugin **prev=&first; /* this is the previous plugin->next */ + struct plugin *plugin; /* this is the current plugin */ + + xchdir(libexecdir); + + /* Yeah, I know this next bit is pretty ugly. */ + DIR *cwd; + struct dirent *dirent; + int serr; + struct stat sbuf; + const char *dirname="./"; + cwd = opendir (dirname); + if (cwd == NULL) error(EXIT_FAILURE,errno,"%s/",dirname); + while ( (dirent = readdir (cwd)) != NULL ) { + if ((strcmp(dirent->d_name,"." )!=0)&& + (strcmp(dirent->d_name,"..")!=0)) { + serr = stat(dirent->d_name, &sbuf); + if (!serr && S_ISDIR(sbuf.st_mode)) { + plugin=plugin_load(dirent->d_name,plugin_conf); + *prev=plugin;/* this sets the last's `next' */ + prev=&plugin->next; + } + } + } + closedir (cwd); + + xchdir(".."); + return first; +} + +#endif + |