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);