1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#include <ngx_config.h>
9e18a033bSKonstantin Ananyev#include <ngx_core.h>
10e18a033bSKonstantin Ananyev#include <ngx_event.h>
11e18a033bSKonstantin Ananyev#include <ngx_channel.h>
12e18a033bSKonstantin Ananyev
13e18a033bSKonstantin Ananyev
14e18a033bSKonstantin Ananyevtypedef struct {
15e18a033bSKonstantin Ananyev    int     signo;
16e18a033bSKonstantin Ananyev    char   *signame;
17e18a033bSKonstantin Ananyev    char   *name;
18e18a033bSKonstantin Ananyev    void  (*handler)(int signo);
19e18a033bSKonstantin Ananyev} ngx_signal_t;
20e18a033bSKonstantin Ananyev
21e18a033bSKonstantin Ananyev
22e18a033bSKonstantin Ananyev
23e18a033bSKonstantin Ananyevstatic void ngx_execute_proc(ngx_cycle_t *cycle, void *data);
24e18a033bSKonstantin Ananyevstatic void ngx_signal_handler(int signo);
25e18a033bSKonstantin Ananyevstatic void ngx_process_get_status(void);
26e18a033bSKonstantin Ananyevstatic void ngx_unlock_mutexes(ngx_pid_t pid);
27e18a033bSKonstantin Ananyev
28e18a033bSKonstantin Ananyev
29e18a033bSKonstantin Ananyevint              ngx_argc;
30e18a033bSKonstantin Ananyevchar           **ngx_argv;
31e18a033bSKonstantin Ananyevchar           **ngx_os_argv;
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyevngx_int_t        ngx_process_slot;
34e18a033bSKonstantin Ananyevngx_socket_t     ngx_channel;
35e18a033bSKonstantin Ananyevngx_int_t        ngx_last_process;
36e18a033bSKonstantin Ananyevngx_process_t    ngx_processes[NGX_MAX_PROCESSES];
37e18a033bSKonstantin Ananyev
38e18a033bSKonstantin Ananyev
39e18a033bSKonstantin Ananyevngx_signal_t  signals[] = {
40e18a033bSKonstantin Ananyev    { ngx_signal_value(NGX_RECONFIGURE_SIGNAL),
41e18a033bSKonstantin Ananyev      "SIG" ngx_value(NGX_RECONFIGURE_SIGNAL),
42e18a033bSKonstantin Ananyev      "reload",
43e18a033bSKonstantin Ananyev      ngx_signal_handler },
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyev    { ngx_signal_value(NGX_REOPEN_SIGNAL),
46e18a033bSKonstantin Ananyev      "SIG" ngx_value(NGX_REOPEN_SIGNAL),
47e18a033bSKonstantin Ananyev      "reopen",
48e18a033bSKonstantin Ananyev      ngx_signal_handler },
49e18a033bSKonstantin Ananyev
50e18a033bSKonstantin Ananyev    { ngx_signal_value(NGX_NOACCEPT_SIGNAL),
51e18a033bSKonstantin Ananyev      "SIG" ngx_value(NGX_NOACCEPT_SIGNAL),
52e18a033bSKonstantin Ananyev      "",
53e18a033bSKonstantin Ananyev      ngx_signal_handler },
54e18a033bSKonstantin Ananyev
55e18a033bSKonstantin Ananyev    { ngx_signal_value(NGX_TERMINATE_SIGNAL),
56e18a033bSKonstantin Ananyev      "SIG" ngx_value(NGX_TERMINATE_SIGNAL),
57e18a033bSKonstantin Ananyev      "stop",
58e18a033bSKonstantin Ananyev      ngx_signal_handler },
59e18a033bSKonstantin Ananyev
60e18a033bSKonstantin Ananyev    { ngx_signal_value(NGX_SHUTDOWN_SIGNAL),
61e18a033bSKonstantin Ananyev      "SIG" ngx_value(NGX_SHUTDOWN_SIGNAL),
62e18a033bSKonstantin Ananyev      "quit",
63e18a033bSKonstantin Ananyev      ngx_signal_handler },
64e18a033bSKonstantin Ananyev
65e18a033bSKonstantin Ananyev    { ngx_signal_value(NGX_CHANGEBIN_SIGNAL),
66e18a033bSKonstantin Ananyev      "SIG" ngx_value(NGX_CHANGEBIN_SIGNAL),
67e18a033bSKonstantin Ananyev      "",
68e18a033bSKonstantin Ananyev      ngx_signal_handler },
69e18a033bSKonstantin Ananyev
70e18a033bSKonstantin Ananyev    { SIGALRM, "SIGALRM", "", ngx_signal_handler },
71e18a033bSKonstantin Ananyev
72e18a033bSKonstantin Ananyev    { SIGINT, "SIGINT", "", ngx_signal_handler },
73e18a033bSKonstantin Ananyev
74e18a033bSKonstantin Ananyev    { SIGIO, "SIGIO", "", ngx_signal_handler },
75e18a033bSKonstantin Ananyev
76e18a033bSKonstantin Ananyev    { SIGCHLD, "SIGCHLD", "", ngx_signal_handler },
77e18a033bSKonstantin Ananyev
78e18a033bSKonstantin Ananyev    { SIGSYS, "SIGSYS, SIG_IGN", "", SIG_IGN },
79e18a033bSKonstantin Ananyev
80e18a033bSKonstantin Ananyev    { SIGPIPE, "SIGPIPE, SIG_IGN", "", SIG_IGN },
81e18a033bSKonstantin Ananyev
82e18a033bSKonstantin Ananyev    { 0, NULL, "", NULL }
83e18a033bSKonstantin Ananyev};
84e18a033bSKonstantin Ananyev
85e18a033bSKonstantin Ananyev
86e18a033bSKonstantin Ananyevngx_pid_t
87e18a033bSKonstantin Ananyevngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,
88e18a033bSKonstantin Ananyev    char *name, ngx_int_t respawn)
89e18a033bSKonstantin Ananyev{
90e18a033bSKonstantin Ananyev    u_long     on;
91e18a033bSKonstantin Ananyev    ngx_pid_t  pid;
92e18a033bSKonstantin Ananyev    ngx_int_t  s;
93e18a033bSKonstantin Ananyev
94e18a033bSKonstantin Ananyev    if (respawn >= 0) {
95e18a033bSKonstantin Ananyev        s = respawn;
96e18a033bSKonstantin Ananyev
97e18a033bSKonstantin Ananyev    } else {
98e18a033bSKonstantin Ananyev        for (s = 0; s < ngx_last_process; s++) {
99e18a033bSKonstantin Ananyev            if (ngx_processes[s].pid == -1) {
100e18a033bSKonstantin Ananyev                break;
101e18a033bSKonstantin Ananyev            }
102e18a033bSKonstantin Ananyev        }
103e18a033bSKonstantin Ananyev
104e18a033bSKonstantin Ananyev        if (s == NGX_MAX_PROCESSES) {
105e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
106e18a033bSKonstantin Ananyev                          "no more than %d processes can be spawned",
107e18a033bSKonstantin Ananyev                          NGX_MAX_PROCESSES);
108e18a033bSKonstantin Ananyev            return NGX_INVALID_PID;
109e18a033bSKonstantin Ananyev        }
110e18a033bSKonstantin Ananyev    }
111e18a033bSKonstantin Ananyev
112e18a033bSKonstantin Ananyev
113e18a033bSKonstantin Ananyev    if (respawn != NGX_PROCESS_DETACHED) {
114e18a033bSKonstantin Ananyev
115e18a033bSKonstantin Ananyev        /* Solaris 9 still has no AF_LOCAL */
116e18a033bSKonstantin Ananyev
117e18a033bSKonstantin Ananyev        if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1)
118e18a033bSKonstantin Ananyev        {
119e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
120e18a033bSKonstantin Ananyev                          "socketpair() failed while spawning \"%s\"", name);
121e18a033bSKonstantin Ananyev            return NGX_INVALID_PID;
122e18a033bSKonstantin Ananyev        }
123e18a033bSKonstantin Ananyev
124e18a033bSKonstantin Ananyev        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,
125e18a033bSKonstantin Ananyev                       "channel %d:%d",
126e18a033bSKonstantin Ananyev                       ngx_processes[s].channel[0],
127e18a033bSKonstantin Ananyev                       ngx_processes[s].channel[1]);
128e18a033bSKonstantin Ananyev
129e18a033bSKonstantin Ananyev        if (ngx_nonblocking(ngx_processes[s].channel[0]) == -1) {
130e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
131e18a033bSKonstantin Ananyev                          ngx_nonblocking_n " failed while spawning \"%s\"",
132e18a033bSKonstantin Ananyev                          name);
133e18a033bSKonstantin Ananyev            ngx_close_channel(ngx_processes[s].channel, cycle->log);
134e18a033bSKonstantin Ananyev            return NGX_INVALID_PID;
135e18a033bSKonstantin Ananyev        }
136e18a033bSKonstantin Ananyev
137e18a033bSKonstantin Ananyev        if (ngx_nonblocking(ngx_processes[s].channel[1]) == -1) {
138e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
139e18a033bSKonstantin Ananyev                          ngx_nonblocking_n " failed while spawning \"%s\"",
140e18a033bSKonstantin Ananyev                          name);
141e18a033bSKonstantin Ananyev            ngx_close_channel(ngx_processes[s].channel, cycle->log);
142e18a033bSKonstantin Ananyev            return NGX_INVALID_PID;
143e18a033bSKonstantin Ananyev        }
144e18a033bSKonstantin Ananyev
145e18a033bSKonstantin Ananyev        on = 1;
146e18a033bSKonstantin Ananyev        if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) {
147e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
148e18a033bSKonstantin Ananyev                          "ioctl(FIOASYNC) failed while spawning \"%s\"", name);
149e18a033bSKonstantin Ananyev            ngx_close_channel(ngx_processes[s].channel, cycle->log);
150e18a033bSKonstantin Ananyev            return NGX_INVALID_PID;
151e18a033bSKonstantin Ananyev        }
152e18a033bSKonstantin Ananyev
153e18a033bSKonstantin Ananyev        if (fcntl(ngx_processes[s].channel[0], F_SETOWN, ngx_pid) == -1) {
154e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
155e18a033bSKonstantin Ananyev                          "fcntl(F_SETOWN) failed while spawning \"%s\"", name);
156e18a033bSKonstantin Ananyev            ngx_close_channel(ngx_processes[s].channel, cycle->log);
157e18a033bSKonstantin Ananyev            return NGX_INVALID_PID;
158e18a033bSKonstantin Ananyev        }
159e18a033bSKonstantin Ananyev
160e18a033bSKonstantin Ananyev        if (fcntl(ngx_processes[s].channel[0], F_SETFD, FD_CLOEXEC) == -1) {
161e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
162e18a033bSKonstantin Ananyev                          "fcntl(FD_CLOEXEC) failed while spawning \"%s\"",
163e18a033bSKonstantin Ananyev                           name);
164e18a033bSKonstantin Ananyev            ngx_close_channel(ngx_processes[s].channel, cycle->log);
165e18a033bSKonstantin Ananyev            return NGX_INVALID_PID;
166e18a033bSKonstantin Ananyev        }
167e18a033bSKonstantin Ananyev
168e18a033bSKonstantin Ananyev        if (fcntl(ngx_processes[s].channel[1], F_SETFD, FD_CLOEXEC) == -1) {
169e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
170e18a033bSKonstantin Ananyev                          "fcntl(FD_CLOEXEC) failed while spawning \"%s\"",
171e18a033bSKonstantin Ananyev                           name);
172e18a033bSKonstantin Ananyev            ngx_close_channel(ngx_processes[s].channel, cycle->log);
173e18a033bSKonstantin Ananyev            return NGX_INVALID_PID;
174e18a033bSKonstantin Ananyev        }
175e18a033bSKonstantin Ananyev
176e18a033bSKonstantin Ananyev        ngx_channel = ngx_processes[s].channel[1];
177e18a033bSKonstantin Ananyev
178e18a033bSKonstantin Ananyev    } else {
179e18a033bSKonstantin Ananyev        ngx_processes[s].channel[0] = -1;
180e18a033bSKonstantin Ananyev        ngx_processes[s].channel[1] = -1;
181e18a033bSKonstantin Ananyev    }
182e18a033bSKonstantin Ananyev
183e18a033bSKonstantin Ananyev    ngx_process_slot = s;
184e18a033bSKonstantin Ananyev
185e18a033bSKonstantin Ananyev
186e18a033bSKonstantin Ananyev    pid = fork();
187e18a033bSKonstantin Ananyev
188e18a033bSKonstantin Ananyev    switch (pid) {
189e18a033bSKonstantin Ananyev
190e18a033bSKonstantin Ananyev    case -1:
191e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
192e18a033bSKonstantin Ananyev                      "fork() failed while spawning \"%s\"", name);
193e18a033bSKonstantin Ananyev        ngx_close_channel(ngx_processes[s].channel, cycle->log);
194e18a033bSKonstantin Ananyev        return NGX_INVALID_PID;
195e18a033bSKonstantin Ananyev
196e18a033bSKonstantin Ananyev    case 0:
197e18a033bSKonstantin Ananyev        ngx_pid = ngx_getpid();
198e18a033bSKonstantin Ananyev        proc(cycle, data);
199e18a033bSKonstantin Ananyev        break;
200e18a033bSKonstantin Ananyev
201e18a033bSKonstantin Ananyev    default:
202e18a033bSKonstantin Ananyev        break;
203e18a033bSKonstantin Ananyev    }
204e18a033bSKonstantin Ananyev
205e18a033bSKonstantin Ananyev    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start %s %P", name, pid);
206e18a033bSKonstantin Ananyev
207e18a033bSKonstantin Ananyev    ngx_processes[s].pid = pid;
208e18a033bSKonstantin Ananyev    ngx_processes[s].exited = 0;
209e18a033bSKonstantin Ananyev
210e18a033bSKonstantin Ananyev    if (respawn >= 0) {
211e18a033bSKonstantin Ananyev        return pid;
212e18a033bSKonstantin Ananyev    }
213e18a033bSKonstantin Ananyev
214e18a033bSKonstantin Ananyev    ngx_processes[s].proc = proc;
215e18a033bSKonstantin Ananyev    ngx_processes[s].data = data;
216e18a033bSKonstantin Ananyev    ngx_processes[s].name = name;
217e18a033bSKonstantin Ananyev    ngx_processes[s].exiting = 0;
218e18a033bSKonstantin Ananyev
219e18a033bSKonstantin Ananyev    switch (respawn) {
220e18a033bSKonstantin Ananyev
221e18a033bSKonstantin Ananyev    case NGX_PROCESS_NORESPAWN:
222e18a033bSKonstantin Ananyev        ngx_processes[s].respawn = 0;
223e18a033bSKonstantin Ananyev        ngx_processes[s].just_spawn = 0;
224e18a033bSKonstantin Ananyev        ngx_processes[s].detached = 0;
225e18a033bSKonstantin Ananyev        break;
226e18a033bSKonstantin Ananyev
227e18a033bSKonstantin Ananyev    case NGX_PROCESS_JUST_SPAWN:
228e18a033bSKonstantin Ananyev        ngx_processes[s].respawn = 0;
229e18a033bSKonstantin Ananyev        ngx_processes[s].just_spawn = 1;
230e18a033bSKonstantin Ananyev        ngx_processes[s].detached = 0;
231e18a033bSKonstantin Ananyev        break;
232e18a033bSKonstantin Ananyev
233e18a033bSKonstantin Ananyev    case NGX_PROCESS_RESPAWN:
234e18a033bSKonstantin Ananyev        ngx_processes[s].respawn = 1;
235e18a033bSKonstantin Ananyev        ngx_processes[s].just_spawn = 0;
236e18a033bSKonstantin Ananyev        ngx_processes[s].detached = 0;
237e18a033bSKonstantin Ananyev        break;
238e18a033bSKonstantin Ananyev
239e18a033bSKonstantin Ananyev    case NGX_PROCESS_JUST_RESPAWN:
240e18a033bSKonstantin Ananyev        ngx_processes[s].respawn = 1;
241e18a033bSKonstantin Ananyev        ngx_processes[s].just_spawn = 1;
242e18a033bSKonstantin Ananyev        ngx_processes[s].detached = 0;
243e18a033bSKonstantin Ananyev        break;
244e18a033bSKonstantin Ananyev
245e18a033bSKonstantin Ananyev    case NGX_PROCESS_DETACHED:
246e18a033bSKonstantin Ananyev        ngx_processes[s].respawn = 0;
247e18a033bSKonstantin Ananyev        ngx_processes[s].just_spawn = 0;
248e18a033bSKonstantin Ananyev        ngx_processes[s].detached = 1;
249e18a033bSKonstantin Ananyev        break;
250e18a033bSKonstantin Ananyev    }
251e18a033bSKonstantin Ananyev
252e18a033bSKonstantin Ananyev    if (s == ngx_last_process) {
253e18a033bSKonstantin Ananyev        ngx_last_process++;
254e18a033bSKonstantin Ananyev    }
255e18a033bSKonstantin Ananyev
256e18a033bSKonstantin Ananyev    return pid;
257e18a033bSKonstantin Ananyev}
258e18a033bSKonstantin Ananyev
259e18a033bSKonstantin Ananyev
260e18a033bSKonstantin Ananyevngx_pid_t
261e18a033bSKonstantin Ananyevngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx)
262e18a033bSKonstantin Ananyev{
263e18a033bSKonstantin Ananyev    return ngx_spawn_process(cycle, ngx_execute_proc, ctx, ctx->name,
264e18a033bSKonstantin Ananyev                             NGX_PROCESS_DETACHED);
265e18a033bSKonstantin Ananyev}
266e18a033bSKonstantin Ananyev
267e18a033bSKonstantin Ananyev
268e18a033bSKonstantin Ananyevstatic void
269e18a033bSKonstantin Ananyevngx_execute_proc(ngx_cycle_t *cycle, void *data)
270e18a033bSKonstantin Ananyev{
271e18a033bSKonstantin Ananyev    ngx_exec_ctx_t  *ctx = data;
272e18a033bSKonstantin Ananyev
273e18a033bSKonstantin Ananyev    if (execve(ctx->path, ctx->argv, ctx->envp) == -1) {
274e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
275e18a033bSKonstantin Ananyev                      "execve() failed while executing %s \"%s\"",
276e18a033bSKonstantin Ananyev                      ctx->name, ctx->path);
277e18a033bSKonstantin Ananyev    }
278e18a033bSKonstantin Ananyev
279e18a033bSKonstantin Ananyev    exit(1);
280e18a033bSKonstantin Ananyev}
281e18a033bSKonstantin Ananyev
282e18a033bSKonstantin Ananyev
283e18a033bSKonstantin Ananyevngx_int_t
284e18a033bSKonstantin Ananyevngx_init_signals(ngx_log_t *log)
285e18a033bSKonstantin Ananyev{
286e18a033bSKonstantin Ananyev    ngx_signal_t      *sig;
287e18a033bSKonstantin Ananyev    struct sigaction   sa;
288e18a033bSKonstantin Ananyev
289e18a033bSKonstantin Ananyev    for (sig = signals; sig->signo != 0; sig++) {
290e18a033bSKonstantin Ananyev        ngx_memzero(&sa, sizeof(struct sigaction));
291e18a033bSKonstantin Ananyev        sa.sa_handler = sig->handler;
292e18a033bSKonstantin Ananyev        sigemptyset(&sa.sa_mask);
293e18a033bSKonstantin Ananyev        if (sigaction(sig->signo, &sa, NULL) == -1) {
294e18a033bSKonstantin Ananyev#if (NGX_VALGRIND)
295e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
296e18a033bSKonstantin Ananyev                          "sigaction(%s) failed, ignored", sig->signame);
297e18a033bSKonstantin Ananyev#else
298e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
299e18a033bSKonstantin Ananyev                          "sigaction(%s) failed", sig->signame);
300e18a033bSKonstantin Ananyev            return NGX_ERROR;
301e18a033bSKonstantin Ananyev#endif
302e18a033bSKonstantin Ananyev        }
303e18a033bSKonstantin Ananyev    }
304e18a033bSKonstantin Ananyev
305e18a033bSKonstantin Ananyev    return NGX_OK;
306e18a033bSKonstantin Ananyev}
307e18a033bSKonstantin Ananyev
308e18a033bSKonstantin Ananyev
309e18a033bSKonstantin Ananyevstatic void
310e18a033bSKonstantin Ananyevngx_signal_handler(int signo)
311e18a033bSKonstantin Ananyev{
312e18a033bSKonstantin Ananyev    char            *action;
313e18a033bSKonstantin Ananyev    ngx_int_t        ignore;
314e18a033bSKonstantin Ananyev    ngx_err_t        err;
315e18a033bSKonstantin Ananyev    ngx_signal_t    *sig;
316e18a033bSKonstantin Ananyev
317e18a033bSKonstantin Ananyev    ignore = 0;
318e18a033bSKonstantin Ananyev
319e18a033bSKonstantin Ananyev    err = ngx_errno;
320e18a033bSKonstantin Ananyev
321e18a033bSKonstantin Ananyev    for (sig = signals; sig->signo != 0; sig++) {
322e18a033bSKonstantin Ananyev        if (sig->signo == signo) {
323e18a033bSKonstantin Ananyev            break;
324e18a033bSKonstantin Ananyev        }
325e18a033bSKonstantin Ananyev    }
326e18a033bSKonstantin Ananyev
327e18a033bSKonstantin Ananyev    ngx_time_sigsafe_update();
328e18a033bSKonstantin Ananyev
329e18a033bSKonstantin Ananyev    action = "";
330e18a033bSKonstantin Ananyev
331e18a033bSKonstantin Ananyev    switch (ngx_process) {
332e18a033bSKonstantin Ananyev
333e18a033bSKonstantin Ananyev    case NGX_PROCESS_MASTER:
334e18a033bSKonstantin Ananyev    case NGX_PROCESS_SINGLE:
335e18a033bSKonstantin Ananyev        switch (signo) {
336e18a033bSKonstantin Ananyev
337e18a033bSKonstantin Ananyev        case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):
338e18a033bSKonstantin Ananyev            ngx_quit = 1;
339e18a033bSKonstantin Ananyev            action = ", shutting down";
340e18a033bSKonstantin Ananyev            break;
341e18a033bSKonstantin Ananyev
342e18a033bSKonstantin Ananyev        case ngx_signal_value(NGX_TERMINATE_SIGNAL):
343e18a033bSKonstantin Ananyev        case SIGINT:
344e18a033bSKonstantin Ananyev            ngx_terminate = 1;
345e18a033bSKonstantin Ananyev            action = ", exiting";
346e18a033bSKonstantin Ananyev            break;
347e18a033bSKonstantin Ananyev
348e18a033bSKonstantin Ananyev        case ngx_signal_value(NGX_NOACCEPT_SIGNAL):
349e18a033bSKonstantin Ananyev            if (ngx_daemonized) {
350e18a033bSKonstantin Ananyev                ngx_noaccept = 1;
351e18a033bSKonstantin Ananyev                action = ", stop accepting connections";
352e18a033bSKonstantin Ananyev            }
353e18a033bSKonstantin Ananyev            break;
354e18a033bSKonstantin Ananyev
355e18a033bSKonstantin Ananyev        case ngx_signal_value(NGX_RECONFIGURE_SIGNAL):
356e18a033bSKonstantin Ananyev            ngx_reconfigure = 1;
357e18a033bSKonstantin Ananyev            action = ", reconfiguring";
358e18a033bSKonstantin Ananyev            break;
359e18a033bSKonstantin Ananyev
360e18a033bSKonstantin Ananyev        case ngx_signal_value(NGX_REOPEN_SIGNAL):
361e18a033bSKonstantin Ananyev            ngx_reopen = 1;
362e18a033bSKonstantin Ananyev            action = ", reopening logs";
363e18a033bSKonstantin Ananyev            break;
364e18a033bSKonstantin Ananyev
365e18a033bSKonstantin Ananyev        case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):
366e18a033bSKonstantin Ananyev            if (getppid() > 1 || ngx_new_binary > 0) {
367e18a033bSKonstantin Ananyev
368e18a033bSKonstantin Ananyev                /*
369e18a033bSKonstantin Ananyev                 * Ignore the signal in the new binary if its parent is
370e18a033bSKonstantin Ananyev                 * not the init process, i.e. the old binary's process
371e18a033bSKonstantin Ananyev                 * is still running.  Or ignore the signal in the old binary's
372e18a033bSKonstantin Ananyev                 * process if the new binary's process is already running.
373e18a033bSKonstantin Ananyev                 */
374e18a033bSKonstantin Ananyev
375e18a033bSKonstantin Ananyev                action = ", ignoring";
376e18a033bSKonstantin Ananyev                ignore = 1;
377e18a033bSKonstantin Ananyev                break;
378e18a033bSKonstantin Ananyev            }
379e18a033bSKonstantin Ananyev
380e18a033bSKonstantin Ananyev            ngx_change_binary = 1;
381e18a033bSKonstantin Ananyev            action = ", changing binary";
382e18a033bSKonstantin Ananyev            break;
383e18a033bSKonstantin Ananyev
384e18a033bSKonstantin Ananyev        case SIGALRM:
385e18a033bSKonstantin Ananyev            ngx_sigalrm = 1;
386e18a033bSKonstantin Ananyev            break;
387e18a033bSKonstantin Ananyev
388e18a033bSKonstantin Ananyev        case SIGIO:
389e18a033bSKonstantin Ananyev            ngx_sigio = 1;
390e18a033bSKonstantin Ananyev            break;
391e18a033bSKonstantin Ananyev
392e18a033bSKonstantin Ananyev        case SIGCHLD:
393e18a033bSKonstantin Ananyev            ngx_reap = 1;
394e18a033bSKonstantin Ananyev            break;
395e18a033bSKonstantin Ananyev        }
396e18a033bSKonstantin Ananyev
397e18a033bSKonstantin Ananyev        break;
398e18a033bSKonstantin Ananyev
399e18a033bSKonstantin Ananyev    case NGX_PROCESS_WORKER:
400e18a033bSKonstantin Ananyev    case NGX_PROCESS_HELPER:
401e18a033bSKonstantin Ananyev        switch (signo) {
402e18a033bSKonstantin Ananyev
403e18a033bSKonstantin Ananyev        case ngx_signal_value(NGX_NOACCEPT_SIGNAL):
404e18a033bSKonstantin Ananyev            if (!ngx_daemonized) {
405e18a033bSKonstantin Ananyev                break;
406e18a033bSKonstantin Ananyev            }
407e18a033bSKonstantin Ananyev            ngx_debug_quit = 1;
408e18a033bSKonstantin Ananyev        case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):
409e18a033bSKonstantin Ananyev            ngx_quit = 1;
410e18a033bSKonstantin Ananyev            action = ", shutting down";
411e18a033bSKonstantin Ananyev            break;
412e18a033bSKonstantin Ananyev
413e18a033bSKonstantin Ananyev        case ngx_signal_value(NGX_TERMINATE_SIGNAL):
414e18a033bSKonstantin Ananyev        case SIGINT:
415e18a033bSKonstantin Ananyev            ngx_terminate = 1;
416e18a033bSKonstantin Ananyev            action = ", exiting";
417e18a033bSKonstantin Ananyev            break;
418e18a033bSKonstantin Ananyev
419e18a033bSKonstantin Ananyev        case ngx_signal_value(NGX_REOPEN_SIGNAL):
420e18a033bSKonstantin Ananyev            ngx_reopen = 1;
421