Mercurial > dovecot > core-2.2
changeset 4517:e661182eab75 HEAD
Berkeley DB dict support is now enabled only when using --with-db configure option.
author | Timo Sirainen <timo.sirainen@movial.fi> |
---|---|
date | Sun, 30 Jul 2006 22:27:24 +0300 |
parents | aa2f73a4df26 |
children | ed489df90232 |
files | configure.in src/deliver/deliver.c src/dict/Makefile.am src/dict/main.c src/imap/main.c src/lib-dict/.cvsignore src/lib-dict/Makefile.am src/lib-dict/dict-client.c src/lib-dict/dict-client.h src/lib-dict/dict-db.c src/lib-dict/dict-private.h src/lib-dict/dict-sql.c src/lib-dict/dict.c src/lib-dict/dict.h src/pop3/main.c |
diffstat | 15 files changed, 129 insertions(+), 74 deletions(-) [+] |
line wrap: on
line diff
--- a/configure.in Sun Jul 30 21:49:38 2006 +0300 +++ b/configure.in Sun Jul 30 22:27:24 2006 +0300 @@ -165,6 +165,15 @@ fi, want_prefetch_userdb=yes) +AC_ARG_WITH(db, +[ --with-db Build with Berkeley DB support], + if test x$withval = xno; then + want_db=no + else + want_db=yes + fi, + want_db=no) + dnl The --with-sql is useful only if Dovecot is being built with all the SQL dnl drivers as modules. If any SQL driver is built-in, this option is ignored. AC_ARG_WITH(sql, @@ -1432,6 +1441,29 @@ ]) fi +dict_drivers=client + +if test $want_db = yes; then + AC_MSG_CHECKING([db_env_create in -ldb]) + old_LIBS=$LIBS + LIBS="$LIBS -ldb" + AC_TRY_LINK([ + #include <db.h> + ], [ + db_env_create(0, 0); + ], [ + AC_MSG_RESULT(yes) + AC_CHECK_HEADER(db.h, [ + DICT_LIBS="$DICT_LIBS -ldb" + dict_drivers="$dict_drivers db" + AC_DEFINE(BUILD_DB,, Build with Berkeley DB support) + ]) + ], [ + AC_MSG_RESULT(no) + ]) + LIBS=$old_LIBS +fi + if test $want_pgsql = yes; then # based on code from PHP for i in /usr /usr/local /usr/local/pgsql; do @@ -1626,6 +1658,9 @@ AC_SUBST(SQL_CFLAGS) AC_SUBST(SQL_LIBS) +AC_SUBST(DICT_LIBS) +AC_SUBST(dict_drivers) + dnl ** dnl ** Index file compatibility flags dnl **
--- a/src/deliver/deliver.c Sun Jul 30 21:49:38 2006 +0300 +++ b/src/deliver/deliver.c Sun Jul 30 22:27:24 2006 +0300 @@ -468,7 +468,7 @@ if (deliver_set->sendmail_path == NULL) deliver_set->sendmail_path = DEFAULT_SENDMAIL_PATH; - dict_client_register(); + dict_driver_register(&dict_driver_client); duplicate_init(); mail_storage_init(); mail_storage_register_all(); @@ -557,7 +557,7 @@ mail_storage_deinit(); duplicate_deinit(); - dict_client_unregister(); + dict_driver_unregister(&dict_driver_client); lib_signals_deinit(); io_loop_destroy(&ioloop);
--- a/src/dict/Makefile.am Sun Jul 30 21:49:38 2006 +0300 +++ b/src/dict/Makefile.am Sun Jul 30 22:27:24 2006 +0300 @@ -19,6 +19,7 @@ $(libs) \ $(RAND_LIBS) \ $(MODULE_LIBS) \ + $(DICT_LIBS) \ $(SQL_LIBS) dict_DEPENDENCIES = $(libs)
--- a/src/dict/main.c Sun Jul 30 21:49:38 2006 +0300 +++ b/src/dict/main.c Sun Jul 30 22:27:24 2006 +0300 @@ -7,7 +7,7 @@ #include "restrict-access.h" #include "randgen.h" #include "sql-api.h" -#include "dict-sql.h" +#include "dict.h" #include "dict-client.h" #include "dict-server.h" #include "module-dir.h" @@ -68,8 +68,7 @@ /* If master dies, the log fd gets closed and we'll quit */ log_io = io_add(STDERR_FILENO, IO_ERROR, log_error_callback, NULL); - dict_client_register(); - dict_sql_register(); + dict_drivers_register_all(); modules = getenv("MODULE_DIR") == NULL ? NULL : module_dir_load(getenv("MODULE_DIR"), NULL, TRUE); @@ -89,8 +88,7 @@ module_dir_unload(&modules); - dict_sql_unregister(); - dict_client_unregister(); + dict_drivers_unregister_all(); sql_drivers_deinit(); random_deinit();
--- a/src/imap/main.c Sun Jul 30 21:49:38 2006 +0300 +++ b/src/imap/main.c Sun Jul 30 22:27:24 2006 +0300 @@ -172,7 +172,7 @@ capability_string = str_new(default_pool, sizeof(CAPABILITY_STRING)+32); str_append(capability_string, CAPABILITY_STRING); - dict_client_register(); + dict_driver_register(&dict_driver_client); mail_storage_init(); mail_storage_register_all(); clients_init(); @@ -241,7 +241,7 @@ imap_thread_deinit(); commands_deinit(); mail_storage_deinit(); - dict_client_unregister(); + dict_driver_unregister(&dict_driver_client); random_deinit(); pool_unref(namespace_pool);
--- a/src/lib-dict/.cvsignore Sun Jul 30 21:49:38 2006 +0300 +++ b/src/lib-dict/.cvsignore Sun Jul 30 22:27:24 2006 +0300 @@ -6,3 +6,4 @@ Makefile Makefile.in so_locations +dict-drivers-register.c
--- a/src/lib-dict/Makefile.am Sun Jul 30 21:49:38 2006 +0300 +++ b/src/lib-dict/Makefile.am Sun Jul 30 22:27:24 2006 +0300 @@ -1,5 +1,7 @@ noinst_LIBRARIES = libdict.a +dict_drivers = @dict_drivers@ + AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib \ -I$(top_srcdir)/src/lib-sql \ @@ -10,11 +12,44 @@ dict.c \ dict-client.c \ dict-db.c \ - dict-sql.c + dict-sql.c \ + dict-drivers-register.c noinst_HEADERS = \ dict.h \ dict-client.h \ dict-private.h \ - dict-db.h \ dict-sql.h + +dict-drivers-register.c: Makefile + rm -f $@ + echo '/* this file automatically generated by Makefile */' >$@ + echo '#include "lib.h"' >>$@ + echo '#include "dict.h"' >>$@ + echo '#include "dict-sql.h"' >>$@ + for i in $(dict_drivers) null; do \ + if [ "$${i}" != "null" ]; then \ + echo "extern struct dict dict_driver_$${i};" >>$@ ; \ + fi \ + done + echo 'void dict_drivers_register_all(void) {' >>$@ + echo 'dict_sql_register();' >>$@ + for i in $(dict_drivers) null; do \ + if [ "$${i}" != "null" ]; then \ + echo "dict_driver_register(&dict_driver_$${i});" >>$@ ; \ + fi \ + done + echo '}' >>$@ + echo 'void dict_drivers_unregister_all(void) {' >>$@ + echo 'dict_sql_unregister();' >>$@ + for i in $(dict_drivers) null; do \ + if [ "$${i}" != "null" ]; then \ + echo "dict_driver_unregister(&dict_driver_$${i});" >>$@ ; \ + fi \ + done + echo '}' >>$@ + +DISTFILES = $(DIST_COMMON) $(dist_sources) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +distclean-generic: + rm -f Makefile dict-drivers-register.c
--- a/src/lib-dict/dict-client.c Sun Jul 30 21:49:38 2006 +0300 +++ b/src/lib-dict/dict-client.c Sun Jul 30 22:27:24 2006 +0300 @@ -282,7 +282,7 @@ } static struct dict * -client_dict_init(struct dict *dict_class, const char *uri, +client_dict_init(struct dict *driver, const char *uri, enum dict_data_type value_type, const char *username) { struct client_dict *dict; @@ -299,7 +299,7 @@ pool = pool_alloconly_create("client dict", 1024); dict = p_new(pool, struct client_dict, 1); dict->pool = pool; - dict->dict = *dict_class; + dict->dict = *driver; dict->value_type = value_type; dict->username = p_strdup(pool, username); @@ -536,7 +536,7 @@ t_pop(); } -static struct dict client_dict = { +struct dict dict_driver_client = { MEMBER(name) "proxy", { @@ -554,13 +554,3 @@ client_dict_atomic_inc } }; - -void dict_client_register(void) -{ - dict_class_register(&client_dict); -} - -void dict_client_unregister(void) -{ - dict_class_unregister(&client_dict); -}
--- a/src/lib-dict/dict-client.h Sun Jul 30 21:49:38 2006 +0300 +++ b/src/lib-dict/dict-client.h Sun Jul 30 22:27:24 2006 +0300 @@ -1,6 +1,8 @@ #ifndef __DICT_CLIENT_H #define __DICT_CLIENT_H +#include "dict.h" + #define DEFAULT_DICT_SERVER_SOCKET_PATH PKG_RUNDIR"/dict-server" #define DICT_CLIENT_PROTOCOL_MAJOR_VERSION 2 @@ -31,10 +33,9 @@ DICT_PROTOCOL_REPLY_FAIL = 'F' }; +extern struct dict dict_driver_client; + const char *dict_client_escape(const char *src); const char *dict_client_unescape(const char *src); -void dict_client_register(void); -void dict_client_unregister(void); - #endif
--- a/src/lib-dict/dict-db.c Sun Jul 30 21:49:38 2006 +0300 +++ b/src/lib-dict/dict-db.c Sun Jul 30 22:27:24 2006 +0300 @@ -2,8 +2,8 @@ #include "lib.h" #include "dict-private.h" -#include "dict-db.h" +#ifdef BUILD_DB #include <stdlib.h> #include <db.h> @@ -59,7 +59,7 @@ (*ua < *ub ? -1 : 0); } -static struct dict *db_dict_init(struct dict *dict_class, const char *uri, +static struct dict *db_dict_init(struct dict *driver, const char *uri, enum dict_data_type value_type, const char *username __attr_unused__) { @@ -72,7 +72,7 @@ pool = pool_alloconly_create("db dict", 1024); dict = p_new(pool, struct db_dict, 1); dict->pool = pool; - dict->dict = *dict_class; + dict->dict = *driver; /* prepare the environment */ ret = db_env_create(&dict->db_env, 0); @@ -407,7 +407,7 @@ /* FIXME */ } -static struct dict dict_db_class = { +struct dict dict_driver_db = { MEMBER(name) "db", { db_dict_init, @@ -424,13 +424,4 @@ db_dict_atomic_inc } }; - -void dict_db_register(void) -{ - dict_class_register(&dict_db_class); -} - -void dict_db_unregister(void) -{ - dict_class_unregister(&dict_db_class); -} +#endif
--- a/src/lib-dict/dict-private.h Sun Jul 30 21:49:38 2006 +0300 +++ b/src/lib-dict/dict-private.h Sun Jul 30 22:27:24 2006 +0300 @@ -4,7 +4,7 @@ #include "dict.h" struct dict_vfuncs { - struct dict *(*init)(struct dict *dict_class, const char *uri, + struct dict *(*init)(struct dict *dict_driver, const char *uri, enum dict_data_type value_type, const char *username); void (*deinit)(struct dict *dict);
--- a/src/lib-dict/dict-sql.c Sun Jul 30 21:49:38 2006 +0300 +++ b/src/lib-dict/dict-sql.c Sun Jul 30 22:27:24 2006 +0300 @@ -102,7 +102,7 @@ } static struct dict * -sql_dict_init(struct dict *dict_class, const char *uri, +sql_dict_init(struct dict *driver, const char *uri, enum dict_data_type value_type __attr_unused__, const char *username) { @@ -112,7 +112,7 @@ pool = pool_alloconly_create("sql dict", 1024); dict = p_new(pool, struct sql_dict, 1); dict->pool = pool; - dict->dict = *dict_class; + dict->dict = *driver; dict->username = p_strdup(pool, username); if (sql_dict_read_config(dict, uri) < 0) { @@ -121,7 +121,7 @@ } t_push(); - dict->db = sql_init(dict_class->name, dict->connect_string); + dict->db = sql_init(driver->name, dict->connect_string); t_pop(); return &dict->dict; } @@ -440,7 +440,7 @@ } }; -static struct dict *dict_sql_classes; +static struct dict *dict_sql_drivers; void dict_sql_register(void) { @@ -449,13 +449,13 @@ /* @UNSAFE */ drivers = array_get(&sql_drivers, &count); - dict_sql_classes = i_new(struct dict, count + 1); + dict_sql_drivers = i_new(struct dict, count + 1); for (i = 0; i < count; i++) { - dict_sql_classes[i] = sql_dict; - dict_sql_classes[i].name = drivers[i]->name; + dict_sql_drivers[i] = sql_dict; + dict_sql_drivers[i].name = drivers[i]->name; - dict_class_register(&dict_sql_classes[i]); + dict_driver_register(&dict_sql_drivers[i]); } } @@ -463,7 +463,7 @@ { int i; - for (i = 0; dict_sql_classes[i].name != NULL; i++) - dict_class_unregister(&dict_sql_classes[i]); - i_free(dict_sql_classes); + for (i = 0; dict_sql_drivers[i].name != NULL; i++) + dict_driver_unregister(&dict_sql_drivers[i]); + i_free(dict_sql_drivers); }
--- a/src/lib-dict/dict.c Sun Jul 30 21:49:38 2006 +0300 +++ b/src/lib-dict/dict.c Sun Jul 30 22:27:24 2006 +0300 @@ -5,14 +5,14 @@ #include "dict-sql.h" #include "dict-private.h" -static ARRAY_DEFINE(dict_classes, struct dict *); +static ARRAY_DEFINE(dict_drivers, struct dict *); -static struct dict *dict_class_lookup(const char *name) +static struct dict *dict_driver_lookup(const char *name) { struct dict *const *dicts; unsigned int i, count; - dicts = array_get(&dict_classes, &count); + dicts = array_get(&dict_drivers, &count); for (i = 0; i < count; i++) { if (strcmp(dicts[i]->name, name) == 0) return dicts[i]; @@ -20,35 +20,35 @@ return NULL; } -void dict_class_register(struct dict *dict_class) +void dict_driver_register(struct dict *driver) { - if (!array_is_created(&dict_classes)) - ARRAY_CREATE(&dict_classes, default_pool, struct dict *, 8); + if (!array_is_created(&dict_drivers)) + ARRAY_CREATE(&dict_drivers, default_pool, struct dict *, 8); - if (dict_class_lookup(dict_class->name) != NULL) { - i_fatal("dict_class_register(%s): Already registered", - dict_class->name); + if (dict_driver_lookup(driver->name) != NULL) { + i_fatal("dict_driver_register(%s): Already registered", + driver->name); } - array_append(&dict_classes, &dict_class, 1); + array_append(&dict_drivers, &driver, 1); } -void dict_class_unregister(struct dict *dict_class) +void dict_driver_unregister(struct dict *driver) { struct dict *const *dicts; unsigned int i, count; - dicts = array_get(&dict_classes, &count); + dicts = array_get(&dict_drivers, &count); for (i = 0; i < count; i++) { - if (dicts[i] == dict_class) { - array_delete(&dict_classes, i, 1); + if (dicts[i] == driver) { + array_delete(&dict_drivers, i, 1); break; } } i_assert(i < count); - if (array_count(&dict_classes) == 0) - array_free(&dict_classes); + if (array_count(&dict_drivers) == 0) + array_free(&dict_drivers); } struct dict *dict_init(const char *uri, enum dict_data_type value_type, @@ -65,7 +65,7 @@ t_push(); name = t_strdup_until(uri, p); - dict = dict_class_lookup(name); + dict = dict_driver_lookup(name); if (dict == NULL) { i_error("Unknown dict module: %s", name); t_pop();
--- a/src/lib-dict/dict.h Sun Jul 30 21:49:38 2006 +0300 +++ b/src/lib-dict/dict.h Sun Jul 30 22:27:24 2006 +0300 @@ -17,8 +17,11 @@ DICT_DATA_TYPE_UINT32 }; -void dict_class_register(struct dict *dict_class); -void dict_class_unregister(struct dict *dict_class); +void dict_driver_register(struct dict *driver); +void dict_driver_unregister(struct dict *driver); + +void dict_drivers_register_all(void); +void dict_drivers_unregister_all(void); /* Open dictionary with given URI (type:data). If URI is invalid, returns NULL. */
--- a/src/pop3/main.c Sun Jul 30 21:49:38 2006 +0300 +++ b/src/pop3/main.c Sun Jul 30 22:27:24 2006 +0300 @@ -182,7 +182,7 @@ log_error_callback, NULL); } - dict_client_register(); + dict_driver_register(&dict_driver_client); mail_storage_init(); mail_storage_register_all(); clients_init(); @@ -255,7 +255,7 @@ module_dir_unload(&modules); mail_storage_deinit(); - dict_client_unregister(); + dict_driver_unregister(&dict_driver_client); random_deinit(); lib_signals_deinit();