summaryrefslogtreecommitdiff
path: root/wrapper/plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'wrapper/plugin.c')
-rw-r--r--wrapper/plugin.c128
1 files changed, 128 insertions, 0 deletions
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 <stdio.h>
+#include <stdlib.h> /* EXIT_FAILURE */
+#include <unistd.h> /* file acces */
+#include <string.h>
+
+#include <errno.h>
+#include <error.h>
+
+#include <dirent.h>
+#include <sys/stat.h>
+
+/*#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
+