Mercurial > dovecot > original-hg > dovecot-1.2
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