[sr-dev] git:master: - core: load_module - compatibility with K mod paths

Daniel-Constantin Mierla miconda at gmail.com
Fri May 29 12:48:24 CEST 2009


Hello,

On 05/29/2009 01:39 PM, Jan Janak wrote:
> This is really confusing. Could you, please, describe how loadmodule works
> now?
>   

it works same way was so far in SR (ser). In additions, you can have:

loadmodule "tm.so"

which is more or less equivalent to:

loadmodule "tm"

If ".so" is present, it will not be added.

The other addition, for K compatibility:

- if path in loadmodule is not absolute, has '/' inside , but does not 
start with '/', then will search it in loadpath, for example:

loadpath "/usr/local/ser/lib"

loadmodule "modules_k/pv.so"

In SER, was trying to load only "modules_k/pv.so"

Now, if "modules_k/pv.so" is not found, will try to see if 
"/usr/local/ser/lib/modules_k/pv.so" exists, and if yes, loads it.

Cheers,
Daniel


>   Jan.
>
> On 29-05 12:24, Daniel-Constantin Mierla wrote:
>   
>> Module: sip-router
>> Branch: master
>> Commit: b27dfba5097af7e497c0177dd57f476f0b089ab4
>> URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b27dfba5097af7e497c0177dd57f476f0b089ab4
>>
>> Author: Daniel-Constantin Mierla <miconda at gmail.com>
>> Committer: Daniel-Constantin Mierla <miconda at gmail.com>
>> Date:   Fri May 29 13:08:05 2009 +0300
>>
>> - core: load_module - compatibility with K mod paths
>>
>> - preservation of SER and Kamailio module loading styles
>> - loadmodule accepts "modname.so"
>>
>> loadpath "searchpath"
>> loadmodule "modpath"
>>
>> - when modpath is modname or modname.so, search module at:
>> 	- searchpath/modname.so
>> 	- searchpath/modname/modname.so
>> - if modpath does not start with '/', search module at:
>> 	- modpath
>> 	- searchpath/modpath
>>
>> ---
>>
>>  sr_module.c |  111 +++++++++++++++++++++++++++++++++++++++++------------------
>>  1 files changed, 77 insertions(+), 34 deletions(-)
>>
>> diff --git a/sr_module.c b/sr_module.c
>> index 7986720..e1da688 100644
>> --- a/sr_module.c
>> +++ b/sr_module.c
>> @@ -260,7 +260,7 @@ int load_module(char* mod_path)
>>  	unsigned* mod_if_ver;
>>  	struct sr_module* t;
>>  	struct stat stat_buf;
>> -	char* modname;
>> +	str modname;
>>  	char* mdir;
>>  	char* nxt_mdir;
>>  	char* path;
>> @@ -269,71 +269,114 @@ int load_module(char* mod_path)
>>  	int dlflags;
>>  	int new_dlflags;
>>  	int retries;
>> +	int path_type;
>>  
>>  #ifndef RTLD_NOW
>>  /* for openbsd */
>>  #define RTLD_NOW DL_LAZY
>>  #endif
>>  	path=mod_path;
>> -	if (!strchr(path, '/') && !strchr(path, '.')) {
>> +	path_type = 0;
>> +	modname.s = path;
>> +	modname.len = strlen(mod_path);
>> +	if(modname.len>3 && strcmp(modname.s+modname.len-3, ".so")==0) {
>> +		path_type = 1;
>> +		modname.len -= 3;
>> +	}
>> +	if (!strchr(path, '/'))
>> +		path_type |= 2;
>> +	if((path_type&2) || path[0] != '/') {
>>  		/* module name was given, we try to construct the path */
>> -		modname = path;
>>  		mdir=mods_dir; /* search path */
>>  		do{
>>  			nxt_mdir=strchr(mdir, ':');
>>  			if (nxt_mdir) mdir_len=(int)(nxt_mdir-mdir);
>>  			else mdir_len=strlen(mdir);
>>  			
>> -			/* try path <MODS_DIR>/<modname>.so */
>> -			path = (char*)pkg_malloc(mdir_len + 1 /* "/" */ +
>> -									strlen(modname) + 3 /* ".so" */ + 1);
>> -			if (path==0) goto error;
>> -			memcpy(path, mdir, mdir_len);
>> -			len = mdir_len;
>> -			if (len != 0 && path[len - 1] != '/'){
>> -				path[len]='/';
>> -				len++;
>> -			}
>> -			path[len]=0;
>> -			strcat(path, modname);
>> -			strcat(path, ".so");
>> -
>> -			if (stat(path, &stat_buf) == -1) {
>> -				DBG("load_module: module file not found <%s>\n", path);
>> -				pkg_free(path);
>> -
>> -				/* try path <MODS_DIR>/<modname>/<modname>.so */
>> -				path = (char*)pkg_malloc(
>> -					mdir_len + 1 /* "/" */ +
>> -					strlen(modname) + 1 /* "/" */ +
>> -					strlen(modname) + 3 /* ".so" */ + 1);
>> +			if(path_type&2) {
>> +				/* try path <MODS_DIR>/<modname>.so */
>> +				path = (char*)pkg_malloc(mdir_len + 1 /* "/" */ +
>> +									modname.len + 3 /* ".so" */ + 1);
>>  				if (path==0) goto error;
>>  				memcpy(path, mdir, mdir_len);
>>  				len = mdir_len;
>> -				if (len != 0 && path[len - 1] != '/') {
>> +				if (len != 0 && path[len - 1] != '/'){
>>  					path[len]='/';
>>  					len++;
>>  				}
>>  				path[len]=0;
>> -				strcat(path, modname);
>> -				strcat(path, "/");
>> -				strcat(path, modname);
>> -				strcat(path, ".so");
>> +				strcat(path, modname.s);
>> +				if(!(path_type&1))
>> +					strcat(path, ".so");
>>  
>>  				if (stat(path, &stat_buf) == -1) {
>>  					DBG("load_module: module file not found <%s>\n", path);
>>  					pkg_free(path);
>> -					path=0;
>> +
>> +					/* try path <MODS_DIR>/<modname>/<modname>.so */
>> +					path = (char*)pkg_malloc(
>> +						mdir_len + 1 /* "/" */ +
>> +						modname.len + 1 /* "/" */ +
>> +						modname.len + 3 /* ".so" */ + 1);
>> +					if (path==0) goto error;
>> +					memcpy(path, mdir, mdir_len);
>> +					len = mdir_len;
>> +					if (len != 0 && path[len - 1] != '/') {
>> +						path[len]='/';
>> +						len++;
>> +					}
>> +					path[len]=0;
>> +					strncat(path, modname.s, modname.len);
>> +					strcat(path, "/");
>> +					strcat(path, modname.s);
>> +					if(!(path_type&1))
>> +						strcat(path, ".so");
>> +
>> +					if (stat(path, &stat_buf) == -1) {
>> +						DBG("load_module: module file not found <%s>\n", path);
>> +						pkg_free(path);
>> +						path=0;
>> +					}
>> +				}
>> +			} else {
>> +				/* try mod_path - S compat */
>> +				if(path==mod_path) {
>> +					if (stat(path, &stat_buf) == -1) {
>> +						DBG("load_module: module file not found <%s>\n", path);
>> +						path=0;
>> +					}
>> +				}
>> +				if(path==0) {
>> +					/* try path <MODS_DIR>/mod_path - K compat */
>> +					path = (char*)pkg_malloc(mdir_len + 1 /* "/" */ +
>> +									strlen(mod_path) + 1);
>> +					if (path==0) goto error;
>> +					memcpy(path, mdir, mdir_len);
>> +					len = mdir_len;
>> +					if (len != 0 && path[len - 1] != '/'){
>> +						path[len]='/';
>> +						len++;
>> +					}
>> +					path[len]=0;
>> +					strcat(path, mod_path);
>> +
>> +					if (stat(path, &stat_buf) == -1) {
>> +						DBG("load_module: module file not found <%s>\n", path);
>> +						pkg_free(path);
>> +						path=0;
>> +					}
>>  				}
>>  			}
>>  			mdir=nxt_mdir?nxt_mdir+1:0;
>>  		}while(path==0 && mdir);
>>  		if (path==0){
>> -			LOG(L_ERR, "ERROR: load_module: could not find module <%s> in"
>> -						" <%s>\n", modname, mods_dir);
>> +			LOG(L_ERR, "ERROR: load_module: could not find module <%.*s> in"
>> +						" <%s>\n", modname.len, modname.s, mods_dir);
>>  			goto error;
>>  		}
>>  	}
>> +	DBG("load_module: trying to load <%s>\n", path);
>> +
>>  	retries=2;
>>  	dlflags=RTLD_NOW;
>>  reload:
>>
>>
>> _______________________________________________
>> sr-dev mailing list
>> sr-dev at lists.sip-router.org
>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
>>     

-- 
Daniel-Constantin Mierla
http://www.asipto.com/




More information about the sr-dev mailing list