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;
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;
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) {
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;
{
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);
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
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);
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;