From 524b8ed1fd2f86c405afc87f563f18556422d33e Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Mon, 26 Feb 2018 13:13:57 +0000 Subject: [PATCH] Mod loading new style is working now FossilOrigin-Name: 905983d556f8197f90e84e6f2e09b0543f708d51efbffc8de87ec89536c6b6f8 --- src/ac/conf.c | 10 +++--- src/cw/mod.c | 59 +++++++++++++++++++++------------- src/cw/mod.h | 1 + src/mod/capwap/Makefile | 6 ++-- src/mod/capwap/mod_capwap_ac.c | 2 +- 5 files changed, 45 insertions(+), 33 deletions(-) diff --git a/src/ac/conf.c b/src/ac/conf.c index 9e1ed22a..3360b8b4 100644 --- a/src/ac/conf.c +++ b/src/ac/conf.c @@ -577,10 +577,6 @@ static int conf_read_mods(cfg_t *cfg){ for (i=0; i < n; i++){ char *modname = cfg_getnstr(cfg, CFG_ENTRY_MODS, i); - -printf("Modname: %s\n",modname); - - struct cw_Mod * mod = cw_mod_load(modname); if (!mod) return 0; @@ -830,7 +826,9 @@ int read_config(const char *filename) if (!conf_image_dir) conf_image_dir = CONF_DEFAULT_IMAGE_DIR; - init_mods(); +//printf("INIT MODS\n"); +// init_mods(); +//printf("done init mods"); // conf_init_capwap_mode(); @@ -839,7 +837,7 @@ int read_config(const char *filename) init_mcast_groups(); init_bcast_addrs(); - +//printf("Yea all mods inited\n"); return 1; } diff --git a/src/cw/mod.c b/src/cw/mod.c index 2672a4e6..96608bac 100644 --- a/src/cw/mod.c +++ b/src/cw/mod.c @@ -142,7 +142,7 @@ struct cw_actiondef *mod_cache_add(struct conn *conn, struct cw_Mod *c, struct c /* static mavl to store modules */ -static struct mavl * modlist = NULL; +static struct mavl * mods_loaded = NULL; static int mod_cmp(const void *e1, const void *e2){ struct cw_Mod * m1 = e1; struct cw_Mod * m2 = e2; @@ -155,46 +155,36 @@ void cw_mod_set_mod_path(const char * path){ mod_path = path; } -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); - return 1; -} - /** * @brief Load a module - * @param path - * @param mod_name - * @return + * @param mod_name Name of the module + * @return a pointer to the module interface */ 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){ + if (mods_loaded==NULL){ + mods_loaded=mavl_create(mod_cmp,NULL); + if (mods_loaded==NULL){ cw_log(LOG_ERROR, "Can't init modlist, no memory"); return NULL; } } - /* Search for the module in modlist, to see if it is + /* Search for the module in mods_loaded, to see if it is * already loaded or was statically linked */ struct cw_Mod search; memset(&search,0,sizeof(search)); search.name=mod_name; struct cw_Mod * mod; - mod = mavl_find(modlist,&search); + mod = mavl_find(mods_loaded,&search); if (mod){ return mod; } if (strlen(mod_name)>CW_MOD_MAX_MOD_NAME_LEN){ - cw_log(LOG_ERROR,"Mod name too long: %s (max allowed = %d", + cw_log(LOG_ERROR,"Mod name too long: %s (max allowed = %d)", mod_name,CW_MOD_MAX_MOD_NAME_LEN); return NULL; } @@ -219,7 +209,7 @@ struct cw_Mod * cw_mod_load(const char * mod_name){ struct cw_Mod * (*mod_get_interface)(); - mod_get_interface = dlsym(handle,"mod_get_interface"); + mod_get_interface = dlsym(handle,mod_filename); if (!mod_get_interface){ cw_log(LOG_ERROR,"Failed to load module: %s",dlerror()); @@ -227,8 +217,31 @@ struct cw_Mod * cw_mod_load(const char * mod_name){ } mod = mod_get_interface(); + mod->dll_handle=handle; + + if (!mavl_add(mods_loaded,mod)){ + dlclose(handle); + cw_log(LOG_ERR,"Can' add module %s",mod_name); + goto errX; + } + mod->init(); errX: free(filename); return mod; -} \ No newline at end of file +} + + + +static struct mlist * mods_list = NULL; + +struct cw_Mod * cw_mod_add_to_list(struct cw_Mod * mod ){ + if (!mods_list){ + mods_list = mlist_create(mod_cmp); + if (!mods_list){ + cw_log(LOG_ERROR,"Can't init mods_list"); + return 0; + } + } + return mlist_append(mods_list,mod); +} diff --git a/src/cw/mod.h b/src/cw/mod.h index b9e1f002..b8af0292 100644 --- a/src/cw/mod.h +++ b/src/cw/mod.h @@ -92,6 +92,7 @@ extern int mod_caching; #define mod_get_caching() (mod_caching) struct cw_Mod * cw_mod_load(const char * mod_name); +struct cw_Mod * cw_mod_add_to_list(struct cw_Mod * mod ); #define CW_MOD_MAX_MOD_NAME_LEN 128 #define CW_MOD_INTERFACE_FUNCTION_NAME_SUFFIX "_get_interface" diff --git a/src/mod/capwap/Makefile b/src/mod/capwap/Makefile index 42ef6bda..08788054 100644 --- a/src/mod/capwap/Makefile +++ b/src/mod/capwap/Makefile @@ -22,9 +22,9 @@ OBJS=\ LIBDIR := ../../../lib LIBARCHDIR := $(LIBDIR)/$(ARCH) OBJDIR := ../../../obj/mod_capwap/$(ARCH) -SNAME := $(LIBARCHDIR)/libcapwap.a -DNAME := $(LIBARCHDIR)/capwap.so -MODNAME := $(LIBDIR)/capwap.so +SNAME := $(LIBARCHDIR)/libmod_capwap.a +DNAME := $(LIBARCHDIR)/mod_capwap.so +MODNAME := $(LIBDIR)/mod_capwap.so SLIBS := -lcw include ../Mod.mak diff --git a/src/mod/capwap/mod_capwap_ac.c b/src/mod/capwap/mod_capwap_ac.c index 91262c99..a6059d78 100644 --- a/src/mod/capwap/mod_capwap_ac.c +++ b/src/mod/capwap/mod_capwap_ac.c @@ -55,6 +55,6 @@ struct cw_Mod *mod_capwap_ac() }; -struct cw_Mod * mod_get_interface(){ +struct cw_Mod * mod_capwap(){ return &capwap_ac; } \ No newline at end of file