changeset 6187:7c81e6d848f6 HEAD

Added pass/userdb_register_module() functions and used them to register the build-in functions instead of having a predefined array.
author Timo Sirainen <tss@iki.fi>
date Mon, 06 Aug 2007 23:16:43 +0300
parents 9a3a7ad297cf
children e609b4e3a35c
files src/auth/main.c src/auth/passdb.c src/auth/passdb.h src/auth/userdb.c src/auth/userdb.h
diffstat 5 files changed, 190 insertions(+), 96 deletions(-) [+]
line wrap: on
line diff
--- a/src/auth/main.c	Mon Aug 06 22:48:48 2007 +0300
+++ b/src/auth/main.c	Mon Aug 06 23:16:43 2007 +0300
@@ -192,6 +192,8 @@
 
 	/* Initialize databases so their configuration files can be readable
 	   only by root. Also load all modules here. */
+	passdbs_init();
+	userdbs_init();
 	auth = auth_preinit();
         password_schemes_init();
 
@@ -284,6 +286,8 @@
         auth_worker_server_deinit();
 	auth_master_listeners_deinit();
 	auth_deinit(&auth);
+	userdbs_deinit();
+	passdbs_deinit();
 	mech_deinit();
 
         password_schemes_deinit();
--- a/src/auth/passdb.c	Mon Aug 06 22:48:48 2007 +0300
+++ b/src/auth/passdb.c	Mon Aug 06 23:16:43 2007 +0300
@@ -1,6 +1,7 @@
 /* Copyright (C) 2002-2003 Timo Sirainen */
 
 #include "common.h"
+#include "array.h"
 #include "auth-module.h"
 #include "password-scheme.h"
 #include "auth-worker-server.h"
@@ -8,50 +9,44 @@
 
 #include <stdlib.h>
 
-extern struct passdb_module_interface passdb_passwd;
-extern struct passdb_module_interface passdb_bsdauth;
-extern struct passdb_module_interface passdb_shadow;
-extern struct passdb_module_interface passdb_passwd_file;
-extern struct passdb_module_interface passdb_pam;
-extern struct passdb_module_interface passdb_checkpassword;
-extern struct passdb_module_interface passdb_vpopmail;
-extern struct passdb_module_interface passdb_ldap;
-extern struct passdb_module_interface passdb_sql;
-extern struct passdb_module_interface passdb_sia;
+static ARRAY_DEFINE(passdb_interfaces, struct passdb_module_interface *);
+
+static struct passdb_module_interface *passdb_interface_find(const char *name)
+{
+	struct passdb_module_interface *const *ifaces;
+	unsigned int i, count;
+
+	ifaces = array_get(&passdb_interfaces, &count);
+	for (i = 0; i < count; i++) {
+		if (strcmp(ifaces[i]->name, name) == 0)
+			return ifaces[i];
+	}
+	return NULL;
+}
 
-struct passdb_module_interface *passdb_interfaces[] = {
-#ifdef PASSDB_PASSWD
-	&passdb_passwd,
-#endif
-#ifdef PASSDB_BSDAUTH
-	&passdb_bsdauth,
-#endif
-#ifdef PASSDB_PASSWD_FILE
-	&passdb_passwd_file,
-#endif
-#ifdef PASSDB_PAM
-	&passdb_pam,
-#endif
-#ifdef PASSDB_CHECKPASSWORD
-	&passdb_checkpassword,
-#endif
-#ifdef PASSDB_SHADOW
-	&passdb_shadow,
-#endif
-#ifdef PASSDB_VPOPMAIL
-	&passdb_vpopmail,
-#endif
-#ifdef PASSDB_LDAP
-	&passdb_ldap,
-#endif
-#ifdef PASSDB_SQL
-	&passdb_sql,
-#endif
-#ifdef PASSDB_SIA
-	&passdb_sia,
-#endif
-	NULL
-};
+void passdb_register_module(struct passdb_module_interface *iface)
+{
+	if (passdb_interface_find(iface->name) != NULL) {
+		i_panic("passdb_register_module(%s): Already registered",
+			iface->name);
+	}
+	array_append(&passdb_interfaces, &iface, 1);
+}
+
+void passdb_unregister_module(struct passdb_module_interface *iface)
+{
+	struct passdb_module_interface *const *ifaces;
+	unsigned int i, count;
+
+	ifaces = array_get(&passdb_interfaces, &count);
+	for (i = 0; i < count; i++) {
+		if (ifaces[i] == iface) {
+			array_delete(&passdb_interfaces, i, 1);
+			return;
+		}
+	}
+	i_panic("passdb_unregister_module(%s): Not registered", iface->name);
+}
 
 bool passdb_get_credentials(struct auth_request *auth_request,
 			    const char *input, const char *input_scheme,
@@ -127,7 +122,7 @@
 struct auth_passdb *passdb_preinit(struct auth *auth, const char *driver,
 				   const char *args, unsigned int id)
 {
-	struct passdb_module_interface **p, *iface;
+	struct passdb_module_interface *iface;
         struct auth_passdb *auth_passdb;
 
 	if (args == NULL) args = "";
@@ -137,14 +132,7 @@
         auth_passdb->args = p_strdup(auth->pool, args);
         auth_passdb->id = id;
 
-	iface = NULL;
-	for (p = passdb_interfaces; *p != NULL; p++) {
-		if (strcmp((*p)->name, driver) == 0) {
-			iface = *p;
-			break;
-		}
-	}
-	
+	iface = passdb_interface_find(driver);
 #ifdef HAVE_MODULES
 	if (iface == NULL)
 		auth_passdb->module = auth_module_open(driver);
@@ -195,3 +183,54 @@
                 auth_module_close(&passdb->module);
 #endif
 }
+
+extern struct passdb_module_interface passdb_passwd;
+extern struct passdb_module_interface passdb_bsdauth;
+extern struct passdb_module_interface passdb_shadow;
+extern struct passdb_module_interface passdb_passwd_file;
+extern struct passdb_module_interface passdb_pam;
+extern struct passdb_module_interface passdb_checkpassword;
+extern struct passdb_module_interface passdb_vpopmail;
+extern struct passdb_module_interface passdb_ldap;
+extern struct passdb_module_interface passdb_sql;
+extern struct passdb_module_interface passdb_sia;
+
+void passdbs_init(void)
+{
+	i_array_init(&passdb_interfaces, 16);
+#ifdef PASSDB_PASSWD
+	passdb_register_module(&passdb_passwd);
+#endif
+#ifdef PASSDB_BSDAUTH
+	passdb_register_module(&passdb_bsdauth);
+#endif
+#ifdef PASSDB_PASSWD_FILE
+	passdb_register_module(&passdb_passwd_file);
+#endif
+#ifdef PASSDB_PAM
+	passdb_register_module(&passdb_pam);
+#endif
+#ifdef PASSDB_CHECKPASSWORD
+	passdb_register_module(&passdb_checkpassword);
+#endif
+#ifdef PASSDB_SHADOW
+	passdb_register_module(&passdb_shadow);
+#endif
+#ifdef PASSDB_VPOPMAIL
+	passdb_register_module(&passdb_vpopmail);
+#endif
+#ifdef PASSDB_LDAP
+	passdb_register_module(&passdb_ldap);
+#endif
+#ifdef PASSDB_SQL
+	passdb_register_module(&passdb_sql);
+#endif
+#ifdef PASSDB_SIA
+	passdb_register_module(&passdb_sia);
+#endif
+}
+
+void passdbs_deinit(void)
+{
+	array_free(&passdb_interfaces);
+}
--- a/src/auth/passdb.h	Mon Aug 06 22:48:48 2007 +0300
+++ b/src/auth/passdb.h	Mon Aug 06 23:16:43 2007 +0300
@@ -85,6 +85,12 @@
 void passdb_init(struct auth_passdb *passdb);
 void passdb_deinit(struct auth_passdb *passdb);
 
+void passdb_register_module(struct passdb_module_interface *iface);
+void passdb_unregister_module(struct passdb_module_interface *iface);
+
+void passdbs_init(void);
+void passdbs_deinit(void);
+
 #include "auth-request.h"
 
 #endif
--- a/src/auth/userdb.c	Mon Aug 06 22:48:48 2007 +0300
+++ b/src/auth/userdb.c	Mon Aug 06 23:16:43 2007 +0300
@@ -1,6 +1,7 @@
 /* Copyright (C) 2002-2003 Timo Sirainen */
 
 #include "common.h"
+#include "array.h"
 #include "auth-module.h"
 #include "auth-worker-server.h"
 #include "userdb.h"
@@ -9,42 +10,44 @@
 #include <pwd.h>
 #include <grp.h>
 
-extern struct userdb_module_interface userdb_prefetch;
-extern struct userdb_module_interface userdb_static;
-extern struct userdb_module_interface userdb_passwd;
-extern struct userdb_module_interface userdb_passwd_file;
-extern struct userdb_module_interface userdb_vpopmail;
-extern struct userdb_module_interface userdb_ldap;
-extern struct userdb_module_interface userdb_sql;
-extern struct userdb_module_interface userdb_nss;
+static ARRAY_DEFINE(userdb_interfaces, struct userdb_module_interface *);
+
+static struct userdb_module_interface *userdb_interface_find(const char *name)
+{
+	struct userdb_module_interface *const *ifaces;
+	unsigned int i, count;
+
+	ifaces = array_get(&userdb_interfaces, &count);
+	for (i = 0; i < count; i++) {
+		if (strcmp(ifaces[i]->name, name) == 0)
+			return ifaces[i];
+	}
+	return NULL;
+}
 
-struct userdb_module_interface *userdb_interfaces[] = {
-#ifdef USERDB_PASSWD
-	&userdb_passwd,
-#endif
-#ifdef USERDB_PASSWD_FILE
-	&userdb_passwd_file,
-#endif
-#ifdef USERDB_PREFETCH
-	&userdb_prefetch,
-#endif
-#ifdef USERDB_STATIC
-	&userdb_static,
-#endif
-#ifdef USERDB_VPOPMAIL
-	&userdb_vpopmail,
-#endif
-#ifdef USERDB_LDAP
-	&userdb_ldap,
-#endif
-#ifdef USERDB_SQL
-	&userdb_sql,
-#endif
-#ifdef USERDB_NSS
-	&userdb_nss,
-#endif
-	NULL
-};
+void userdb_register_module(struct userdb_module_interface *iface)
+{
+	if (userdb_interface_find(iface->name) != NULL) {
+		i_panic("userdb_register_module(%s): Already registered",
+			iface->name);
+	}
+	array_append(&userdb_interfaces, &iface, 1);
+}
+
+void userdb_unregister_module(struct userdb_module_interface *iface)
+{
+	struct userdb_module_interface *const *ifaces;
+	unsigned int i, count;
+
+	ifaces = array_get(&userdb_interfaces, &count);
+	for (i = 0; i < count; i++) {
+		if (ifaces[i] == iface) {
+			array_delete(&userdb_interfaces, i, 1);
+			return;
+		}
+	}
+	i_panic("userdb_unregister_module(%s): Not registered", iface->name);
+}
 
 uid_t userdb_parse_uid(struct auth_request *request, const char *str)
 {
@@ -100,7 +103,7 @@
 
 void userdb_preinit(struct auth *auth, const char *driver, const char *args)
 {
-	struct userdb_module_interface **p, *iface;
+	struct userdb_module_interface *iface;
         struct auth_userdb *auth_userdb, **dest;
 
 	if (args == NULL) args = "";
@@ -113,14 +116,7 @@
 		auth_userdb->num++;
 	*dest = auth_userdb;
 
-	iface = NULL;
-	for (p = userdb_interfaces; *p != NULL; p++) {
-		if (strcmp((*p)->name, driver) == 0) {
-			iface = *p;
-			break;
-		}
-	}
-	
+	iface = userdb_interface_find(driver);
 #ifdef HAVE_MODULES
 	if (auth_userdb->userdb == NULL)
 		auth_userdb->module = auth_module_open(driver);
@@ -167,3 +163,46 @@
                 auth_module_close(&userdb->module);
 #endif
 }
+
+extern struct userdb_module_interface userdb_prefetch;
+extern struct userdb_module_interface userdb_static;
+extern struct userdb_module_interface userdb_passwd;
+extern struct userdb_module_interface userdb_passwd_file;
+extern struct userdb_module_interface userdb_vpopmail;
+extern struct userdb_module_interface userdb_ldap;
+extern struct userdb_module_interface userdb_sql;
+extern struct userdb_module_interface userdb_nss;
+
+void userdbs_init(void)
+{
+	i_array_init(&userdb_interfaces, 16);
+#ifdef USERDB_PASSWD
+	userdb_register_module(&userdb_passwd);
+#endif
+#ifdef USERDB_PASSWD_FILE
+	userdb_register_module(&userdb_passwd_file);
+#endif
+#ifdef USERDB_PREFETCH
+	userdb_register_module(&userdb_prefetch);
+#endif
+#ifdef USERDB_STATIC
+	userdb_register_module(&userdb_static);
+#endif
+#ifdef USERDB_VPOPMAIL
+	userdb_register_module(&userdb_vpopmail);
+#endif
+#ifdef USERDB_LDAP
+	userdb_register_module(&userdb_ldap);
+#endif
+#ifdef USERDB_SQL
+	userdb_register_module(&userdb_sql);
+#endif
+#ifdef USERDB_NSS
+	userdb_register_module(&userdb_nss);
+#endif
+}
+
+void userdbs_deinit(void)
+{
+	array_free(&userdb_interfaces);
+}
--- a/src/auth/userdb.h	Mon Aug 06 22:48:48 2007 +0300
+++ b/src/auth/userdb.h	Mon Aug 06 23:16:43 2007 +0300
@@ -45,6 +45,12 @@
 void userdb_init(struct auth_userdb *userdb);
 void userdb_deinit(struct auth_userdb *userdb);
 
+void userdb_register_module(struct userdb_module_interface *iface);
+void userdb_unregister_module(struct userdb_module_interface *iface);
+
+void userdbs_init(void);
+void userdbs_deinit(void);
+
 #include "auth-request.h"
 
 #endif