From: Timo Sirainen Date: Mon, 9 Aug 2010 17:11:18 +0000 (+0100) Subject: master: Added service type=startup for starting one service process at startup. X-Git-Tag: 2.0.rc5~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dc07b75b7ea83ff5f447970a20419032725271a7;p=thirdparty%2Fdovecot%2Fcore.git master: Added service type=startup for starting one service process at startup. --- diff --git a/src/lib-master/service-settings.h b/src/lib-master/service-settings.h index 45cb7e1f09..6998b99cf4 100644 --- a/src/lib-master/service-settings.h +++ b/src/lib-master/service-settings.h @@ -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 }; /* */ diff --git a/src/master/master-settings.c b/src/master/master-settings.c index 6a44be09e2..95cac3093e 100644 --- a/src/master/master-settings.c +++ b/src/master/master-settings.c @@ -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); diff --git a/src/master/service-monitor.c b/src/master/service-monitor.c index 71dc55b458..dbba9ac38d 100644 --- a/src/master/service-monitor.c +++ b/src/master/service-monitor.c @@ -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) diff --git a/src/master/service-process.c b/src/master/service-process.c index 0115567c00..ac5eef1b86 100644 --- a/src/master/service-process.c +++ b/src/master/service-process.c @@ -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; diff --git a/src/master/service.c b/src/master/service.c index acf6bfffa1..e3f4729aba 100644 --- a/src/master/service.c +++ b/src/master/service.c @@ -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; diff --git a/src/master/service.h b/src/master/service.h index 0f9863ca44..4d53fd7142 100644 --- a/src/master/service.h +++ b/src/master/service.h @@ -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;