#ifndef _LIGHTTPD_MODULE_H_ #define _LIGHTTPD_MODULE_H_ #include #define MODULE_VERSION ((guint) 0x00000001) #define MODULE_VERSION_CHECK(mods) do { \ if (mods->version != MODULE_VERSION) { \ ERROR(mods->main, "Version mismatch for modules system: is %u, expected %u", mods->version, MODULE_VERSION); \ return FALSE; \ } \ if (mods->sizeof_off_t != (guint8)sizeof(off_t)) { \ ERROR(mods->main, "Compile flags mismatch: sizeof(off_t) is %u, expected %u", (guint) sizeof(off_t), mods->sizeof_off_t); \ return FALSE; \ } \ } while(0) /** see li_module_load */ #define MODULE_DEPENDS(mods, name) do { \ if (!li_module_load(mods, name)) { \ ERROR(mods->main, "Couldn't load dependency '%s'", name); \ return FALSE; \ } } while(0) typedef struct liModule liModule; typedef struct liModules liModules; /** Type of plugin_init function in modules */ typedef gboolean (*liModuleInitCB)(liModules *mods, liModule *mod); typedef gboolean (*liModuleFreeCB)(liModules *mods, liModule *mod); struct liModule { gint refcount; /**< count how often module is used. module gets unloaded if refcount reaches zero. */ GString *name; /**< name of module, can be set my plugin_init */ GModule *module; /**< glib handle */ gchar *path; /**< path to the module file */ gpointer config; /**< private module data */ liModuleFreeCB free; /**< if set by plugin_init it gets called before module is unloaded */ }; struct liModules { guint version; /**< api version */ gpointer main; /**< pointer to a application specific main structure, e.g. server */ GArray *mods; /**< array of (module*) */ gchar *module_dir; guint8 sizeof_off_t; /** holds the value of sizeof(off_t) to check if loaded module was compiled with the same flags */ }; LI_API liModules* li_modules_new(gpointer main, const gchar *module_dir); LI_API void li_modules_free(liModules *mods); /** 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 li_module_release or li_module_release_name */ LI_API liModule* li_module_load(liModules *mods, const gchar* name); /* find module by name */ LI_API liModule *li_module_lookup(liModules *mods, const gchar *name); LI_API void li_module_acquire(liModule *mod); LI_API void li_module_release(liModules *mods, liModule *mod); LI_API void li_module_release_name(liModules *mods, const gchar* name); #endif