dovecot-2.2: ssl-params: Fixed closing listener fds for regenera...
dovecot at dovecot.org
dovecot at dovecot.org
Sat Nov 2 15:18:30 EET 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/07c083496665
changeset: 16911:07c083496665
user: Timo Sirainen <tss at iki.fi>
date: Sat Nov 02 15:18:15 2013 +0200
description:
ssl-params: Fixed closing listener fds for regeneration process.
diffstat:
src/ssl-params/ssl-params.c | 19 ++++++++++++++++++-
1 files changed, 18 insertions(+), 1 deletions(-)
diffs (43 lines):
diff -r dbe7c5a0021e -r 07c083496665 src/ssl-params/ssl-params.c
--- a/src/ssl-params/ssl-params.c Sat Nov 02 14:19:23 2013 +0200
+++ b/src/ssl-params/ssl-params.c Sat Nov 02 15:18:15 2013 +0200
@@ -5,6 +5,7 @@
#include "buffer.h"
#include "file-lock.h"
#include "read-full.h"
+#include "master-interface.h"
#include "master-service.h"
#include "master-service-settings.h"
#include "ssl-params-settings.h"
@@ -110,6 +111,22 @@
i_info("SSL parameters regeneration completed");
}
+static void ssl_params_close_listeners(void)
+{
+ unsigned int i;
+
+ /* we have forked, but the fds are still shared. we can't go
+ io_remove()ing the fds from ioloop, because with many ioloops
+ (e.g. epoll) the fds get removed from the main process's ioloop
+ as well. so we'll just do the closing here manually. */
+ for (i = 0; i < master_service_get_socket_count(master_service); i++) {
+ int fd = MASTER_LISTEN_FD_FIRST + i;
+
+ if (close(fd) < 0)
+ i_error("close(listener %d) failed: %m", fd);
+ }
+}
+
static void ssl_params_rebuild(struct ssl_params *param)
{
if (param->to_rebuild != NULL)
@@ -121,7 +138,7 @@
case 0:
/* child - close listener fds so a long-running ssl-params
doesn't cause Dovecot restart to fail */
- master_service_stop_new_connections(master_service);
+ ssl_params_close_listeners();
ssl_params_if_unchanged(param->path, param->last_mtime);
exit(0);
default:
More information about the dovecot-cvs
mailing list