Exemplo n.º 1
0
/* 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;
}
Exemplo n.º 2
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;
	if(register_pvars_mod("core", _core_pvs)<0)
		return -1;
	return 0;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
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;
}
Exemplo n.º 5
0
/* 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;
}
Exemplo n.º 6
0
/** 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);
}