Module: sip-router
Branch: master
Commit: b27dfba5097af7e497c0177dd57f476f0b089ab4
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b27dfba…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)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: