/* 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