From: Timo Sirainen Date: Mon, 18 Jun 2018 19:44:53 +0000 (+0300) Subject: master: Don't recreate master UNIX listener socket on reload X-Git-Tag: 2.3.9~1698 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=92a86b4829ab2ae807b8cb29c772d7615d6f7f8f;p=thirdparty%2Fdovecot%2Fcore.git master: Don't recreate master UNIX listener socket on reload This way it works similar to all other listeners and it's not even temporarily unavailable. --- diff --git a/src/master/service-listen.c b/src/master/service-listen.c index b96c5dc681..0d81146119 100644 --- a/src/master/service-listen.c +++ b/src/master/service-listen.c @@ -335,6 +335,9 @@ static int services_listen_master(struct service_list *service_list) const char *path; mode_t old_umask; + if (service_list->master_fd != -1) + return 1; + path = t_strdup_printf("%s/master", service_list->set->base_dir); old_umask = umask(0600 ^ 0777); service_list->master_fd = net_listen_unix(path, 16); @@ -412,6 +415,10 @@ int services_listen_using(struct service_list *new_service_list, struct service_listener *const *new_listeners, *const *old_listeners; unsigned int i, j, count, new_count, old_count; + /* copy master listener */ + new_service_list->master_fd = old_service_list->master_fd; + old_service_list->master_fd = -1; + /* rescue anvil's UNIX socket listener */ new_service = service_lookup_type(new_service_list, SERVICE_TYPE_ANVIL); old_service = service_lookup_type(old_service_list, SERVICE_TYPE_ANVIL); diff --git a/src/master/service-monitor.c b/src/master/service-monitor.c index fbafcd0673..7f1f2451a3 100644 --- a/src/master/service-monitor.c +++ b/src/master/service-monitor.c @@ -646,7 +646,6 @@ void services_monitor_stop(struct service_list *service_list, bool wait) services_monitor_wait_and_kill(service_list); io_remove(&service_list->io_master); - i_close_fd(&service_list->master_fd); array_foreach(&service_list->services, services) service_monitor_stop(*services); diff --git a/src/master/service.c b/src/master/service.c index af4b322f1e..6f0e15b3d4 100644 --- a/src/master/service.c +++ b/src/master/service.c @@ -666,6 +666,8 @@ void service_list_unref(struct service_list *service_list) array_foreach(&(*servicep)->listeners, listenerp) i_close_fd(&(*listenerp)->fd); } + i_close_fd(&service_list->master_fd); + timeout_remove(&service_list->to_kill); pool_unref(&service_list->set_pool); pool_unref(&service_list->pool);