Annotation of embedaddon/strongswan/src/libstrongswan/plugins/plugin_loader.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2012-2014 Tobias Brunner
! 3: * Copyright (C) 2007 Martin Willi
! 4: * HSR Hochschule fuer Technik Rapperswil
! 5: *
! 6: * This program is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2 of the License, or (at your
! 9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 10: *
! 11: * This program is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 14: * for more details.
! 15: */
! 16:
! 17: /**
! 18: * @defgroup plugin_loader plugin_loader
! 19: * @{ @ingroup plugins
! 20: */
! 21:
! 22: #ifndef PLUGIN_LOADER_H_
! 23: #define PLUGIN_LOADER_H_
! 24:
! 25: typedef struct plugin_loader_t plugin_loader_t;
! 26:
! 27: #include <collections/enumerator.h>
! 28: #include <utils/debug.h>
! 29:
! 30: /* to avoid circular references we can't include plugin_feature.h */
! 31: struct plugin_feature_t;
! 32:
! 33: /**
! 34: * The plugin_loader loads plugins from a directory and initializes them
! 35: */
! 36: struct plugin_loader_t {
! 37:
! 38: /**
! 39: * Add static plugin features, not loaded via plugins.
! 40: *
! 41: * Similar to features provided by plugins they are evaluated during load(),
! 42: * and unloaded when unload() is called.
! 43: *
! 44: * If critical is TRUE load() will fail if any of the added features could
! 45: * not be loaded.
! 46: *
! 47: * If a reload callback function is given, it gets invoked for the
! 48: * registered feature set when reload() is invoked on the plugin_loader.
! 49: *
! 50: * @note The name should be unique otherwise a plugin with the same name is
! 51: * not loaded.
! 52: *
! 53: * @param name name of the component adding the features
! 54: * @param features array of plugin features
! 55: * @param count number of features in the array
! 56: * @param critical TRUE if the features are critical
! 57: * @param reload feature reload callback, or NULL
! 58: * @param reload_data user data to pass to reload callback
! 59: */
! 60: void (*add_static_features) (plugin_loader_t *this, const char *name,
! 61: struct plugin_feature_t *features, int count,
! 62: bool critical, bool (*reload)(void*),
! 63: void *reload_data);
! 64:
! 65: /**
! 66: * Load a list of plugins.
! 67: *
! 68: * Each plugin in list may have an ending exclamation mark (!) to mark it
! 69: * as a critical plugin. If loading a critical plugin fails, plugin loading
! 70: * is aborted and FALSE is returned.
! 71: *
! 72: * Additional paths can be added with add_path(), these will be searched
! 73: * for the plugins first, in the order they were added, then the default
! 74: * path follows.
! 75: *
! 76: * If \<ns>.load_modular is enabled (where \<ns> is lib->ns) the plugins to
! 77: * load are determined via a load option in their respective plugin config
! 78: * section e.g. \<ns>.plugins.\<plugin>.load = <priority|bool>.
! 79: * The order is determined by the configured priority. If two plugins have
! 80: * the same priority the order as seen in list is preserved. Plugins not
! 81: * found in list are loaded first, in alphabetical order.
! 82: *
! 83: * @note Even though this method could be called multiple times this is
! 84: * currently not really supported in regards to plugin features and their
! 85: * dependencies (in particular soft dependencies).
! 86: *
! 87: * @param list space separated list of plugins to load
! 88: * @return TRUE if all critical plugins loaded successfully
! 89: */
! 90: bool (*load)(plugin_loader_t *this, char *list);
! 91:
! 92: /**
! 93: * Add an additional search path for plugins.
! 94: *
! 95: * These will be searched in the order they were added.
! 96: *
! 97: * @param path path containing loadable plugins
! 98: */
! 99: void (*add_path)(plugin_loader_t *this, char *path);
! 100:
! 101: /**
! 102: * Reload the configuration of one or multiple plugins.
! 103: *
! 104: * @param space separated plugin names to reload, NULL for all
! 105: * @return number of plugins that did support reloading
! 106: */
! 107: u_int (*reload)(plugin_loader_t *this, char *list);
! 108:
! 109: /**
! 110: * Unload all loaded plugins.
! 111: */
! 112: void (*unload)(plugin_loader_t *this);
! 113:
! 114: /**
! 115: * Create an enumerator over all loaded plugins.
! 116: *
! 117: * In addition to the plugin, the enumerator optionally provides a list of
! 118: * pointers to plugin features currently loaded.
! 119: * This list has to be destroyed.
! 120: *
! 121: * @return enumerator over plugin_t*, linked_list_t*
! 122: */
! 123: enumerator_t* (*create_plugin_enumerator)(plugin_loader_t *this);
! 124:
! 125: /**
! 126: * Check if the given feature is available and loaded.
! 127: *
! 128: * @param feature feature to check
! 129: * @return TRUE if feature available
! 130: */
! 131: bool (*has_feature)(plugin_loader_t *this, struct plugin_feature_t feature);
! 132:
! 133: /**
! 134: * Get a simple list the names of all loaded plugins.
! 135: *
! 136: * The function returns internal data, do not free.
! 137: *
! 138: * @return list of the names of all loaded plugins
! 139: */
! 140: char* (*loaded_plugins)(plugin_loader_t *this);
! 141:
! 142: /**
! 143: * Log status about loaded plugins and features.
! 144: *
! 145: * @param level log level to use
! 146: */
! 147: void (*status)(plugin_loader_t *this, level_t level);
! 148:
! 149: /**
! 150: * Unload loaded plugins, destroy plugin_loader instance.
! 151: */
! 152: void (*destroy)(plugin_loader_t *this);
! 153: };
! 154:
! 155: /**
! 156: * Create a plugin_loader instance.
! 157: *
! 158: * @return plugin loader instance
! 159: */
! 160: plugin_loader_t *plugin_loader_create();
! 161:
! 162: /**
! 163: * Convenience function to add plugin directories for the given plugins within
! 164: * the given base directory according to the conventions in the src/build tree.
! 165: *
! 166: * @param basedir base directory
! 167: * @param plugins space separated list of plugins
! 168: */
! 169: void plugin_loader_add_plugindirs(char *basedir, char *plugins);
! 170:
! 171: #ifdef STATIC_PLUGIN_CONSTRUCTORS
! 172: /**
! 173: * Register a plugin constructor in case of static builds.
! 174: *
! 175: * @param name name of the plugin
! 176: * @param constructor constructor to register (set to NULL to unregister)
! 177: */
! 178: void plugin_constructor_register(char *name, void *constructor);
! 179: #endif
! 180:
! 181: #endif /** PLUGIN_LOADER_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>