Refactoring, work on mod_load

FossilOrigin-Name: ae3ed889283aac53bbbe900b6859605b153f90b91430d231767343bcf05447a8
This commit is contained in:
7u83@mail.ru 2018-02-26 11:21:50 +00:00
parent 775aa8d133
commit 7ecca3ef1f
15 changed files with 79 additions and 71 deletions

View File

@ -306,6 +306,7 @@
<File Name="src/cw/message_set.c"/>
<File Name="src/cw/message_set.h"/>
<File Name="src/mod/cisco/mod_cisco.h"/>
<File Name="src/cw/cw_filename.c"/>
</VirtualDirectory>
</VirtualDirectory>
<Description/>

View File

@ -93,15 +93,11 @@ extern struct cw_Mod * cw_get_mod_ac(const char *name);
extern void test_sets();
#include "cw/file.h"
int main(int argc, char *argv[])
{
int rc = 0;
/* parse arguments */
@ -124,7 +120,8 @@ int main(int argc, char *argv[])
developers is turned on ;) */
DBGX("Attention! %s", "DBG X is ON!");
cw_mod_add_dynamic("../../lib/actube","capwap");
cw_mod_set_mod_path("../../lib/actube");
cw_mod_load("capwap");
exit(0);

View File

@ -573,11 +573,15 @@ static int conf_read_mods(cfg_t *cfg){
conf_mods = malloc(sizeof(struct cw_Mod *)*(n+1));
cw_dbg(DBG_INFO,"Mods directory: %s",conf_mods_dir);
cw_mod_set_mod_path(conf_mods_dir);
for (i=0; i < n; i++){
char *modname = cfg_getnstr(cfg, CFG_ENTRY_MODS, i);
struct cw_Mod * mod = cw_mod_add_dynamic(conf_mods_dir,modname);
printf("Modname: %s\n",modname);
struct cw_Mod * mod = cw_mod_load(modname);
if (!mod)
return 0;

View File

@ -191,7 +191,7 @@ static struct cw_actiondef *load_mods(struct conn *conn, uint8_t * rawmsg, int l
{
struct cw_Mod *cmod =
detect_mod(conn, rawmsg, len, elems_len, from, MOD_MODE_CAPWAP);
detect_mod(conn, rawmsg, len, elems_len, from, CW_MOD_MODE_CAPWAP);
if (cmod == MOD_NULL) {
cw_dbg(DBG_MSG_ERR,
"Can't find mod to handle connection from %s, discarding message",

View File

@ -125,7 +125,7 @@ struct cw_actiondef *mod_cache_add(struct conn *conn, struct cw_Mod *c, struct c
memset(i, 0, sizeof(struct cache_item));
if (c) {
i->capwap = c->name;
c->register_actions(&(i->actions), MOD_MODE_CAPWAP);
c->register_actions(&(i->actions), CW_MOD_MODE_CAPWAP);
}
if (b) {
i->bindings = b->name;
@ -149,40 +149,38 @@ static int mod_cmp(const void *e1, const void *e2){
return strcmp(m1->name,m2->name);
}
static const char * mod_path="./";
/**
* @brief Load a module
* @param name Name of the module
* @return pointer to the module structure or NULL if the
* module cannot be loaded.
*/
struct cw_Mod * cw_mod_get(const char *name)
{
/*int i;
for (i=0; modlist[i];i++){
struct cw_Mod * m = modlist[i]();
if (strcmp(m->name,name)==0)
return m;
}
return NULL;
*/
void cw_mod_set_mod_path(const char * path){
mod_path = path;
}
int cw_mod_add(struct cw_Mod * (*modfn)() ){
static int cw_mod_add(struct cw_Mod * mod ){
if (modlist == NULL){
modlist = mavl_create(mod_cmp,NULL);
if (modlist==NULL){
return 0;
}
}
mavl_add(modlist,modfn);
//mavl_add(modlist,modfn);
return 1;
}
struct cw_Mod * cw_mod_add_dynamic(const char * path, const char * mod_name){
/**
* @brief Load a module
* @param path
* @param mod_name
* @return
*/
struct cw_Mod * cw_mod_load(const char * mod_name){
/* if modlist is not initialized, initialize ... */
if (modlist==NULL){
modlist=mavl_create(mod_cmp,NULL);
if (modlist==NULL){
cw_log(LOG_ERROR, "Can't init modlist, no memory");
return NULL;
}
}
/* Search for the module in modlist, to see if it is
* already loaded or was statically linked */
@ -195,17 +193,20 @@ struct cw_Mod * cw_mod_add_dynamic(const char * path, const char * mod_name){
return mod;
}
if (strlen(mod_name)>CW_MOD_MAX_MOD_NAME_LEN){
cw_log(LOG_ERROR,"Mod name too long: %s (max allowed = %d",
mod_name,CW_MOD_MAX_MOD_NAME_LEN);
return NULL;
}
char mod_filename[CW_MOD_MAX_MOD_NAME_LEN+5];
sprintf(mod_filename,"mod_%s",mod_name);
int n = strlen(path)+strlen(mod_name)+8;
char * filename = malloc(n);
if (!filename)
return 0;
strcpy(filename,path);
strcat(filename,"/");
strcat(filename,mod_name);
strcat(filename,".so");
/* we have to load the module dynamically */
char * filename;
filename = cw_filename(mod_path,mod_filename,".so");
if (filename==NULL)
return NULL;
/* Open the DLL */
void * handle;
@ -217,7 +218,9 @@ struct cw_Mod * cw_mod_add_dynamic(const char * path, const char * mod_name){
}
struct cw_Mod * (*mod_get_interface)();
mod_get_interface = dlsym(handle,"mod_get_interface");
if (!mod_get_interface){
cw_log(LOG_ERROR,"Failed to load module: %s",dlerror());
goto errX;

View File

@ -35,7 +35,7 @@ struct cw_actiondef;
enum {
MOD_MODE_CAPWAP,
CW_MOD_MODE_CAPWAP,
MOD_MODE_BINDINGS
};
@ -91,6 +91,9 @@ extern int mod_caching;
#define mod_set_caching(var) (mod_caching=var)
#define mod_get_caching() (mod_caching)
struct cw_Mod * cw_mod_add_dynamic(const char * path, const char * file);
struct cw_Mod * cw_mod_load(const char * mod_name);
#define CW_MOD_MAX_MOD_NAME_LEN 128
#define CW_MOD_INTERFACE_FUNCTION_NAME_SUFFIX "_get_interface"
#endif

View File

@ -27,7 +27,7 @@ static int init()
static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
struct sockaddr *from, int mode)
{
if (mode != MOD_MODE_CAPWAP)
if (mode != CW_MOD_MODE_CAPWAP)
return 0;
cw_dbg(DBG_MOD,"CAPWAP detected: yes");
return 1;
@ -35,7 +35,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
static int register_actions(struct cw_actiondef *def, int mode)
{
if (mode != MOD_MODE_CAPWAP)
if (mode != CW_MOD_MODE_CAPWAP)
return 0;
return capwap_register_actions_ac(def);
}

View File

@ -27,7 +27,7 @@ static int init()
static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
struct sockaddr *from, int mode)
{
if (mode != MOD_MODE_CAPWAP)
if (mode != CW_MOD_MODE_CAPWAP)
return 0;
conn->detected = 1;
conn->actions = &actions;
@ -36,7 +36,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
static int register_actions(struct cw_actiondef *def, int mode)
{
if (mode != MOD_MODE_CAPWAP)
if (mode != CW_MOD_MODE_CAPWAP)
return 0;
return capwap_register_actions_wtp(def);
}

View File

@ -18,7 +18,7 @@ int cipwap_init()
static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_len, struct sockaddr *from, int mode)
{
if (mode == MOD_MODE_CAPWAP)
if (mode == CW_MOD_MODE_CAPWAP)
return 1;
return 0;
@ -27,7 +27,7 @@ static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_
static int register_actions(struct cw_actiondef *actions, int mode)
{
switch (mode) {
case MOD_MODE_CAPWAP:
case CW_MOD_MODE_CAPWAP:
{
struct cw_Mod *cmod = modload_ac("capwap");
@ -36,7 +36,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
"Can't initialize mod_cisco, failed to load base mod mod_capwap");
return 1;
}
cmod->register_actions(actions, MOD_MODE_CAPWAP);
cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = cipwap_register_actions_ac(actions);
cw_dbg(DBG_INFO, "Initialized mod_cisco with %d actions", rc);
return rc;

View File

@ -18,7 +18,7 @@ int cipwap_init()
static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_len, struct sockaddr *from, int mode)
{
if (mode == MOD_MODE_CAPWAP)
if (mode == CW_MOD_MODE_CAPWAP)
return 1;
return 0;
@ -27,7 +27,7 @@ static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_
static int register_actions(struct cw_actiondef *actions, int mode)
{
switch (mode) {
case MOD_MODE_CAPWAP:
case CW_MOD_MODE_CAPWAP:
{
struct cw_Mod *cmod = modload_wtp("capwap");
@ -36,7 +36,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
"Can't initialize mod_cisco, failed to load base mod mod_capwap");
return 1;
}
cmod->register_actions(actions, MOD_MODE_CAPWAP);
cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = cipwap_register_actions_ac(actions);
cw_dbg(DBG_INFO, "Initialized mod_cisco with %d actions", rc);
return rc;

View File

@ -24,7 +24,7 @@ mbag_t cisco_config = NULL;
static int register_actions(struct cw_actiondef *actions, int mode)
{
switch (mode) {
case MOD_MODE_CAPWAP:
case CW_MOD_MODE_CAPWAP:
{
struct cw_Mod *cmod = modload_ac("cipwap");
@ -33,7 +33,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
"Can't initialize mod_cisco, failed to load base mod mod_cipwap");
return 1;
}
cmod->register_actions(actions, MOD_MODE_CAPWAP);
cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = cisco_register_actions_ac(actions);
cw_dbg(DBG_INFO, "Initialized mod_cisco with %d actions", rc);
return 0;
@ -144,7 +144,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem));
if (vendor_id == CW_VENDOR_ID_CISCO) {
// conn->actions = &actions;
if (mode == MOD_MODE_CAPWAP) {
if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "CISCO capwap detected: yes");
} else {
cw_dbg(DBG_MOD, "CISCO bindings detected: yes");
@ -158,7 +158,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
}
if (mode == MOD_MODE_CAPWAP) {
if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "CISCO capwap detected: no");
} else {
cw_dbg(DBG_MOD, "CISCO bindings detected: no");

View File

@ -21,7 +21,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
{
switch (mode) {
case MOD_MODE_CAPWAP:
case CW_MOD_MODE_CAPWAP:
{
struct cw_Mod *cmod = modload_wtp("cipwap");
@ -31,7 +31,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
return 1;
}
cmod->register_actions(actions, MOD_MODE_CAPWAP);
cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = cisco_register_actions_wtp(actions);
@ -132,7 +132,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem));
if (vendor_id == CW_VENDOR_ID_CISCO) {
// conn->actions = &actions;
if (mode == MOD_MODE_CAPWAP) {
if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "CISCO capwap detected: yes");
} else {
cw_dbg(DBG_MOD, "CISCO bindings detected: yes");
@ -146,7 +146,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
}
if (mode == MOD_MODE_CAPWAP) {
if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "CISCO capwap detected: no");
} else {
cw_dbg(DBG_MOD, "CISCO bindings detected: no");

View File

@ -18,7 +18,7 @@ extern int fortinet_register_actions_ac(struct cw_actiondef *def);
static int register_actions(struct cw_actiondef *actions, int mode)
{
switch (mode) {
case MOD_MODE_CAPWAP:
case CW_MOD_MODE_CAPWAP:
{
struct cw_Mod *cmod = modload_ac("capwap");
@ -27,7 +27,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
"Can't initialize mod_fortinet, failed to load base mod mod_capwap");
return 1;
}
cmod->register_actions(actions, MOD_MODE_CAPWAP);
cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = fortinet_register_actions_ac(actions);
cw_dbg(DBG_INFO, "Initialized mod fortinet with %d actions", rc);
return 0;
@ -85,7 +85,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem));
if (vendor_id == CW_VENDOR_ID_FORTINET) {
// conn->actions = &actions;
if (mode == MOD_MODE_CAPWAP) {
if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "Fortinet capwap detected: yes");
} else {
cw_dbg(DBG_MOD, "Fortinet bindings detected: yes");
@ -99,7 +99,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
}
if (mode == MOD_MODE_CAPWAP) {
if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "Fortinet capwap detected: no");
} else {
cw_dbg(DBG_MOD, "Fortinet bindings detected: no");

View File

@ -18,7 +18,7 @@ extern int cisco_register_actions_wtp(struct cw_actiondef *def);
static int register_actions(struct cw_actiondef *actions, int mode)
{
switch (mode) {
case MOD_MODE_CAPWAP:
case CW_MOD_MODE_CAPWAP:
{
struct cw_Mod *cmod = modload_wtp("capwap");
@ -28,7 +28,7 @@ static int register_actions(struct cw_actiondef *actions, int mode)
return 1;
}
cmod->register_actions(actions, MOD_MODE_CAPWAP);
cmod->register_actions(actions, CW_MOD_MODE_CAPWAP);
int rc = cisco_register_actions_wtp(actions);
@ -130,7 +130,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
uint32_t vendor_id = cw_get_dword(cw_get_elem_data(elem));
if (vendor_id == CW_VENDOR_ID_FORTINET) {
// conn->actions = &actions;
if (mode == MOD_MODE_CAPWAP) {
if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "Fortinet capwap detected: yes");
} else {
cw_dbg(DBG_MOD, "Fortinet bindings detected: yes");
@ -144,7 +144,7 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
}
if (mode == MOD_MODE_CAPWAP) {
if (mode == CW_MOD_MODE_CAPWAP) {
cw_dbg(DBG_MOD, "Fortinet capwap detected: no");
} else {
cw_dbg(DBG_MOD, "Fortinet bindings detected: no");

View File

@ -130,7 +130,7 @@ int main()
}
mod->init();
mod->register_actions(&capwap_actions,MOD_MODE_CAPWAP);
mod->register_actions(&capwap_actions,CW_MOD_MODE_CAPWAP);
mod = modload_wtp(CWBIND);
if (!mod) {
printf("Can't load mod capwap80211\n");