1 |
/* |
2 |
* Copyright © 2005 William Pitcock, et al. |
3 |
* The rights to this code are as documented in doc/pod/license.pod. |
4 |
* |
5 |
* This file contains data structures concerning modules. |
6 |
* |
7 |
* $Id: module.h,v 1.2 2007-07-21 01:29:07 pippijn Exp $ |
8 |
*/ |
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 |