]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Moved most of the dict settings handling to dict binary.
authorTimo Sirainen <tss@iki.fi>
Mon, 20 Apr 2009 23:33:41 +0000 (19:33 -0400)
committerTimo Sirainen <tss@iki.fi>
Mon, 20 Apr 2009 23:33:41 +0000 (19:33 -0400)
--HG--
branch : HEAD

src/dict/Makefile.am
src/dict/dict-server.c
src/dict/dict-settings.c [new file with mode: 0644]
src/dict/dict-settings.h [new file with mode: 0644]
src/dict/main.c
src/master/dict-process.c
src/master/master-settings.c
src/master/master-settings.h

index 855b1ed6d27307a0cf8914856dcf307aa958cb7e..235584c68971827901f18feaf8bd572347946c30 100644 (file)
@@ -4,6 +4,7 @@ pkglibexec_PROGRAMS = dict
 
 AM_CPPFLAGS = \
        -I$(top_srcdir)/src/lib \
+       -I$(top_srcdir)/src/lib-settings \
        -I$(top_srcdir)/src/lib-dict \
        -I$(top_srcdir)/src/lib-sql \
        -DDICT_MODULE_DIR=\""$(moduledir)/dict"\" \
@@ -25,7 +26,9 @@ dict_DEPENDENCIES = $(libs)
 
 dict_SOURCES = \
        dict-server.c \
+       dict-settings.c \
        main.c
 
 noinst_HEADERS = \
-       dict-server.h
+       dict-server.h \
+       dict-settings.h
index 03ee90e8ce3a20f2d5bc2a041c5b48281c9d98ac..67e4878e0a66de498c04ca6ff62b00679bae27fe 100644 (file)
@@ -8,6 +8,7 @@
 #include "ostream.h"
 #include "str.h"
 #include "dict.h"
+#include "dict-settings.h"
 #include "dict-client.h"
 #include "dict-server.h"
 
@@ -395,14 +396,22 @@ static int dict_client_parse_handshake(struct dict_client_connection *conn,
 
 static int dict_client_dict_init(struct dict_client_connection *conn)
 {
+       const char *const *strlist;
+       unsigned int i, count;
        const char *uri;
 
-       uri = getenv(t_strconcat("DICT_", conn->name, NULL));
-       if (uri == NULL) {
+       strlist = array_get(&dict_settings->dicts, &count);
+       for (i = 0; i < count; i += 2) {
+               if (strcmp(strlist[i], conn->name) == 0)
+                       break;
+       }
+
+       if (i == count) {
                i_error("dict client: Unconfigured dictionary name '%s'",
                        conn->name);
                return -1;
        }
+       uri = strlist[i+1];
 
        conn->dict = dict_init(uri, conn->value_type, conn->username);
        if (conn->dict == NULL) {
diff --git a/src/dict/dict-settings.c b/src/dict/dict-settings.c
new file mode 100644 (file)
index 0000000..cb6c3b7
--- /dev/null
@@ -0,0 +1,65 @@
+/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "settings-parser.h"
+#include "dict-settings.h"
+
+#undef DEF
+#define DEF(type, name) \
+       { type, #name, offsetof(struct dict_settings, name), NULL }
+
+static struct setting_define dict_setting_defines[] = {
+       DEF(SET_STR, dict_db_config),
+       { SET_STRLIST, "dict", offsetof(struct dict_settings, dicts), NULL },
+
+       SETTING_DEFINE_LIST_END
+};
+
+struct dict_settings dict_default_settings = {
+       MEMBER(dict_db_config) "",
+       MEMBER(dicts) ARRAY_INIT
+};
+
+struct setting_parser_info dict_setting_parser_info = {
+       MEMBER(defines) dict_setting_defines,
+       MEMBER(defaults) &dict_default_settings,
+
+       MEMBER(parent) NULL,
+       MEMBER(dynamic_parsers) NULL,
+
+       MEMBER(parent_offset) (size_t)-1,
+       MEMBER(type_offset) (size_t)-1,
+       MEMBER(struct_size) sizeof(struct dict_settings)
+};
+
+struct dict_settings *dict_settings;
+
+static pool_t settings_pool = NULL;
+
+struct dict_settings *dict_settings_read(void)
+{
+       struct setting_parser_context *parser;
+       struct dict_settings *set;
+       const char *error;
+
+       if (settings_pool == NULL)
+               settings_pool = pool_alloconly_create("auth settings", 1024);
+       else
+               p_clear(settings_pool);
+
+       parser = settings_parser_init(settings_pool,
+                                     &dict_setting_parser_info,
+                                     SETTINGS_PARSER_FLAG_IGNORE_UNKNOWN_KEYS);
+
+       if (settings_parse_environ(parser) < 0) {
+               i_fatal("Error reading configuration: %s",
+                       settings_parser_get_error(parser));
+       }
+
+       if (settings_parser_check(parser, settings_pool, &error) < 0)
+               i_fatal("Invalid settings: %s", error);
+
+       set = settings_parser_get(parser);
+       settings_parser_deinit(&parser);
+       return set;
+}
diff --git a/src/dict/dict-settings.h b/src/dict/dict-settings.h
new file mode 100644 (file)
index 0000000..87c3b96
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef DICT_SETTINGS_H
+#define DICT_SETTINGS_H
+
+struct dict_settings {
+       const char *dict_db_config;
+       ARRAY_DEFINE(dicts, const char *);
+};
+
+extern struct dict_settings *dict_settings;
+
+struct dict_settings *dict_settings_read(void);
+
+#endif
index 816d6bc4895dd6f7f2866798baba7c46313b3c84..2ce318e4c3a6518b7b9a1fd2ca14ee51930c46e7 100644 (file)
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "lib-signals.h"
 #include "ioloop.h"
+#include "env-util.h"
 #include "fd-close-on-exec.h"
 #include "restrict-access.h"
 #include "randgen.h"
 #include "dict.h"
 #include "dict-client.h"
 #include "dict-server.h"
+#include "dict-settings.h"
 #include "module-dir.h"
 
 #include <stdlib.h>
 #include <unistd.h>
-#include <syslog.h>
 
 #define DICT_MASTER_LISTENER_FD 3
 
@@ -79,6 +80,14 @@ static void main_init(void)
         lib_signals_ignore(SIGPIPE, TRUE);
         lib_signals_ignore(SIGALRM, FALSE);
 
+       dict_settings = dict_settings_read();
+
+       if (*dict_settings->dict_db_config != '\0') {
+               /* for berkeley db library */
+               env_put(t_strconcat("DB_CONFIG=", dict_settings->dict_db_config,
+                                   NULL));
+       }
+
        /* If master dies, the log fd gets closed and we'll quit */
        log_io = io_add(STDERR_FILENO, IO_ERROR, log_error_callback, NULL);
 
@@ -109,7 +118,6 @@ static void main_deinit(void)
        sql_drivers_deinit();
        random_deinit();
        lib_signals_deinit();
-       closelog();
 }
 
 int main(void)
index 69d3d735ba3e6c9faaf6b4486ccab578e6389c42..5f8909bfe5833710679b55e2ba49dfed74a28f39 100644 (file)
@@ -39,8 +39,8 @@ static int dict_process_create(struct dict_listener *listener)
 {
        struct dict_process *process;
        struct log_io *log;
-       const char *executable, *const *dicts;
-       unsigned int i, count;
+       const char *executable;
+       unsigned int i;
        int log_fd;
        pid_t pid;
 
@@ -100,20 +100,10 @@ static int dict_process_create(struct dict_listener *listener)
                fd_close_on_exec(i, FALSE);
 
        child_process_init_env(master_set->defaults);
+       master_settings_export_to_env(master_set->defaults);
        env_put(t_strconcat("DICT_LISTEN_FROM_FD=",
                            process->listener->path, NULL));
 
-       if (master_set->defaults->dict_db_config != NULL) {
-               env_put(t_strconcat("DB_CONFIG=",
-                                   master_set->defaults->dict_db_config,
-                                   NULL));
-       }
-
-       dicts = array_get(&master_set->defaults->dicts, &count);
-       i_assert((count % 2) == 0);
-       for (i = 0; i < count; i += 2)
-               env_put(t_strdup_printf("DICT_%s=%s", dicts[i], dicts[i+1]));
-
        executable = PKG_LIBEXECDIR"/dict";
        client_process_exec(executable, "");
        i_fatal_status(FATAL_EXEC, "execv(%s) failed: %m", executable);
@@ -152,11 +142,9 @@ static void dict_listener_input(struct dict_listener *listener)
 
        i_assert(listener->processes == NULL);
 
-       if (array_is_created(&master_set->defaults->dicts)) {
-               for (i = 0; i < master_set->defaults->dict_process_count; i++) {
-                       if (dict_process_create(listener) < 0)
-                               break;
-               }
+       for (i = 0; i < master_set->defaults->dict_process_count; i++) {
+               if (dict_process_create(listener) < 0)
+                       break;
        }
        if (i > 0)
                io_remove(&listener->io);
index 384f976d2b2ffacc93f9535862b87c681cae13f1..8ece3b46069ee56abfa86d5dfaa8086f30dcbf07 100644 (file)
@@ -198,10 +198,8 @@ static struct setting_define master_setting_defines[] = {
        DEF(SET_UINT, mail_log_max_lines_per_sec),
 
        /* dict */
-       DEF(SET_STR, dict_db_config),
        DEF(SET_UINT, dict_process_count),
        DEFLIST(auths, "auth", &master_auth_setting_parser_info),
-       { SET_STRLIST, "dict", offsetof(struct master_settings, dicts), NULL },
 
        SETTING_DEFINE_LIST_END
 };
@@ -267,8 +265,7 @@ struct master_settings master_default_settings = {
        MEMBER(mail_log_max_lines_per_sec) 10,
 
        /* dict */
-       MEMBER(dict_db_config) NULL,
-       MEMBER(dict_process_count) 1,
+       MEMBER(dict_process_count) 1
 
        /* .. */
 };
index 03e711f81cf7a171d817fb70194f01a19c8be9f3..535fb29a4bcead4b1f312afd659b1fc25fbb3e4b 100644 (file)
@@ -109,13 +109,10 @@ struct master_settings {
        unsigned int mail_log_max_lines_per_sec;
 
        /* dict */
-       const char *dict_db_config;
        unsigned int dict_process_count;
 
        ARRAY_DEFINE(auths, struct master_auth_settings *);
 
-       ARRAY_DEFINE(dicts, const char *);
-
 #ifndef CONFIG_BINARY
        /* .. */
        struct master_server_settings *server;