/* * Copyright © 2005 William Pitcock, et al. * The rights to this code are as documented in doc/LICENSE. * * This file contains data structures concerning modules. * * $Id: module.h,v 1.1 2007/07/19 08:24:50 pippijn Exp $ */ #ifndef MODULE_H #define MODULE_H #include "privs.h" struct v1_moduleheader_t; struct module_t { char name[BUFSIZE]; char modpath[BUFSIZE]; v1_moduleheader_t *header; unsigned int mflags; void *address; void *handle; list_t dephost; list_t deplist; list_t symlist; /* MAPIv2 symbol dependencies. */ }; #define MODTYPE_STANDARD 0 #define MODTYPE_CORE 1 /* Can't be unloaded. */ #define MODTYPE_FAIL 0x8000 /* modinit failed */ #define MAPI_MAGIC 0xdeadbeef #define MAPI_V1 1 #define MAX_CMD_PARC 20 struct v1_moduleheader_t { unsigned int mod; unsigned int abi_ver; char const *const name; bool norestart; void (*modinit) (module_t *m); void (*deinit) (void); char const *const vendor; char const *const version; }; #define DECLARE_MODULE_V1(name, norestart, modinit, deinit, ver, ven) \ v1_moduleheader_t _header = { \ MAPI_MAGIC, \ MAPI_V1, \ name, \ norestart, \ modinit, \ deinit, \ ven, \ ver \ } E void _modinit (module_t *m); E void _moddeinit (void); E void modules_init (void); E module_t *module_load (char *filespec); E void module_load_dir (char *dirspec); E void module_load_dir_match (char *dirspec, char *pattern); E void *module_locate_symbol (char *modname, char *sym); E void module_unload (module_t *m); E module_t *module_find (char *name); E module_t *module_find_published (char *name); /* Use this macro in your _modinit() function to use symbols from * other modules. It will abort the _modinit() and unload your module * without calling _moddeinit(). -- jilles */ /* XXX this assumes the parameter is called m */ #define MODULE_USE_SYMBOL_T(dest, type, modname, sym) \ if ((dest = (type *)module_locate_symbol(modname, sym)) == NULL) \ { \ m->mflags = MODTYPE_FAIL; \ return; \ } #define MODULE_USE_SYMBOL(dest, modname, sym) \ if ((dest = (list_t *)module_locate_symbol(modname, sym)) == NULL) \ { \ m->mflags = MODTYPE_FAIL; \ return; \ } #endif