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

Jan Janak jan at iptel.org
Fri May 29 13:24:16 CEST 2009


OK, thanks for the info.

  Jan.

On 29-05 13:48, Daniel-Constantin Mierla wrote:
> 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
>>>     
>



More information about the sr-dev mailing list