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

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


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:




More information about the sr-dev mailing list