]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
master: Use per-services_list "master is dead" fd, so services know when config is...
authorTimo Sirainen <tss@iki.fi>
Fri, 4 Mar 2011 18:37:03 +0000 (20:37 +0200)
committerTimo Sirainen <tss@iki.fi>
Fri, 4 Mar 2011 18:37:03 +0000 (20:37 +0200)
src/master/common.h
src/master/main.c
src/master/service-monitor.c
src/master/service-process.c
src/master/service.c
src/master/service.h

index 00ea6e17f63f235d150468f2b9b39aa896dd689f..4369662fc4d1b9f2bc5fb7cc448468f0159ab7ff 100644 (file)
@@ -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;
index 54925e3263551559b588635fb7712952b5b0b7b6..a8158919542ee0d5856cf57194e2912decdcaeb0 100644 (file)
@@ -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) {
index 3010096b8947badd160d580bc47512a7ed163269..8051d55755359487024e2e730d674e7994aff8bd 100644 (file)
@@ -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);
 
index 1fd8efa9028be58f6afee557ee1a28291df5fcd8..a822d39cedc53b82b085c8f14301ff7a63d1cacb 100644 (file)
@@ -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
index 0ba3d3c5086f7bcf87e406546fa4dc092e222642..ef50acb9d95f4c46c195d37a8c02e23ffcc1da8e 100644 (file)
@@ -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);
index 245e026fff487193b6a1c2d7caaacfc6bdb1001a..e652da0aaa785bd5b430a011773071bc36940df4 100644 (file)
@@ -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;