/* * load module from dir */ void load_modules() { char buff[LEN_128] = {0}; char mod_path[LEN_128] = {0}; struct module *mod = NULL; int (*mod_register)(struct module *); int i; /* get the full path of modules */ sprintf(buff, "/usr/local/tsar/modules"); for (i = 0; i < statis.total_mod_num; i++) { mod = &mods[i]; if (!mod->lib) { memset(mod_path, '\0', LEN_128); snprintf(mod_path, LEN_128, "%s/%s.so", buff, mod->name); if (!(mod->lib = dlopen(mod_path, RTLD_NOW|RTLD_GLOBAL))) { do_debug(LOG_ERR, "load_modules: dlopen module %s err %s\n", mod->name, dlerror()); } else { mod_register = dlsym(mod->lib, "mod_register"); if (dlerror()) { do_debug(LOG_ERR, "load_modules: dlsym module %s err %s\n", mod->name, dlerror()); break; } else { mod_register(mod); mod->enable = 1; mod->spec = 0; do_debug(LOG_INFO, "load_modules: load new module '%s' to mods\n", mod_path); } } } } }
/** * @brief Initialize this module. * * Call this function when loading this module. * * @param gw pointer to gateway context * @param lib pointer to dynamic library generated by this module * * @return TRUE on success, FALSE on failure */ bool_t init(gw_t *gw, gw_dlib_t lib) { bool_t ret = TRUE; gw_thread_t net_handle_thread = NULL; /* initialize module data */ memset(&applocate_conf, 0, sizeof(applocate_conf)); applocate_conf.plat_ip = bfromcstr(serv_ip); applocate_conf.serv_port = SERV_PORT; applocate_conf.client_port = CLIENT_PORT; memset(&applocate_stats, 0, sizeof(applocate_stats)); memset(&applocate_data, 0, sizeof(applocate_data)); applocate_data.config = (void *)&applocate_conf; applocate_data.stats = (void *)&applocate_stats; /* read config infromation */ //load_config("/etc/gw/modules/applocate.conf"); /* initialize module structure */ memset(&mod_applocate, 0, sizeof(mod_applocate)); mod_applocate.name = "mod_applocate"; mod_applocate.desc = "mod locate application"; mod_applocate.vendor = "WSN"; mod_applocate.modver.major = 1; mod_applocate.modver.minor = 0; mod_applocate.sysver.major = 1; mod_applocate.sysver.minor = 0; mod_applocate.init = init; mod_applocate.cleanup = cleanup; mod_applocate.serialize = serialize; mod_applocate.lib = lib; mod_applocate.data = &applocate_data; mod_applocate.lock = gw_mutex_create(); INIT_LIST_HEAD(&mod_applocate.services); applocate_msgq = gw_msgq_create(); memset(&applocate_svc, 0, sizeof(applocate_svc)); applocate_svc.id = GW_LOCATE_APP; applocate_svc.name = "applocate_service"; applocate_svc.mod = &mod_applocate; applocate_svc.mq = applocate_msgq; //TODO: initialize another stuff if (mod_applocate.lock != NULL) { ret = mod_register(gw, &mod_applocate); if (ret) { ret = mod_register_service(gw, &mod_applocate, &applocate_svc); if (ret != TRUE) { mod_unregister(gw, &mod_applocate); gw_mutex_destroy(mod_applocate.lock); gw_log_print(GW_LOG_LEVEL_ERROR, "module %s initialization failed\n", mod_applocate.name); } else { gw_log_print(GW_LOG_LEVEL_INFO, "module %s initialized\n", mod_applocate.name); } } } msg_handle_thread = gw_thread_create(applocate_msg_handler, (void *)gw); net_handle_thread = gw_thread_create(applocate_net_handler, (void *)gw); if(net_handle_thread == NULL) { gw_log_print(GW_LOG_LEVEL_WARNING, "Thread create error!\n"); ret = FALSE; } else { gw_thread_close(net_handle_thread); } return ret; }
bool_t init(gw_t *gw, gw_dlib_t lib) { bool_t ret = TRUE; /* initialize module data */ memset(&devman_data, 0, sizeof(devman_data)); memset(&devman_conf, 0, sizeof(devman_conf)); memset(&devman_stats, 0, sizeof(devman_stats)); /* read config infromation */ //devman_config("/home/makui/projects/gw/i386-linux-gcc-debug-mod-skeleton/devman.conf"); devman_data.config = &devman_conf; devman_data.stats = &devman_stats; /* initialize module structure */ memset(&mod_devman, 0, sizeof(mod_devman)); mod_devman.name = "mod_devmanage"; mod_devman.desc = "mod device management"; mod_devman.vendor = "WSN"; mod_devman.modver.major = 1; mod_devman.modver.minor = 0; mod_devman.sysver.major = 1; mod_devman.sysver.minor = 0; mod_devman.init = init; mod_devman.cleanup = cleanup; mod_devman.serialize = serialize; mod_devman.lib = lib; mod_devman.data = &devman_data; mod_devman.lock = gw_mutex_create(); INIT_LIST_HEAD(&mod_devman.services); devman_msgq = gw_msgq_create(); memset(&devman_svc, 0, sizeof(devman_svc)); devman_svc.id = DEV_MAN_SVC; devman_svc.name = "devman_service"; devman_svc.mod = &mod_devman; devman_svc.mq = devman_msgq; devman_thread = gw_thread_create(devman_svc_handler, (void *) gw); //TODO: initialize another stuff if (mod_devman.lock != NULL) { ret = mod_register(gw, &mod_devman); if (ret) { ret = mod_register_service(gw, &mod_devman, &devman_svc); if (ret != TRUE) { mod_unregister(gw, &mod_devman); gw_mutex_destroy(mod_devman.lock); gw_log_print(GW_LOG_LEVEL_ERROR, "module %s initialization failed\n", mod_devman.name); } else { gw_log_print(GW_LOG_LEVEL_INFO, "module %s initialized\n", mod_devman.name); } } } return ret; }
void init_(void) { mod_register(get_module()); }