dovecot-2.0: lib-master: If config fd is kept open, close it aft...

dovecot at dovecot.org dovecot at dovecot.org
Sat Oct 10 04:25:37 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/40a71105529b
changeset: 10033:40a71105529b
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Oct 09 21:25:27 2009 -0400
description:
lib-master: If config fd is kept open, close it after last connection has been created.

diffstat:

1 file changed, 17 insertions(+), 1 deletion(-)
src/lib-master/master-service.c |   18 +++++++++++++++++-

diffs (42 lines):

diff -r ebe9b1e7a46b -r 40a71105529b src/lib-master/master-service.c
--- a/src/lib-master/master-service.c	Fri Oct 09 21:02:56 2009 -0400
+++ b/src/lib-master/master-service.c	Fri Oct 09 21:25:27 2009 -0400
@@ -475,6 +475,15 @@ void master_service_client_connection_de
 	}
 }
 
+static void master_service_close_config_fd(struct master_service *service)
+{
+	if (service->config_fd != -1) {
+		if (close(service->config_fd) < 0)
+			i_error("close(master config fd) failed: %m");
+		service->config_fd = -1;
+	}
+}
+
 void master_service_deinit(struct master_service **_service)
 {
 	struct master_service *service = *_service;
@@ -483,6 +492,7 @@ void master_service_deinit(struct master
 
 	io_listeners_remove(service);
 
+	master_service_close_config_fd(service);
 	if (service->io_status_error != NULL)
 		io_remove(&service->io_status_error);
 	if (service->io_status_write != NULL)
@@ -549,7 +559,13 @@ static void master_service_listen(struct
 	service->master_status.available_count--;
         master_status_update(service);
 
-        service->callback(&conn);
+	service->callback(&conn);
+
+	if (service->master_status.available_count == 0 &&
+	    service->service_count_left == 1) {
+		/* we're dying as soon as this connection closes. */
+		master_service_close_config_fd(service);
+	}
 }
 
 static void io_listeners_init(struct master_service *service)


More information about the dovecot-cvs mailing list