From: Timo Sirainen Date: Fri, 4 Mar 2011 18:37:03 +0000 (+0200) Subject: master: Use per-services_list "master is dead" fd, so services know when config is... X-Git-Tag: 2.0.10~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=29f32cdcf44cda9688576bfdc7450a8a15e90e86;p=thirdparty%2Fdovecot%2Fcore.git master: Use per-services_list "master is dead" fd, so services know when config is reload. --- diff --git a/src/master/common.h b/src/master/common.h index 00ea6e17f6..4369662fc4 100644 --- a/src/master/common.h +++ b/src/master/common.h @@ -9,7 +9,7 @@ extern uid_t master_uid; extern gid_t master_gid; extern bool core_dumps_disabled; extern const char *ssl_manual_key_password; -extern int null_fd, master_dead_pipe_fd[2]; +extern int null_fd, global_master_dead_pipe_fd[2]; extern struct service_list *services; void process_exec(const char *cmd, const char *extra_args[]) ATTR_NORETURN; diff --git a/src/master/main.c b/src/master/main.c index 54925e3263..a815891954 100644 --- a/src/master/main.c +++ b/src/master/main.c @@ -42,7 +42,7 @@ uid_t master_uid; gid_t master_gid; bool core_dumps_disabled; const char *ssl_manual_key_password; -int null_fd, master_dead_pipe_fd[2]; +int null_fd, global_master_dead_pipe_fd[2]; struct service_list *services; static char *pidfile_path; @@ -725,10 +725,10 @@ int main(int argc, char *argv[]) i_fatal("Can't open /dev/null: %m"); fd_close_on_exec(null_fd, TRUE); } while (null_fd <= STDERR_FILENO); - if (pipe(master_dead_pipe_fd) < 0) + if (pipe(global_master_dead_pipe_fd) < 0) i_fatal("pipe() failed: %m"); - fd_close_on_exec(master_dead_pipe_fd[0], TRUE); - fd_close_on_exec(master_dead_pipe_fd[1], TRUE); + fd_close_on_exec(global_master_dead_pipe_fd[0], TRUE); + fd_close_on_exec(global_master_dead_pipe_fd[1], TRUE); set = master_settings_read(); if (ask_key_pass) { diff --git a/src/master/service-monitor.c b/src/master/service-monitor.c index 3010096b89..8051d55755 100644 --- a/src/master/service-monitor.c +++ b/src/master/service-monitor.c @@ -344,6 +344,11 @@ void services_monitor_start(struct service_list *service_list) services_log_init(service_list); service_anvil_monitor_start(service_list); + if (pipe(service_list->master_dead_pipe_fd) < 0) + i_error("pipe() failed: %m"); + fd_close_on_exec(service_list->master_dead_pipe_fd[0], TRUE); + fd_close_on_exec(service_list->master_dead_pipe_fd[1], TRUE); + array_foreach(&service_list->services, services) { struct service *service = *services; @@ -422,6 +427,15 @@ void services_monitor_stop(struct service_list *service_list) { struct service *const *services; + if (service_list->master_dead_pipe_fd[0] != -1) { + if (close(service_list->master_dead_pipe_fd[0]) < 0) + i_error("close(master dead pipe) failed: %m"); + if (close(service_list->master_dead_pipe_fd[1]) < 0) + i_error("close(master dead pipe) failed: %m"); + service_list->master_dead_pipe_fd[0] = -1; + service_list->master_dead_pipe_fd[1] = -1; + } + array_foreach(&service_list->services, services) service_monitor_stop(*services); diff --git a/src/master/service-process.c b/src/master/service-process.c index 1fd8efa902..a822d39ced 100644 --- a/src/master/service-process.c +++ b/src/master/service-process.c @@ -116,7 +116,13 @@ service_dup_fds(struct service *service) break; } dup2_append(&dups, service->status_fd[1], MASTER_STATUS_FD); - dup2_append(&dups, master_dead_pipe_fd[1], MASTER_DEAD_FD); + if (service->type != SERVICE_TYPE_ANVIL) { + dup2_append(&dups, service->list->master_dead_pipe_fd[1], + MASTER_DEAD_FD); + } else { + dup2_append(&dups, global_master_dead_pipe_fd[1], + MASTER_DEAD_FD); + } if (service->type == SERVICE_TYPE_LOG) { /* keep stderr as-is. this is especially important when diff --git a/src/master/service.c b/src/master/service.c index 0ba3d3c508..ef50acb9d9 100644 --- a/src/master/service.c +++ b/src/master/service.c @@ -444,6 +444,8 @@ services_create_real(const struct master_settings *set, pool_t pool, service_list->set = set; service_list->master_log_fd[0] = -1; service_list->master_log_fd[1] = -1; + service_list->master_dead_pipe_fd[0] = -1; + service_list->master_dead_pipe_fd[1] = -1; service_settings = array_get(&set->services, &count); p_array_init(&service_list->services, pool, count); diff --git a/src/master/service.h b/src/master/service.h index 245e026fff..e652da0aaa 100644 --- a/src/master/service.h +++ b/src/master/service.h @@ -119,6 +119,8 @@ struct service_list { int master_log_fd[2]; struct service_process_notify *log_byes; + int master_dead_pipe_fd[2]; + ARRAY_DEFINE(services, struct service *); unsigned int destroyed:1;