svn commit: samba r14992 - in branches/SAMBA_4_0/source/lib/util: .

jelmer at samba.org jelmer at samba.org
Sat Apr 8 13:44:40 GMT 2006


Author: jelmer
Date: 2006-04-08 13:44:40 +0000 (Sat, 08 Apr 2006)
New Revision: 14992

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=14992

Log:
Allow load_module() to be used externally

Modified:
   branches/SAMBA_4_0/source/lib/util/module.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/util/module.c
===================================================================
--- branches/SAMBA_4_0/source/lib/util/module.c	2006-04-08 13:43:57 UTC (rev 14991)
+++ branches/SAMBA_4_0/source/lib/util/module.c	2006-04-08 13:44:40 UTC (rev 14992)
@@ -26,18 +26,17 @@
 #include "includes.h"
 #include "system/dir.h"
 
-static void *load_module(TALLOC_CTX *mem_ctx, const char *dir, const char *name)
+/**
+ * Obtain the init function from a shared library file
+ */
+_PUBLIC_ init_module_fn load_module(TALLOC_CTX *mem_ctx, const char *path)
 {
-	char *path;
 	void *handle;
 	void *init_fn;
 
-	path = talloc_asprintf(mem_ctx, "%s/%s", dir, name);
-
 	handle = dlopen(path, RTLD_NOW);
 	if (handle == NULL) {
 		DEBUG(0, ("Unable to open %s: %s\n", path, dlerror()));
-		talloc_free(path);
 		return NULL;
 	}
 
@@ -47,13 +46,10 @@
 		DEBUG(0, ("Unable to find init_module() in %s: %s\n", path, dlerror()));
 		DEBUG(1, ("Loading module '%s' failed\n", path));
 		dlclose(handle);
-		talloc_free(path);
 		return NULL;
 	}
 
-	talloc_free(path);
-
-	return init_fn;
+	return (init_module_fn)init_fn;
 }
 
 /**
@@ -64,6 +60,7 @@
 {
 	DIR *dir;
 	struct dirent *entry;
+	char *filename;
 	int success = 0;
 	init_module_fn *ret = talloc_array(mem_ctx, init_module_fn, 2);
 
@@ -79,12 +76,16 @@
 		if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
 			continue;
 
-		ret[success] = load_module(mem_ctx, path, entry->d_name);
+		filename = talloc_asprintf(mem_ctx, "%s/%s", path, entry->d_name);
+
+		ret[success] = load_module(mem_ctx, filename);
 		if (ret[success]) {
 			ret = talloc_realloc(mem_ctx, ret, init_module_fn, success+2);
 			success++;
 			ret[success] = NULL;
 		}
+
+		talloc_free(filename);
 	}
 
 	closedir(dir);



More information about the samba-cvs mailing list