/* * Copyright 2003 Niels Provos * All rights reserved. * * This program 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 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * This program 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 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * Copyright 2003 Christian Kreibich * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include "plugins_config.h" #include "plugins.h" /* All plugins are simply stored in an array, as * we don't have to access them very often -- any direct * interactions with the plugin are set up by the plugins * themselves via hooks as defined in hooks.h. */ HONEYD_PLUGINS_DECLARE; struct honeyd_plugin *plugins[] = { HONEYD_PLUGINS NULL }; /* The following are the dummy operations we always hook * into newly created plugins */ static int plugin_dummy_init(void) { return 0; } /** * plugin_hook_up - hooks in symbols from dlopenend modules. * @plugin: plugin to hook up. * * The function tries to hook the callback functions that * define a plugin's characteristics into the @plugin structure, * then initializes the plugin. Note that the callbacks are * all initialized with dummy operations so even if we encounter * a bad plugin, we should still be safe. */ static void plugin_hook_up(struct honeyd_plugin *plugin) { const struct honeyd_plugin_cfg *cfg; if (plugin->name == NULL) plugin->name = "Unnamed plugin."; if (plugin->description == NULL) plugin->description = "No description given."; if (plugin->author == NULL) plugin->author = "No author(s) specified."; if (plugin->version == NULL) plugin->version = "No version specified."; if (plugin->init == NULL) plugin->init = plugin_dummy_init; cfg = plugins_config_find_item(plugin->name, "enable", HD_CONFIG_INT); if (cfg == NULL || cfg->cfg_int == 0) return; syslog(LOG_INFO, "registering plugin '%s' (%s)", plugin->name, plugin->version); plugin->init(); } void plugins_init(void) { struct honeyd_plugin *plugin, **iter = plugins; for (plugin = *iter; plugin; plugin = *++iter) plugin_hook_up(plugin); } struct honeyd_plugin * plugins_find(const char *name) { struct honeyd_plugin *plugin, **iter = plugins; for (plugin = *iter; plugin; plugin = *++iter) { if (strcasecmp(name, plugin->name) == 0) return (plugin); } return (NULL); }