| 1 |
pippijn |
1.1 |
/* |
| 2 |
|
|
* Copyright © 2005 William Pitcock, et al. |
| 3 |
pippijn |
1.2 |
* The rights to this code are as documented in doc/pod/license.pod. |
| 4 |
pippijn |
1.1 |
* |
| 5 |
|
|
* This file contains data structures concerning modules. |
| 6 |
|
|
* |
| 7 |
pippijn |
1.3 |
* $Id: module.h,v 1.2 2007-07-21 01:29:07 pippijn Exp $ |
| 8 |
pippijn |
1.1 |
*/ |
| 9 |
|
|
|
| 10 |
|
|
#ifndef MODULE_H |
| 11 |
|
|
#define MODULE_H |
| 12 |
|
|
|
| 13 |
|
|
#include "privs.h" |
| 14 |
|
|
|
| 15 |
|
|
struct v1_moduleheader_t; |
| 16 |
|
|
|
| 17 |
|
|
struct module_t |
| 18 |
|
|
{ |
| 19 |
|
|
char name[BUFSIZE]; |
| 20 |
|
|
char modpath[BUFSIZE]; |
| 21 |
|
|
v1_moduleheader_t *header; |
| 22 |
|
|
|
| 23 |
|
|
unsigned int mflags; |
| 24 |
|
|
|
| 25 |
|
|
void *address; |
| 26 |
|
|
void *handle; |
| 27 |
|
|
|
| 28 |
|
|
list_t dephost; |
| 29 |
|
|
list_t deplist; |
| 30 |
|
|
|
| 31 |
|
|
list_t symlist; /* MAPIv2 symbol dependencies. */ |
| 32 |
|
|
}; |
| 33 |
|
|
|
| 34 |
|
|
#define MODTYPE_STANDARD 0 |
| 35 |
|
|
#define MODTYPE_CORE 1 /* Can't be unloaded. */ |
| 36 |
|
|
#define MODTYPE_FAIL 0x8000 /* modinit failed */ |
| 37 |
|
|
|
| 38 |
|
|
#define MAPI_MAGIC 0xdeadbeef |
| 39 |
|
|
#define MAPI_V1 1 |
| 40 |
|
|
|
| 41 |
|
|
#define MAX_CMD_PARC 20 |
| 42 |
|
|
|
| 43 |
|
|
struct v1_moduleheader_t |
| 44 |
|
|
{ |
| 45 |
|
|
unsigned int mod; |
| 46 |
|
|
unsigned int abi_ver; |
| 47 |
|
|
char const *const name; |
| 48 |
|
|
bool norestart; |
| 49 |
|
|
void (*modinit) (module_t *m); |
| 50 |
|
|
void (*deinit) (void); |
| 51 |
|
|
char const *const vendor; |
| 52 |
|
|
char const *const version; |
| 53 |
|
|
}; |
| 54 |
|
|
|
| 55 |
|
|
#define DECLARE_MODULE_V1(name, norestart, modinit, deinit, ver, ven) \ |
| 56 |
|
|
v1_moduleheader_t _header = { \ |
| 57 |
|
|
MAPI_MAGIC, \ |
| 58 |
|
|
MAPI_V1, \ |
| 59 |
|
|
name, \ |
| 60 |
|
|
norestart, \ |
| 61 |
|
|
modinit, \ |
| 62 |
|
|
deinit, \ |
| 63 |
|
|
ven, \ |
| 64 |
|
|
ver \ |
| 65 |
|
|
} |
| 66 |
|
|
|
| 67 |
|
|
E void _modinit (module_t *m); |
| 68 |
|
|
E void _moddeinit (void); |
| 69 |
|
|
|
| 70 |
|
|
E void modules_init (void); |
| 71 |
|
|
E module_t *module_load (char *filespec); |
| 72 |
|
|
E void module_load_dir (char *dirspec); |
| 73 |
|
|
E void module_load_dir_match (char *dirspec, char *pattern); |
| 74 |
|
|
E void *module_locate_symbol (char *modname, char *sym); |
| 75 |
|
|
E void module_unload (module_t *m); |
| 76 |
|
|
E module_t *module_find (char *name); |
| 77 |
|
|
E module_t *module_find_published (char *name); |
| 78 |
|
|
|
| 79 |
|
|
/* Use this macro in your _modinit() function to use symbols from |
| 80 |
|
|
* other modules. It will abort the _modinit() and unload your module |
| 81 |
|
|
* without calling _moddeinit(). -- jilles */ |
| 82 |
|
|
/* XXX this assumes the parameter is called m */ |
| 83 |
|
|
#define MODULE_USE_SYMBOL_T(dest, type, modname, sym) \ |
| 84 |
|
|
if ((dest = (type *)module_locate_symbol(modname, sym)) == NULL) \ |
| 85 |
|
|
{ \ |
| 86 |
|
|
m->mflags = MODTYPE_FAIL; \ |
| 87 |
|
|
return; \ |
| 88 |
|
|
} |
| 89 |
|
|
|
| 90 |
|
|
#define MODULE_USE_SYMBOL(dest, modname, sym) \ |
| 91 |
|
|
if ((dest = (list_t *)module_locate_symbol(modname, sym)) == NULL) \ |
| 92 |
|
|
{ \ |
| 93 |
|
|
m->mflags = MODTYPE_FAIL; \ |
| 94 |
|
|
return; \ |
| 95 |
|
|
} |
| 96 |
|
|
|
| 97 |
|
|
#endif |