Annotation of embedaddon/strongswan/src/libstrongswan/plugins/plugin_loader.h, revision 1.1.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>