]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
master: Added service type=startup for starting one service process at startup.
authorTimo Sirainen <tss@iki.fi>
Mon, 9 Aug 2010 17:11:18 +0000 (18:11 +0100)
committerTimo Sirainen <tss@iki.fi>
Mon, 9 Aug 2010 17:11:18 +0000 (18:11 +0100)
src/lib-master/service-settings.h
src/master/master-settings.c
src/master/service-monitor.c
src/master/service-process.c
src/master/service.c
src/master/service.h

index 45cb7e1f094726edfe6e398002362fbb28190cd9..6998b99cf4b4d5071652b7a6a0b50d99e66a7386 100644 (file)
@@ -7,7 +7,8 @@ enum service_type {
        SERVICE_TYPE_LOG,
        SERVICE_TYPE_ANVIL,
        SERVICE_TYPE_CONFIG,
-       SERVICE_TYPE_LOGIN
+       SERVICE_TYPE_LOGIN,
+       SERVICE_TYPE_STARTUP
 };
 /* </settings checks> */
 
index 6a44be09e28ea2e604b9b2f9d2ed50b0e923ba93..95cac3093e0f6f37346a6c26ce01d1d1d0513598 100644 (file)
@@ -311,6 +311,8 @@ static bool master_settings_parse_type(struct service_settings *set,
                set->parsed_type = SERVICE_TYPE_ANVIL;
        else if (strcmp(set->type, "login") == 0)
                set->parsed_type = SERVICE_TYPE_LOGIN;
+       else if (strcmp(set->type, "startup") == 0)
+               set->parsed_type = SERVICE_TYPE_STARTUP;
        else {
                *error_r = t_strconcat("Unknown service type: ",
                                       set->type, NULL);
index 71dc55b458bf4c2bec1f76c6066b020daacece49..dbba9ac38d9c305954676d2fdc4f9607e7ff64cb 100644 (file)
@@ -359,6 +359,16 @@ void services_monitor_start(struct service_list *service_list)
 
        if (service_process_create(service_list->log) != NULL)
                service_monitor_listen_stop(service_list->log);
+
+       /* start up a process for startup-services */
+       array_foreach(&service_list->services, services) {
+               struct service *service = *services;
+
+               if (service->type == SERVICE_TYPE_STARTUP) {
+                       if (service_process_create(service) != NULL)
+                               service_monitor_listen_stop(service);
+               }
+       }
 }
 
 void service_monitor_stop(struct service *service)
index 0115567c005f8aaf1b0a1556b402c1e9f815c541..ac5eef1b8677c3813589b3fffc3f8b05aeea03db 100644 (file)
@@ -110,6 +110,7 @@ service_dup_fds(struct service *service)
                break;
        case SERVICE_TYPE_UNKNOWN:
        case SERVICE_TYPE_LOGIN:
+       case SERVICE_TYPE_STARTUP:
                dup2_append(&dups, service_anvil_global->blocking_fd[1],
                            MASTER_ANVIL_FD);
                break;
index acf6bfffa1d1897782a6b9572b3ad325f57e80ea..e3f4729abaadf9bd236a27556d8b9a8477a625ee 100644 (file)
@@ -402,6 +402,7 @@ int services_create(const struct master_settings *set,
        service_list->pool = pool;
        service_list->service_set = master_service_settings_get(master_service);
        service_list->set_pool = master_service_settings_detach(master_service);
+       service_list->set = set;
        service_list->child_process_env = child_process_env;
        service_list->master_log_fd[0] = -1;
        service_list->master_log_fd[1] = -1;
index 0f9863ca44a0d1d4898c30b1a4a335df09b27a87..4d53fd7142c19f229653625d34c05b27b7448683 100644 (file)
@@ -108,6 +108,7 @@ struct service_list {
        int refcount;
        struct timeout *to_kill;
 
+       const struct master_settings *set;
        const struct master_service_settings *service_set;
 
        struct service *config;