changeset 3917:ae292bd41926 HEAD

Added --build-ssl-parameters option to build them.
author Timo Sirainen <tss@iki.fi>
date Sun, 22 Jan 2006 12:50:54 +0200
parents 3c10e68ceb7c
children 40a461d554e6
files src/master/main.c src/master/ssl-init.c src/master/ssl-init.h
diffstat 3 files changed, 35 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/master/main.c	Sun Jan 22 12:27:25 2006 +0200
+++ b/src/master/main.c	Sun Jan 22 12:50:54 2006 +0200
@@ -602,8 +602,9 @@
 
 static void print_help(void)
 {
-	printf("Usage: dovecot [-F] [-c <config file>] "
-	       "[--version] [--build-options]\n");
+	printf(
+"Usage: dovecot [-F] [-c <config file>] [-p] [--build-ssl-parameters]\n"
+"       [--exec-mail <protocol>] [--version] [--build-options]\n");
 }
 
 static void print_build_options(void)
@@ -699,7 +700,7 @@
 {
 	/* parse arguments */
 	const char *exec_protocol = NULL, *exec_section = NULL, *user, *home;
-	bool foreground = FALSE, ask_key_pass = FALSE;
+	bool foreground = FALSE, ask_key_pass = FALSE, build_parameters = FALSE;
 	int i;
 
 #ifdef DEBUG
@@ -729,6 +730,8 @@
 			exec_protocol = argv[i];
 			if (i+1 != argc) 
 				exec_section = argv[++i];
+		} else if (strcmp(argv[i], "--build-ssl-parameters") == 0) {
+			build_parameters = TRUE;
 		} else if (strcmp(argv[i], "--version") == 0) {
 			printf("%s\n", VERSION);
 			return 0;
@@ -768,6 +771,10 @@
 			sizeof(ssl_manual_key_password));
 		t_pop();
 	}
+	if (build_parameters) {
+		ssl_check_parameters_file(TRUE);
+		exit(0);
+	}
 
 	/* save TZ environment. AIX depends on it to get the timezone
 	   correctly. */
--- a/src/master/ssl-init.c	Sun Jan 22 12:27:25 2006 +0200
+++ b/src/master/ssl-init.c	Sun Jan 22 12:50:54 2006 +0200
@@ -70,7 +70,7 @@
 	generating = FALSE;
 }
 
-static bool check_parameters_file_set(struct settings *set)
+static bool check_parameters_file_set(struct settings *set, bool foreground)
 {
 	const char *path;
 	struct stat st;
@@ -100,18 +100,27 @@
 		st.st_mtime + (time_t)(set->ssl_parameters_regenerate*3600);
 	if (regen_time < ioloop_time || st.st_size == 0 ||
 	    st.st_uid != master_uid || st.st_gid != getegid()) {
-		if (st.st_mtime == 0) {
-			i_info("Generating Diffie-Hellman parameters "
-			       "for the first time. This may take a while..");
+		if (foreground) {
+			i_info("Generating Diffie-Hellman parameters. "
+			       "This may take a while..");
+			generate_parameters_file(path);
+		} else {
+			if (st.st_mtime == 0) {
+				i_info("Generating Diffie-Hellman parameters "
+				       "for the first time. This may take "
+				       "a while..");
+			}
+			start_generate_process(path);
 		}
-		start_generate_process(path);
 		return FALSE;
+	} else if (foreground) {
+		i_info("Diffie-Hellman parameter file already exists.");
 	}
 
 	return TRUE;
 }
 
-static void check_parameters_file(void *context __attr_unused__)
+void ssl_check_parameters_file(bool foreground)
 {
 	struct server_settings *server;
 
@@ -119,23 +128,25 @@
 		return;
 
 	for (server = settings_root; server != NULL; server = server->next) {
-		if (server->imap != NULL &&
-		    !check_parameters_file_set(server->imap))
-			break;
-		if (server->pop3 != NULL &&
-		    !check_parameters_file_set(server->pop3))
+		if (server->defaults != NULL &&
+		    !check_parameters_file_set(server->defaults, foreground))
 			break;
 	}
 }
 
+static void check_parameters_file_timeout(void *context __attr_unused__)
+{
+	ssl_check_parameters_file(FALSE);
+}
+
 void ssl_init(void)
 {
 	generating = FALSE;
 
 	/* check every 10 mins */
-	to = timeout_add(600 * 1000, check_parameters_file, NULL);
+	to = timeout_add(600 * 1000, check_parameters_file_timeout, NULL);
 
-	check_parameters_file(NULL);
+        ssl_check_parameters_file(FALSE);
 }
 
 void ssl_deinit(void)
--- a/src/master/ssl-init.h	Sun Jan 22 12:27:25 2006 +0200
+++ b/src/master/ssl-init.h	Sun Jan 22 12:50:54 2006 +0200
@@ -5,6 +5,7 @@
 
 void ssl_parameter_process_destroyed(pid_t pid);
 
+void ssl_check_parameters_file(bool foreground);
 void _ssl_generate_parameters(int fd, const char *fname);
 
 void ssl_init(void);