59 lines
1.9 KiB
C
59 lines
1.9 KiB
C
|
#ifndef _LIGHTTPD_MODULE_H_
|
||
|
#define _LIGHTTPD_MODULE_H_
|
||
|
|
||
|
#include "settings.h"
|
||
|
|
||
|
#define MODULE_VERSION ((guint) 0x00000001)
|
||
|
#define MODULE_VERSION_CHECK(mods) do { \
|
||
|
if (mods->version != MODULE_VERSION) { \
|
||
|
ERROR("Version mismatch for modules system: is %u, expected %u", mods->version, MODULE_VERSION); \
|
||
|
return FALSE; \
|
||
|
} } while(0)
|
||
|
|
||
|
/** see module_load */
|
||
|
#define MODULE_DEPENDS(mods, name) do { \
|
||
|
if (!modules_load(mods, name)) { \
|
||
|
ERROR("Couldn't load dependency '%s'", name); \
|
||
|
return FALSE; \
|
||
|
} } while(0)
|
||
|
|
||
|
struct module;
|
||
|
typedef struct module module;
|
||
|
|
||
|
struct modules;
|
||
|
typedef struct modules modules;
|
||
|
|
||
|
/** Type of plugin_init function in modules */
|
||
|
typedef gboolean (*ModuleInit)(modules *mods, module *mod);
|
||
|
typedef gboolean (*ModuleFree)(modules *mods, module *mod);
|
||
|
|
||
|
struct module {
|
||
|
gint refcount; /**< count how often module is used. module gets unloaded if refcount reaches zero. */
|
||
|
gchar *name; /**< name of module, can be set my plugin_init */
|
||
|
GModule *module; /**< glib handle */
|
||
|
|
||
|
gpointer config; /**< private module data */
|
||
|
ModuleFree free; /**< if set by plugin_init it gets called before module is unloaded */
|
||
|
};
|
||
|
|
||
|
struct modules {
|
||
|
guint version; /**< api version */
|
||
|
|
||
|
GHashTable *mods; /**< hash table of modules */
|
||
|
gpointer main; /**< pointer to a application specific main structure, e.g. server */
|
||
|
};
|
||
|
|
||
|
LI_API modules* modules_init(gpointer main);
|
||
|
|
||
|
/** Loads a module if not loaded yet and returns the module struct for it (after increasing refcount)
|
||
|
* returns NULL if it couldn't load the module.
|
||
|
*
|
||
|
* You should release modules after you used them with module_release or module_release_name */
|
||
|
LI_API module* module_load(modules *mods, const gchar* name);
|
||
|
|
||
|
LI_API void module_acquire(module *mod);
|
||
|
LI_API void module_release(modules *mods, module *module);
|
||
|
LI_API void module_release_name(modules *mods, const char* name);
|
||
|
|
||
|
#endif
|