/* registers a module, register_f= module register functions * returns <0 on error, 0 on success */ int register_module(struct module_exports* e, char* path, void* handle) { int ret; struct sr_module* mod; ret=-1; /* add module to the list */ if ((mod=pkg_malloc(sizeof(struct sr_module)))==0){ LM_ERR("no more pkg memory\n"); ret=E_OUT_OF_MEM; goto error; } memset(mod,0, sizeof(struct sr_module)); mod->path=path; mod->handle=handle; mod->exports=e; mod->next=modules; modules=mod; /* register module pseudo-variables */ if (e->items) { LM_DBG("register_pv: %s\n", e->name); if (register_pvars_mod(e->name, e->items)!=0) { LM_ERR("failed to register pseudo-variables for module %s\n", e->name); pkg_free(mod); return -1; } } return 0; error: return ret; }
/** init pv api (optional). * @return 0 on success, -1 on error */ int pv_init_api(void) { pv_init_table(); tr_init_table(); if(pv_init_buffer()<0) return -1; if(register_pvars_mod("core", _core_pvs)<0) return -1; return 0; }
/** init pv api (optional). * @return 0 on success, -1 on error */ int pv_init_api(void) { pv_init_table(); tr_init_table(); if(pv_init_buffer()<0) return -1; pv_str_empty_buf[0] = '\0'; pv_str_empty_buf[1] = '\0'; pv_str_empty.s = pv_str_empty_buf; strcpy(pv_str_null_buf, "<null>"); pv_str_null.s = pv_str_null_buf; if(register_pvars_mod("core", _core_pvs)<0) return -1; return 0; }
/* registers a module, register_f= module register functions * returns <0 on error, 0 on success */ static int register_module(module_exports_t* e, char* path, void* handle) { int ret, i; struct sr_module* mod; char defmod[64]; int n = 0; ret=-1; /* add module to the list */ if ((mod=pkg_malloc(sizeof(struct sr_module)))==0){ LM_ERR("memory allocation failure\n"); ret=E_OUT_OF_MEM; goto error; } memset(mod, 0, sizeof(struct sr_module)); mod->path=path; mod->handle=handle; /* copy and convert fields */ mod->exports.name = e->name; mod->exports.dlflags = e->dlflags; if(e->cmds) { for (n=0; e->cmds[n].name; n++); } mod->exports.cmds = pkg_malloc(sizeof(ksr_cmd_export_t)*(n+1)); memset(mod->exports.cmds, 0, sizeof(ksr_cmd_export_t)*(n+1)); for (i=0; i < n; i++) { mod->exports.cmds[i].name = e->cmds[i].name; mod->exports.cmds[i].function = e->cmds[i].function; mod->exports.cmds[i].param_no = e->cmds[i].param_no; mod->exports.cmds[i].fixup = e->cmds[i].fixup; mod->exports.cmds[i].free_fixup = e->cmds[i].free_fixup; mod->exports.cmds[i].flags = e->cmds[i].flags; mod->exports.cmds[i].fixup_flags = 0; mod->exports.cmds[i].module_exports = mod; /* fill known free fixups */ if (mod->exports.cmds[i].fixup && mod->exports.cmds[i].free_fixup == 0) { mod->exports.cmds[i].free_fixup = get_fixup_free(mod->exports.cmds[i].fixup); } } mod->exports.params = e->params; mod->exports.rpc_methods = e->rpc_methods; mod->exports.pv_items = e->pv_items; mod->exports.response_f = e->response_f; mod->exports.init_mod_f = e->init_mod_f; mod->exports.init_child_f = e->init_child_f; mod->exports.destroy_mod_f = e->destroy_mod_f; if (mod->exports.pv_items) { /* register module pseudo-variables for kamailio modules */ LM_DBG("register PV from: %s\n", mod->exports.name); if (register_pvars_mod(mod->exports.name, mod->exports.pv_items)!=0) { LM_ERR("failed to register pseudo-variables for module %s (%s)\n", mod->exports.name, path); ret = E_UNSPEC; goto error; } } if (mod->exports.rpc_methods){ /* register rpcs for ser modules */ i=rpc_register_array(mod->exports.rpc_methods); if (i<0){ LM_ERR("failed to register RPCs for module %s (%s)\n", mod->exports.name, path); ret = E_UNSPEC; goto error; }else if (i>0){ LM_ERR("%d duplicate RPCs name detected while registering RPCs" " declared in module %s (%s)\n", i, mod->exports.name, path); ret = E_UNSPEC; goto error; } /* i==0 => success */ } /* add cfg define for each module: MOD_modulename */ if(strlen(mod->exports.name)>=60) { LM_ERR("too long module name: %s\n", mod->exports.name); goto error; } strcpy(defmod, "MOD_"); strcat(defmod, mod->exports.name); pp_define_set_type(0); if(pp_define(strlen(defmod), defmod)<0) { LM_ERR("unable to set cfg define for module: %s\n", mod->exports.name); goto error; } /* link module in the list */ mod->next=modules; modules=mod; return 0; error: if (mod) pkg_free(mod); return ret; }
/* registers a module, register_f= module register functions * returns <0 on error, 0 on success */ static int register_module(unsigned ver, union module_exports_u* e, char* path, void* handle) { int ret, i; struct sr_module* mod; char defmod[64]; ret=-1; /* add module to the list */ if ((mod=pkg_malloc(sizeof(struct sr_module)))==0){ LM_ERR("memory allocation failure\n"); ret=E_OUT_OF_MEM; goto error; } memset(mod,0, sizeof(struct sr_module)); mod->path=path; mod->handle=handle; mod->orig_mod_interface_ver=ver; /* convert exports to sr31 format */ if (ver == 0) { /* ser <= 3.0 */ mod->exports.name = e->v0.name; if (e->v0.cmds) { mod->exports.cmds = sr_cmd_exports_convert(ver, e->v0.cmds, mod); if (mod->exports.cmds == 0) { LM_ERR("failed to convert module command exports to 3.1 format" " for module \"%s\" (%s), interface version %d\n", mod->exports.name, mod->path, ver); ret = E_UNSPEC; goto error; } } mod->exports.params = e->v0.params; mod->exports.init_f = e->v0.init_f; mod->exports.response_f = e->v0.response_f; mod->exports.destroy_f = e->v0.destroy_f; mod->exports.onbreak_f = e->v0.onbreak_f; mod->exports.init_child_f = e->v0.init_child_f; mod->exports.dlflags = 0; /* not used in ser <= 3.0 */ mod->exports.rpc_methods = e->v0.rpc_methods; /* the rest are 0, not used in ser */ } else if (ver == 1) { /* kamailio <= 3.0 */ mod->exports.name = e->v1.name; if (e->v1.cmds) { mod->exports.cmds = sr_cmd_exports_convert(ver, e->v1.cmds, mod); if (mod->exports.cmds == 0) { LM_ERR("failed to convert module command exports to 3.1 format" " for module \"%s\" (%s), interface version %d\n", mod->exports.name, mod->path, ver); ret = E_UNSPEC; goto error; } } mod->exports.params = e->v1.params; mod->exports.init_f = e->v1.init_f; mod->exports.response_f = e->v1.response_f; mod->exports.destroy_f = e->v1.destroy_f; mod->exports.onbreak_f = 0; /* not used in k <= 3.0 */ mod->exports.init_child_f = e->v1.init_child_f; mod->exports.dlflags = e->v1.dlflags; mod->exports.rpc_methods = 0; /* not used in k <= 3.0 */ mod->exports.stats = e->v1.stats; mod->exports.mi_cmds = e->v1.mi_cmds; mod->exports.items = e->v1.items; mod->exports.procs = e->v1.procs; } else { LM_ERR("unsupported module interface version %d\n", ver); ret = E_UNSPEC; goto error; } if (mod->exports.items) { /* register module pseudo-variables for kamailio modules */ LM_DBG("register PV from: %s\n", mod->exports.name); if (register_pvars_mod(mod->exports.name, mod->exports.items)!=0) { LM_ERR("failed to register pseudo-variables for module %s (%s)\n", mod->exports.name, path); ret = E_UNSPEC; goto error; } } if (mod->exports.rpc_methods){ /* register rpcs for ser modules */ i=rpc_register_array(mod->exports.rpc_methods); if (i<0){ LM_ERR("failed to register RPCs for module %s (%s)\n", mod->exports.name, path); ret = E_UNSPEC; goto error; }else if (i>0){ LM_ERR("%d duplicate RPCs name detected while registering RPCs" " declared in module %s (%s)\n", i, mod->exports.name, path); ret = E_UNSPEC; goto error; } /* i==0 => success */ } /* add cfg define for each module: MOD_modulename */ if(strlen(mod->exports.name)>=60) { LM_ERR("too long module name: %s\n", mod->exports.name); goto error; } strcpy(defmod, "MOD_"); strcat(defmod, mod->exports.name); pp_define_set_type(0); if(pp_define(strlen(defmod), defmod)<0) { LM_ERR("unable to set cfg define for module: %s\n", mod->exports.name); goto error; } /* link module in the list */ mod->next=modules; modules=mod; return 0; error: if (mod) pkg_free(mod); return ret; }
/** register built-in core pvars. * should be called before parsing the config script. * @return 0 on success */ int pv_register_core_vars(void) { return register_pvars_mod("core", core_pvs); }