From ea8a13dfa2a25f52cc245a8992fbff5d1e41106d Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 5 Sep 2009 13:00:55 -0400 Subject: work on tieing it all together --- wrapper/plugin.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 wrapper/plugin.c (limited to 'wrapper/plugin.c') diff --git a/wrapper/plugin.c b/wrapper/plugin.c new file mode 100644 index 0000000..c5d8f38 --- /dev/null +++ b/wrapper/plugin.c @@ -0,0 +1,128 @@ +/* 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.c_SEEN +#define FILE_plugin.c_SEEN + +#include +#include /* EXIT_FAILURE */ +#include /* file acces */ +#include + +#include +#include + +#include +#include + +/*#include "rvs.h"*/ +#include "plugin.h" + +/* finds a plugin with `name'. Start looking at `plugin' (linked list) */ +struct plugin * +_plugin_find_plugin(struct plugin *plugin, char *name) +{ + if (strcmp(plugin->name,name) == 0) { + return plugin; + } else { + if (plugin->next==NULL) { + error(EXIT_FAILURE,0,"cannot find plugin `%s'",name); + return NULL; + } else { + return _plugin_find_plugin(plugin->next,name); + } + } +} + +/* finds a command with `name'. Start looking at `command' (linked list) */ +struct plugin_command * +_plugin_find_command(struct plugin_command *command, char *name) +{ + if (strcmp(command->name,name) == 0) { + return command; + } else { + if (command->p_next==NULL) { + error(EXIT_FAILURE,0, + "plugin `%s' does not contain command `%s'", + command->plugin->name,name); + return NULL; + } else { + return _plugin_find_command(command->p_next,name); + } + } +} + +#include "plugin-parse.c" +#include "plugin-depend.c" + +struct plugin * +_plugin_load (char *plug_name, char *plugin_conf) +{ + struct plugin *plugin=(struct plugin *)xmalloc(sizeof(*plugin)); + char *plug_name2 = (char *)xmalloc(strlen(plug_name)+1); + strcpy(plug_name2,plug_name); + plugin->name=plug_name2; + plugin->next=NULL; + + xchdir(plug_name); + FILE *file = xfopen(plugin_conf,"r"); + + plugin->child=_plugin_parse(plugin, file); + + fclose( file ); + xchdir(".."); + return plugin; +} + +struct plugin_tree * +load_plugins (char *libexecdir, char *plugin_conf) +{ + struct plugin_tree *tree=(struct plugin_tree *)xmalloc(sizeof(*tree)); + struct plugin **last=&tree->plugins; + *last=NULL; + struct plugin *plugin; + + xchdir(libexecdir); + + DIR *cwd; + struct dirent *dirent; + int serr; + struct stat sbuf; + cwd = xopendir ("./"); + 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); + *last=plugin;/* this sets the last's `next' */ + last=&plugin->next; + } + } + } + closedir (cwd); + + _plugin_depend(tree); + + xchdir(".."); + return tree; +} + +#endif + -- cgit v1.2.3-2-g168b