24 # define LIBRARY_DIR "."
49 int celem, melem, attr, *nlist = NULL;
50 char id[13], name[32], mod_fullpath[
PATH_MAX], arg[1024];
51 const char *modules_path;
56 mm = (
mm_t) calloc(1,
sizeof(
struct mm_st));
65 if (modules_path != NULL)
66 log_write(sm->
log, LOG_NOTICE,
"modules search path: %s", modules_path);
68 log_write(sm->
log, LOG_NOTICE,
"modules search path undefined, using default: "LIBRARY_DIR);
83 if(strcmp(
id,
"sess-start") == 0) {
88 else if(strcmp(
id,
"sess-end") == 0) {
93 else if(strcmp(
id,
"in-sess") == 0) {
98 else if(strcmp(
id,
"in-router") == 0) {
103 else if(strcmp(
id,
"out-sess") == 0) {
108 else if(strcmp(
id,
"out-router") == 0) {
113 else if(strcmp(
id,
"pkt-sm") == 0) {
118 else if(strcmp(
id,
"pkt-user") == 0) {
123 else if(strcmp(
id,
"pkt-router") == 0) {
128 else if(strcmp(
id,
"user-load") == 0) {
133 else if(strcmp(
id,
"user-unload") == 0) {
138 else if(strcmp(
id,
"user-create") == 0) {
143 else if(strcmp(
id,
"user-delete") == 0) {
148 else if(strcmp(
id,
"disco-extend") == 0) {
155 log_write(sm->
log, LOG_ERR,
"unknown chain type '%s'",
id);
183 mod->
name = strdup(name);
185 if (modules_path != NULL)
186 snprintf(mod_fullpath,
PATH_MAX,
"%s/mod_%s.so", modules_path, name);
188 snprintf(mod_fullpath,
PATH_MAX,
"%s/mod_%s.so", LIBRARY_DIR, name);
189 mod->
handle = dlopen(mod_fullpath, RTLD_LAZY);
193 if (modules_path != NULL)
194 snprintf(mod_fullpath,
PATH_MAX,
"%s\\mod_%s.dll", modules_path, name);
196 snprintf(mod_fullpath,
PATH_MAX,
"mod_%s.dll", name);
197 mod->
handle = (
void*) LoadLibrary(mod_fullpath);
203 log_debug(
ZONE,
"preloaded module '%s' to chain '%s' (not added yet)", name,
id);
208 log_write(sm->
log, LOG_ERR,
"failed loading module '%s' to chain '%s' (%s)", name,
id, dlerror());
212 log_write(sm->
log, LOG_ERR,
"failed loading module '%s' to chain '%s' (errcode: %x)", name,
id, GetLastError());
214 FreeLibrary((HMODULE) mod->
handle);
227 mi->arg = (arg[0] ==
'\0') ? NULL : strdup(arg);
231 log_write(sm->
log, LOG_ERR,
"init for module '%s' (seq %d) failed", name, mi->seq);
242 FreeLibrary((HMODULE) mod->
handle);
245 free((
void*)mod->
name);
258 (*list)[*nlist] = mi;
260 log_write(sm->
log, LOG_NOTICE,
"module '%s' added to chain '%s' (order %d index %d seq %d)", mod->
name,
id, *nlist, mod->
index, mi->seq);
273 static void _mm_reaper(
const char *module,
int modulelen,
void *val,
void *arg) {
276 if(mod->
free != NULL)
284 FreeLibrary((HMODULE) mod->
handle);
287 free((
void*)mod->
name);
292 int i, j, *nlist = NULL;
299 for(i = 0; i < 13; i++) {
355 for(j = 0; j < *nlist; j++) {
358 free((
void*)mi->arg);
480 if (mm != NULL && pkt != NULL )
573 for(n = 0; n < mm->
npkt_sm; n++) {
mod_ret_t(* pkt_sm)(mod_instance_t mi, pkt_t pkt)
pkt-sm handler
mod_instance_t * pkt_user
pkt-user chain
user deletion, delete saved per-user data
mod_instance_t * sess_end
sess-end chain
data structures and prototypes for the session manager
int nindex
counter for module instance sequence (!!! should be local to mm_new)
#define NAD_CDATA_L(N, E)
mod_instance_t * pkt_sm
pkt-sm chain
int mm_user_load(mm_t mm, user_t user)
load user data
disco request, extend sm disco::info
single instance of a module in a chain
void mm_sess_end(mm_t mm, sess_t sess)
session ending
int nad_find_elem(nad_t nad, int elem, int ns, const char *name, int depth)
locate the next elem at a given depth with an optional matching name
config_t config
config context
int init
number of times the module intialiser has been called
void log_write(log_t log, int level, const char *msgfmt,...)
mod_ret_t mm_out_sess(mm_t mm, sess_t sess, pkt_t pkt)
packets to active session
mod_chain_t
module chain types
user loaded, load per-user data
mod_instance_t * in_sess
in-sess chain
user creation, generate and save per-user data
mod_ret_t mm_pkt_sm(mm_t mm, pkt_t pkt)
packets for sm
int(* module_init_fn)(mod_instance_t)
module init function
session start, load per-session data
void mm_disco_extend(mm_t mm, pkt_t pkt)
disco extend
mod_ret_t mm_pkt_user(mm_t mm, user_t user, pkt_t pkt)
packets for user
mm_t mm_new(sm_t sm)
allocate a module manager instance, and loads the modules
mod_ret_t(* out_router)(mod_instance_t mi, pkt_t pkt)
out-router handler
int(* user_load)(mod_instance_t mi, user_t user)
user-load handler
xht modules
pointers to module data (key is module name)
void mm_user_delete(mm_t mm, jid_t jid)
delete user
void(* disco_extend)(mod_instance_t mi, pkt_t pkt)
disco-extend handler
void * handle
module handle
mod_ret_t mm_in_router(mm_t mm, pkt_t pkt)
packets from router
module_t mod
module that this is an instance of
int(* user_create)(mod_instance_t mi, jid_t jid)
user-create handler
mod_instance_t * out_router
out-router chain
packet summary data wrapper
int(* sess_start)(mod_instance_t mi, sess_t sess)
sess-start handler
mod_ret_t mm_pkt_router(mm_t mm, pkt_t pkt)
packets from the router
session manager global context
mod_instance_t * in_router
in-router chain
packet from an active session
mod_ret_t(* in_sess)(mod_instance_t mi, sess_t sess, pkt_t pkt)
in-sess handler
void xhash_put(xht h, const char *key, void *val)
mod_instance_t * user_unload
user-unload chain
void mm_free(mm_t mm)
free a mm instance
mod_ret_t mm_out_router(mm_t mm, pkt_t pkt)
packets to router
void xhash_zap(xht h, const char *key)
int mm_sess_start(mm_t mm, sess_t sess)
session starting
void(* user_delete)(mod_instance_t mi, jid_t jid)
user-delete handler
packet was unhandled, should be passed to the next module
int mm_user_create(mm_t mm, jid_t jid)
create user
mod_instance_t * disco_extend
disco-extend chain
mod_ret_t mm_in_sess(mm_t mm, sess_t sess, pkt_t pkt)
packets from active session
mod_instance_t * sess_start
sess-start chain
There is one instance of this struct per user who is logged in to this c2s instance.
void xhash_walk(xht h, xhash_walker w, void *arg)
int(* user_unload)(mod_instance_t mi, user_t user)
user-load handler
void(* free)(module_t mod)
called when module is freed
static void _mm_reaper(const char *module, int modulelen, void *val, void *arg)
mod_instance_t * pkt_router
pkt-router chain
session ended, save & free per-session data
mod_ret_t(* pkt_user)(mod_instance_t mi, user_t user, pkt_t pkt)
pkt-user handler
mod_instance_t * user_delete
user-delete chain
mod_ret_t(* in_router)(mod_instance_t mi, pkt_t pkt)
in-router handler
mod_ret_t(* out_sess)(mod_instance_t mi, sess_t sess, pkt_t pkt)
out-sess handler
user is about to be unloaded
void * xhash_get(xht h, const char *key)
mod_instance_t * out_sess
out-sess chain
const char * name
name of module
const char * config_get_one(config_t c, const char *key, int num)
get config value n for this key
int nad_find_attr(nad_t nad, int elem, int ns, const char *name, const char *val)
get a matching attr on this elem, both name and optional val
mod_ret_t(* pkt_router)(mod_instance_t mi, pkt_t pkt)
pkt-router handler
void(* sess_end)(mod_instance_t mi, sess_t sess)
sess-end handler
packet from the router (special purpose)
packet to an active session
int mm_user_unload(mm_t mm, user_t user)
user data is about to be unloaded
mod_ret_t
module return values
struct mod_instance_st * mod_instance_t
mod_instance_t * user_load
user-load chain
mod_instance_t * user_create
user-create chain
struct module_st * module_t