Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3853:b3e18b51c205 HEAD
Start dict server automatically when a client tries to connect to it.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 12 Jan 2006 01:47:02 +0200 |
parents | 72606d5256b8 |
children | fee060a82236 |
files | src/dict/dict-server.c src/dict/dict-server.h src/dict/main.c src/master/Makefile.am src/master/auth-process.c src/master/common.h src/master/main.c |
diffstat | 7 files changed, 34 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/dict/dict-server.c Wed Jan 11 23:48:14 2006 +0200 +++ b/src/dict/dict-server.c Thu Jan 12 01:47:02 2006 +0200 @@ -410,20 +410,21 @@ } } -struct dict_server *dict_server_init(const char *path) +struct dict_server *dict_server_init(const char *path, int fd) { struct dict_server *server; int i; server = i_new(struct dict_server, 1); server->path = i_strdup(path); + server->fd = fd; - for (i = 0; i < 2; i++) { + while (server->fd == -1) { server->fd = net_listen_unix(path, 64); if (server->fd != -1) break; - if (errno != EADDRINUSE) + if (errno != EADDRINUSE || ++i == 2) i_fatal("net_listen_unix(%s) failed: %m", path); /* see if it really exists */
--- a/src/dict/dict-server.h Wed Jan 11 23:48:14 2006 +0200 +++ b/src/dict/dict-server.h Thu Jan 12 01:47:02 2006 +0200 @@ -3,7 +3,7 @@ struct dict; -struct dict_server *dict_server_init(const char *path); +struct dict_server *dict_server_init(const char *path, int fd); void dict_server_deinit(struct dict_server *server); #endif
--- a/src/dict/main.c Wed Jan 11 23:48:14 2006 +0200 +++ b/src/dict/main.c Thu Jan 12 01:47:02 2006 +0200 @@ -14,6 +14,8 @@ #include <stdlib.h> #include <syslog.h> +#define DICT_MASTER_LISTENER_FD 3 + struct ioloop *ioloop; static struct module *modules; @@ -42,6 +44,9 @@ static void main_init(void) { + const char *path; + int fd; + lib_signals_init(); lib_signals_set_handler(SIGINT, TRUE, sig_die, NULL); lib_signals_set_handler(SIGTERM, TRUE, sig_die, NULL); @@ -54,7 +59,12 @@ modules = getenv("MODULE_DIR") == NULL ? NULL : module_dir_load(getenv("MODULE_DIR"), TRUE); - dict_server = dict_server_init(DEFAULT_DICT_SERVER_SOCKET_PATH); + path = getenv("DICT_LISTEN_FROM_FD"); + fd = path == NULL ? -1 : DICT_MASTER_LISTENER_FD; + if (path == NULL) + path = DEFAULT_DICT_SERVER_SOCKET_PATH; + + dict_server = dict_server_init(path, fd); } static void main_deinit(void) @@ -75,7 +85,7 @@ { #ifdef DEBUG if (getenv("GDB") == NULL) - fd_debug_verify_leaks(3, 1024); + fd_debug_verify_leaks(DICT_MASTER_LISTENER_FD+1, 1024); #endif /* NOTE: we start rooted, so keep the code minimal until
--- a/src/master/Makefile.am Wed Jan 11 23:48:14 2006 +0200 +++ b/src/master/Makefile.am Thu Jan 12 01:47:02 2006 +0200 @@ -18,6 +18,7 @@ dovecot_SOURCES = \ auth-process.c \ + dict-process.c \ log.c \ login-process.c \ mail-process.c \ @@ -30,6 +31,7 @@ noinst_HEADERS = \ auth-process.h \ + dict-process.h \ common.h \ log.h \ login-process.h \
--- a/src/master/auth-process.c Wed Jan 11 23:48:14 2006 +0200 +++ b/src/master/auth-process.c Thu Jan 12 01:47:02 2006 +0200 @@ -608,7 +608,7 @@ i_fatal("dup2(stderr) failed: %m"); if (dup2(fd, 4) < 0) - i_fatal("dup2(stdin) failed: %m"); + i_fatal("dup2(4) failed: %m"); for (i = 0; i <= 2; i++) fd_close_on_exec(i, FALSE);
--- a/src/master/common.h Wed Jan 11 23:48:14 2006 +0200 +++ b/src/master/common.h Thu Jan 12 01:47:02 2006 +0200 @@ -15,6 +15,7 @@ PROCESS_TYPE_IMAP, PROCESS_TYPE_POP3, PROCESS_TYPE_SSL_PARAM, + PROCESS_TYPE_DICT, PROCESS_TYPE_MAX };
--- a/src/master/main.c Wed Jan 11 23:48:14 2006 +0200 +++ b/src/master/main.c Thu Jan 12 01:47:02 2006 +0200 @@ -9,6 +9,7 @@ #include "write-full.h" #include "auth-process.h" +#include "dict-process.h" #include "login-process.h" #include "mail-process.h" #include "syslog-util.h" @@ -193,11 +194,18 @@ process_type = PID_GET_PROCESS_TYPE(pid); PID_REMOVE_PROCESS_TYPE(pid); - if (process_type == PROCESS_TYPE_IMAP || - process_type == PROCESS_TYPE_POP3) + switch (process_type) { + case PROCESS_TYPE_IMAP: + case PROCESS_TYPE_POP3: mail_process_destroyed(pid); - if (process_type == PROCESS_TYPE_SSL_PARAM) + break; + case PROCESS_TYPE_SSL_PARAM: ssl_parameter_process_destroyed(pid); + break; + case PROCESS_TYPE_DICT: + dict_process_restart(); + break; + } /* write errors to syslog */ process_type_name = process_names[process_type]; @@ -540,6 +548,7 @@ to = timeout_add(100, timeout_handler, NULL); ssl_init(); + dict_process_init(); auth_processes_init(); login_processes_init(); @@ -557,6 +566,7 @@ login_processes_deinit(); auth_processes_deinit(); + dict_process_deinit(); ssl_deinit(); timeout_remove(to);