[SR-Dev] git:master: core: loadpath can now use a list of directories

Andrei Pelinescu-Onciul andrei at iptel.org
Fri Apr 3 18:31:57 CEST 2009


Module: sip-router
Branch: master
Commit: fdbb341c72c140516578e80e9e0823779e03d409
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=fdbb341c72c140516578e80e9e0823779e03d409

Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at iptel.org>
Date:   Fri Apr  3 17:31:01 2009 +0200

core: loadpath can now use a list of directories

- loadpath can use a list of directories separated by ':',
 e.g.: loadpath "modules:modules_s:modules_k".
 First match wins (e.g. for loadmodule "textops" if
 modules/textops.so or modules/textops/textops.so exists, it will
 be loaded and the search will stop).

---

 NEWS        |    6 ++++
 sr_module.c |   90 ++++++++++++++++++++++++++++++++++++----------------------
 2 files changed, 62 insertions(+), 34 deletions(-)

diff --git a/NEWS b/NEWS
index d3d6418..ba832bf 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,10 @@ $Id$
 sip-router changes
 
 core:
+  - module search path support: loadpath takes now a list of directories
+    separated by ':'. The list is searched in-order. For each directory d
+    $d/${module_name}.so and $d/${module_name}/${module_name}.so are tried.
+  - dns TXT, EBL and PTR support (both cache and non-cached resolver)
   - support for dual module interfaces: ser and kamailio
 config script changes:
   - script mode can be switched between ser compatible, kamailio compatible
@@ -21,6 +25,8 @@ config script changes:
   - while()
   - max_while_loops - maximum iterations allowed for a while, can be changed
     at runtime. Default 100.
+build system:
+  - multiple modules directories are now supported (defined in Makefile.dirs)
 
 
 
diff --git a/sr_module.c b/sr_module.c
index 24c1445..3ff127f 100644
--- a/sr_module.c
+++ b/sr_module.c
@@ -238,7 +238,7 @@ static inline int version_control(void *handle, char *path)
  * @param modname - path or module name
  * @return 0 on success , <0 on error
  */
-int load_module(char* path)
+int load_module(char* mod_path)
 {
 	void* handle;
 	char* error;
@@ -248,6 +248,10 @@ int load_module(char* path)
 	struct sr_module* t;
 	struct stat stat_buf;
 	char* modname;
+	char* mdir;
+	char* nxt_mdir;
+	char* path;
+	int mdir_len;
 	int len;
 	int dlflags;
 	int new_dlflags;
@@ -257,49 +261,64 @@ int load_module(char* path)
 /* for openbsd */
 #define RTLD_NOW DL_LAZY
 #endif
-
+	path=mod_path;
 	if (!strchr(path, '/') && !strchr(path, '.')) {
 		/* module name was given, we try to construct the path */
 		modname = path;
-
-		/* try path <MODS_DIR>/<modname>.so */
-		path = (char*)pkg_malloc(
-			strlen(mods_dir) + 1 /* "/" */ +
-			strlen(modname) + 3 /* ".so" */ + 1);
-		strcpy(path, mods_dir);
-		len = strlen(path);
-		if (len != 0 && path[len - 1] != '/') {
-			strcat(path, "/");
-		}
-		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(
-				strlen(mods_dir) + 1 /* "/" */ +
-				strlen(modname) + 1 /* "/" */ +
-				strlen(modname) + 3 /* ".so" */ + 1);
-			strcpy(path, mods_dir);
-			len = strlen(path);
-			if (len != 0 && path[len - 1] != '/') {
-				strcat(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++;
 			}
-			strcat(path, modname);
-			strcat(path, "/");
+			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);
-				LOG(L_ERR, "ERROR: load_module: could not find module <%s>\n",
-					modname);
-				goto error;
+
+				/* try path <MODS_DIR>/<modname>/<modname>.so */
+				path = (char*)pkg_malloc(
+					mdir_len + 1 /* "/" */ +
+					strlen(modname) + 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, "/");
+				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);
+					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);
+			goto error;
 		}
 	}
 	retries=2;
@@ -373,18 +392,21 @@ reload:
 		}
 	}
 	if (register_module(*mod_if_ver, exp, path, handle)<0) goto error1;
+	if (path && path!=mod_path)
+		pkg_free(path);
 	return 0;
 
 error1:
 	dlclose(handle);
 error:
 skip:
+	if (path && path!=mod_path)
+		pkg_free(path);
 	return -1;
 }
 
 
 
-
 /* searches the module list for function name in module mod and returns 
  *  a pointer to the "name" function record union or 0 if not found
  * sets also *mod_if_ver to the module interface version (needed to know




More information about the sr-dev mailing list