[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