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
12e18a033bSKonstantin Ananyev
13e18a033bSKonstantin Ananyevstatic void ngx_destroy_cycle_pools(ngx_conf_t *conf);
14e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_init_zone_pool(ngx_cycle_t *cycle,
15e18a033bSKonstantin Ananyev    ngx_shm_zone_t *shm_zone);
16e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_test_lockfile(u_char *file, ngx_log_t *log);
17e18a033bSKonstantin Ananyevstatic void ngx_clean_old_cycles(ngx_event_t *ev);
18e18a033bSKonstantin Ananyevstatic void ngx_shutdown_timer_handler(ngx_event_t *ev);
19e18a033bSKonstantin Ananyev
20e18a033bSKonstantin Ananyev
21e18a033bSKonstantin Ananyevvolatile ngx_cycle_t  *ngx_cycle;
22e18a033bSKonstantin Ananyevngx_array_t            ngx_old_cycles;
23e18a033bSKonstantin Ananyev
24e18a033bSKonstantin Ananyevstatic ngx_pool_t     *ngx_temp_pool;
25e18a033bSKonstantin Ananyevstatic ngx_event_t     ngx_cleaner_event;
26e18a033bSKonstantin Ananyevstatic ngx_event_t     ngx_shutdown_event;
27e18a033bSKonstantin Ananyev
28e18a033bSKonstantin Ananyevngx_uint_t             ngx_test_config;
29e18a033bSKonstantin Ananyevngx_uint_t             ngx_dump_config;
30e18a033bSKonstantin Ananyevngx_uint_t             ngx_quiet_mode;
31e18a033bSKonstantin Ananyev
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyev/* STUB NAME */
34e18a033bSKonstantin Ananyevstatic ngx_connection_t  dumb;
35e18a033bSKonstantin Ananyev/* STUB */
36e18a033bSKonstantin Ananyev
37e18a033bSKonstantin Ananyev
38e18a033bSKonstantin Ananyevngx_cycle_t *
39e18a033bSKonstantin Ananyevngx_init_cycle(ngx_cycle_t *old_cycle)
40e18a033bSKonstantin Ananyev{
41e18a033bSKonstantin Ananyev    void                *rv;
42e18a033bSKonstantin Ananyev    char               **senv;
43e18a033bSKonstantin Ananyev    ngx_uint_t           i, n;
44e18a033bSKonstantin Ananyev    ngx_log_t           *log;
45e18a033bSKonstantin Ananyev    ngx_time_t          *tp;
46e18a033bSKonstantin Ananyev    ngx_conf_t           conf;
47e18a033bSKonstantin Ananyev    ngx_pool_t          *pool;
48e18a033bSKonstantin Ananyev    ngx_cycle_t         *cycle, **old;
49e18a033bSKonstantin Ananyev    ngx_shm_zone_t      *shm_zone, *oshm_zone;
50e18a033bSKonstantin Ananyev    ngx_list_part_t     *part, *opart;
51e18a033bSKonstantin Ananyev    ngx_open_file_t     *file;
52e18a033bSKonstantin Ananyev    ngx_listening_t     *ls, *nls;
53e18a033bSKonstantin Ananyev    ngx_core_conf_t     *ccf, *old_ccf;
54e18a033bSKonstantin Ananyev    ngx_core_module_t   *module;
55e18a033bSKonstantin Ananyev    char                 hostname[NGX_MAXHOSTNAMELEN];
56e18a033bSKonstantin Ananyev
57e18a033bSKonstantin Ananyev    ngx_timezone_update();
58e18a033bSKonstantin Ananyev
59e18a033bSKonstantin Ananyev    /* force localtime update with a new timezone */
60e18a033bSKonstantin Ananyev
61e18a033bSKonstantin Ananyev    tp = ngx_timeofday();
62e18a033bSKonstantin Ananyev    tp->sec = 0;
63e18a033bSKonstantin Ananyev
64e18a033bSKonstantin Ananyev    ngx_time_update();
65e18a033bSKonstantin Ananyev
66e18a033bSKonstantin Ananyev
67e18a033bSKonstantin Ananyev    log = old_cycle->log;
68e18a033bSKonstantin Ananyev
69e18a033bSKonstantin Ananyev    pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);
70e18a033bSKonstantin Ananyev    if (pool == NULL) {
71e18a033bSKonstantin Ananyev        return NULL;
72e18a033bSKonstantin Ananyev    }
73e18a033bSKonstantin Ananyev    pool->log = log;
74e18a033bSKonstantin Ananyev
75e18a033bSKonstantin Ananyev    cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t));
76e18a033bSKonstantin Ananyev    if (cycle == NULL) {
77e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
78e18a033bSKonstantin Ananyev        return NULL;
79e18a033bSKonstantin Ananyev    }
80e18a033bSKonstantin Ananyev
81e18a033bSKonstantin Ananyev    cycle->pool = pool;
82e18a033bSKonstantin Ananyev    cycle->log = log;
83e18a033bSKonstantin Ananyev    cycle->old_cycle = old_cycle;
84e18a033bSKonstantin Ananyev
85e18a033bSKonstantin Ananyev    cycle->conf_prefix.len = old_cycle->conf_prefix.len;
86e18a033bSKonstantin Ananyev    cycle->conf_prefix.data = ngx_pstrdup(pool, &old_cycle->conf_prefix);
87e18a033bSKonstantin Ananyev    if (cycle->conf_prefix.data == NULL) {
88e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
89e18a033bSKonstantin Ananyev        return NULL;
90e18a033bSKonstantin Ananyev    }
91e18a033bSKonstantin Ananyev
92e18a033bSKonstantin Ananyev    cycle->prefix.len = old_cycle->prefix.len;
93e18a033bSKonstantin Ananyev    cycle->prefix.data = ngx_pstrdup(pool, &old_cycle->prefix);
94e18a033bSKonstantin Ananyev    if (cycle->prefix.data == NULL) {
95e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
96e18a033bSKonstantin Ananyev        return NULL;
97e18a033bSKonstantin Ananyev    }
98e18a033bSKonstantin Ananyev
99e18a033bSKonstantin Ananyev    cycle->conf_file.len = old_cycle->conf_file.len;
100e18a033bSKonstantin Ananyev    cycle->conf_file.data = ngx_pnalloc(pool, old_cycle->conf_file.len + 1);
101e18a033bSKonstantin Ananyev    if (cycle->conf_file.data == NULL) {
102e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
103e18a033bSKonstantin Ananyev        return NULL;
104e18a033bSKonstantin Ananyev    }
105e18a033bSKonstantin Ananyev    ngx_cpystrn(cycle->conf_file.data, old_cycle->conf_file.data,
106e18a033bSKonstantin Ananyev                old_cycle->conf_file.len + 1);
107e18a033bSKonstantin Ananyev
108e18a033bSKonstantin Ananyev    cycle->conf_param.len = old_cycle->conf_param.len;
109e18a033bSKonstantin Ananyev    cycle->conf_param.data = ngx_pstrdup(pool, &old_cycle->conf_param);
110e18a033bSKonstantin Ananyev    if (cycle->conf_param.data == NULL) {
111e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
112e18a033bSKonstantin Ananyev        return NULL;
113e18a033bSKonstantin Ananyev    }
114e18a033bSKonstantin Ananyev
115e18a033bSKonstantin Ananyev
116e18a033bSKonstantin Ananyev    n = old_cycle->paths.nelts ? old_cycle->paths.nelts : 10;
117e18a033bSKonstantin Ananyev
118e18a033bSKonstantin Ananyev    if (ngx_array_init(&cycle->paths, pool, n, sizeof(ngx_path_t *))
119e18a033bSKonstantin Ananyev        != NGX_OK)
120e18a033bSKonstantin Ananyev    {
121e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
122e18a033bSKonstantin Ananyev        return NULL;
123e18a033bSKonstantin Ananyev    }
124e18a033bSKonstantin Ananyev
125e18a033bSKonstantin Ananyev    ngx_memzero(cycle->paths.elts, n * sizeof(ngx_path_t *));
126e18a033bSKonstantin Ananyev
127e18a033bSKonstantin Ananyev
128e18a033bSKonstantin Ananyev    if (ngx_array_init(&cycle->config_dump, pool, 1, sizeof(ngx_conf_dump_t))
129e18a033bSKonstantin Ananyev        != NGX_OK)
130e18a033bSKonstantin Ananyev    {
131e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
132e18a033bSKonstantin Ananyev        return NULL;
133e18a033bSKonstantin Ananyev    }
134e18a033bSKonstantin Ananyev
135e18a033bSKonstantin Ananyev    ngx_rbtree_init(&cycle->config_dump_rbtree, &cycle->config_dump_sentinel,
136e18a033bSKonstantin Ananyev                    ngx_str_rbtree_insert_value);
137e18a033bSKonstantin Ananyev
138e18a033bSKonstantin Ananyev    if (old_cycle->open_files.part.nelts) {
139e18a033bSKonstantin Ananyev        n = old_cycle->open_files.part.nelts;
140e18a033bSKonstantin Ananyev        for (part = old_cycle->open_files.part.next; part; part = part->next) {
141e18a033bSKonstantin Ananyev            n += part->nelts;
142e18a033bSKonstantin Ananyev        }
143e18a033bSKonstantin Ananyev
144e18a033bSKonstantin Ananyev    } else {
145e18a033bSKonstantin Ananyev        n = 20;
146e18a033bSKonstantin Ananyev    }
147e18a033bSKonstantin Ananyev
148e18a033bSKonstantin Ananyev    if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t))
149e18a033bSKonstantin Ananyev        != NGX_OK)
150e18a033bSKonstantin Ananyev    {
151e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
152e18a033bSKonstantin Ananyev        return NULL;
153e18a033bSKonstantin Ananyev    }
154e18a033bSKonstantin Ananyev
155e18a033bSKonstantin Ananyev
156e18a033bSKonstantin Ananyev    if (old_cycle->shared_memory.part.nelts) {
157e18a033bSKonstantin Ananyev        n = old_cycle->shared_memory.part.nelts;
158e18a033bSKonstantin Ananyev        for (part = old_cycle->shared_memory.part.next; part; part = part->next)
159e18a033bSKonstantin Ananyev        {
160e18a033bSKonstantin Ananyev            n += part->nelts;
161e18a033bSKonstantin Ananyev        }
162e18a033bSKonstantin Ananyev
163e18a033bSKonstantin Ananyev    } else {
164e18a033bSKonstantin Ananyev        n = 1;
165e18a033bSKonstantin Ananyev    }
166e18a033bSKonstantin Ananyev
167e18a033bSKonstantin Ananyev    if (ngx_list_init(&cycle->shared_memory, pool, n, sizeof(ngx_shm_zone_t))
168e18a033bSKonstantin Ananyev        != NGX_OK)
169e18a033bSKonstantin Ananyev    {
170e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
171e18a033bSKonstantin Ananyev        return NULL;
172e18a033bSKonstantin Ananyev    }
173e18a033bSKonstantin Ananyev
174e18a033bSKonstantin Ananyev    n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;
175e18a033bSKonstantin Ananyev
176e18a033bSKonstantin Ananyev    if (ngx_array_init(&cycle->listening, pool, n, sizeof(ngx_listening_t))
177e18a033bSKonstantin Ananyev        != NGX_OK)
178e18a033bSKonstantin Ananyev    {
179e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
180e18a033bSKonstantin Ananyev        return NULL;
181e18a033bSKonstantin Ananyev    }
182e18a033bSKonstantin Ananyev
183e18a033bSKonstantin Ananyev    ngx_memzero(cycle->listening.elts, n * sizeof(ngx_listening_t));
184e18a033bSKonstantin Ananyev
185e18a033bSKonstantin Ananyev
186e18a033bSKonstantin Ananyev    ngx_queue_init(&cycle->reusable_connections_queue);
187e18a033bSKonstantin Ananyev
188e18a033bSKonstantin Ananyev
189e18a033bSKonstantin Ananyev    cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module * sizeof(void *));
190e18a033bSKonstantin Ananyev    if (cycle->conf_ctx == NULL) {
191e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
192e18a033bSKonstantin Ananyev        return NULL;
193e18a033bSKonstantin Ananyev    }
194e18a033bSKonstantin Ananyev
195e18a033bSKonstantin Ananyev
196e18a033bSKonstantin Ananyev    if (gethostname(hostname, NGX_MAXHOSTNAMELEN) == -1) {
197e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "gethostname() failed");
198e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
199e18a033bSKonstantin Ananyev        return NULL;
200e18a033bSKonstantin Ananyev    }
201e18a033bSKonstantin Ananyev
202e18a033bSKonstantin Ananyev    /* on Linux gethostname() silently truncates name that does not fit */
203e18a033bSKonstantin Ananyev
204e18a033bSKonstantin Ananyev    hostname[NGX_MAXHOSTNAMELEN - 1] = '\0';
205e18a033bSKonstantin Ananyev    cycle->hostname.len = ngx_strlen(hostname);
206e18a033bSKonstantin Ananyev
207e18a033bSKonstantin Ananyev    cycle->hostname.data = ngx_pnalloc(pool, cycle->hostname.len);
208e18a033bSKonstantin Ananyev    if (cycle->hostname.data == NULL) {
209e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
210e18a033bSKonstantin Ananyev        return NULL;
211e18a033bSKonstantin Ananyev    }
212e18a033bSKonstantin Ananyev
213e18a033bSKonstantin Ananyev    ngx_strlow(cycle->hostname.data, (u_char *) hostname, cycle->hostname.len);
214e18a033bSKonstantin Ananyev
215e18a033bSKonstantin Ananyev
216e18a033bSKonstantin Ananyev    if (ngx_cycle_modules(cycle) != NGX_OK) {
217e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
218e18a033bSKonstantin Ananyev        return NULL;
219e18a033bSKonstantin Ananyev    }
220e18a033bSKonstantin Ananyev
221e18a033bSKonstantin Ananyev
222e18a033bSKonstantin Ananyev    for (i = 0; cycle->modules[i]; i++) {
223e18a033bSKonstantin Ananyev        if (cycle->modules[i]->type != NGX_CORE_MODULE) {
224e18a033bSKonstantin Ananyev            continue;
225e18a033bSKonstantin Ananyev        }
226e18a033bSKonstantin Ananyev
227e18a033bSKonstantin Ananyev        module = cycle->modules[i]->ctx;
228e18a033bSKonstantin Ananyev
229e18a033bSKonstantin Ananyev        if (module->create_conf) {
230e18a033bSKonstantin Ananyev            rv = module->create_conf(cycle);
231e18a033bSKonstantin Ananyev            if (rv == NULL) {
232e18a033bSKonstantin Ananyev                ngx_destroy_pool(pool);
233e18a033bSKonstantin Ananyev                return NULL;
234e18a033bSKonstantin Ananyev            }
235e18a033bSKonstantin Ananyev            cycle->conf_ctx[cycle->modules[i]->index] = rv;
236e18a033bSKonstantin Ananyev        }
237e18a033bSKonstantin Ananyev    }
238e18a033bSKonstantin Ananyev
239e18a033bSKonstantin Ananyev
240e18a033bSKonstantin Ananyev    senv = environ;
241e18a033bSKonstantin Ananyev
242e18a033bSKonstantin Ananyev
243e18a033bSKonstantin Ananyev    ngx_memzero(&conf, sizeof(ngx_conf_t));
244e18a033bSKonstantin Ananyev    /* STUB: init array ? */
245e18a033bSKonstantin Ananyev    conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t));
246e18a033bSKonstantin Ananyev    if (conf.args == NULL) {
247e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
248e18a033bSKonstantin Ananyev        return NULL;
249e18a033bSKonstantin Ananyev    }
250e18a033bSKonstantin Ananyev
251e18a033bSKonstantin Ananyev    conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);
252e18a033bSKonstantin Ananyev    if (conf.temp_pool == NULL) {
253e18a033bSKonstantin Ananyev        ngx_destroy_pool(pool);
254e18a033bSKonstantin Ananyev        return NULL;
255e18a033bSKonstantin Ananyev    }
256e18a033bSKonstantin Ananyev
257e18a033bSKonstantin Ananyev
258e18a033bSKonstantin Ananyev    conf.ctx = cycle->conf_ctx;
259e18a033bSKonstantin Ananyev    conf.cycle = cycle;
260e18a033bSKonstantin Ananyev    conf.pool = pool;
261e18a033bSKonstantin Ananyev    conf.log = log;
262e18a033bSKonstantin Ananyev    conf.module_type = NGX_CORE_MODULE;
263e18a033bSKonstantin Ananyev    conf.cmd_type = NGX_MAIN_CONF;
264e18a033bSKonstantin Ananyev
265e18a033bSKonstantin Ananyev#if 0
266e18a033bSKonstantin Ananyev    log->log_level = NGX_LOG_DEBUG_ALL;
267e18a033bSKonstantin Ananyev#endif
268e18a033bSKonstantin Ananyev
269e18a033bSKonstantin Ananyev    if (ngx_conf_param(&conf) != NGX_CONF_OK) {
270e18a033bSKonstantin Ananyev        environ = senv;
271e18a033bSKonstantin Ananyev        ngx_destroy_cycle_pools(&conf);
272e18a033bSKonstantin Ananyev        return NULL;
273e18a033bSKonstantin Ananyev    }
274e18a033bSKonstantin Ananyev
275e18a033bSKonstantin Ananyev    if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {
276e18a033bSKonstantin Ananyev        environ = senv;
277e18a033bSKonstantin Ananyev        ngx_destroy_cycle_pools(&conf);
278e18a033bSKonstantin Ananyev        return NULL;
279e18a033bSKonstantin Ananyev    }
280e18a033bSKonstantin Ananyev
281e18a033bSKonstantin Ananyev    if (ngx_test_config && !ngx_quiet_mode) {
282e18a033bSKonstantin Ananyev        ngx_log_stderr(0, "the configuration file %s syntax is ok",
283e18a033bSKonstantin Ananyev                       cycle->conf_file.data);
284e18a033bSKonstantin Ananyev    }
285e18a033bSKonstantin Ananyev
286e18a033bSKonstantin Ananyev    for (i = 0; cycle->modules[i]; i++) {
287e18a033bSKonstantin Ananyev        if (cycle->modules[i]->type != NGX_CORE_MODULE) {
288e18a033bSKonstantin Ananyev            continue;
289e18a033bSKonstantin Ananyev        }
290e18a033bSKonstantin Ananyev
291e18a033bSKonstantin Ananyev        module = cycle->modules[i]->ctx;
292e18a033bSKonstantin Ananyev
293e18a033bSKonstantin Ananyev        if (module->init_conf) {
294e18a033bSKonstantin Ananyev            if (module->init_conf(cycle,
295e18a033bSKonstantin Ananyev                                  cycle->conf_ctx[cycle->modules[i]->index])
296e18a033bSKonstantin Ananyev                == NGX_CONF_ERROR)
297e18a033bSKonstantin Ananyev            {
298e18a033bSKonstantin Ananyev                environ = senv;
299e18a033bSKonstantin Ananyev                ngx_destroy_cycle_pools(&conf);
300e18a033bSKonstantin Ananyev                return NULL;
301e18a033bSKonstantin Ananyev            }
302e18a033bSKonstantin Ananyev        }
303e18a033bSKonstantin Ananyev    }
304e18a033bSKonstantin Ananyev
305e18a033bSKonstantin Ananyev    if (ngx_process == NGX_PROCESS_SIGNALLER) {
306e18a033bSKonstantin Ananyev        return cycle;
307e18a033bSKonstantin Ananyev    }
308e18a033bSKonstantin Ananyev
309e18a033bSKonstantin Ananyev    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
310e18a033bSKonstantin Ananyev
311e18a033bSKonstantin Ananyev    if (ngx_test_config) {
312e18a033bSKonstantin Ananyev
313e18a033bSKonstantin Ananyev        if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) {
314e18a033bSKonstantin Ananyev            goto failed;
315e18a033bSKonstantin Ananyev        }
316e18a033bSKonstantin Ananyev
317e18a033bSKonstantin Ananyev    } else if (!ngx_is_init_cycle(old_cycle)) {
318e18a033bSKonstantin Ananyev
319e18a033bSKonstantin Ananyev        /*
320e18a033bSKonstantin Ananyev         * we do not create the pid file in the first ngx_init_cycle() call
321e18a033bSKonstantin Ananyev         * because we need to write the demonized process pid
322e18a033bSKonstantin Ananyev         */
323e18a033bSKonstantin Ananyev
324e18a033bSKonstantin Ananyev        old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx,
325e18a033bSKonstantin Ananyev                                                   ngx_core_module);
326e18a033bSKonstantin Ananyev        if (ccf->pid.len != old_ccf->pid.len
327e18a033bSKonstantin Ananyev            || ngx_strcmp(ccf->pid.data, old_ccf->pid.data) != 0)
328e18a033bSKonstantin Ananyev        {
329e18a033bSKonstantin Ananyev            /* new pid file name */
330e18a033bSKonstantin Ananyev
331e18a033bSKonstantin Ananyev            if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) {
332e18a033bSKonstantin Ananyev                goto failed;
333e18a033bSKonstantin Ananyev            }
334e18a033bSKonstantin Ananyev
335e18a033bSKonstantin Ananyev            ngx_delete_pidfile(old_cycle);
336e18a033bSKonstantin Ananyev        }
337e18a033bSKonstantin Ananyev    }
338e18a033bSKonstantin Ananyev
339e18a033bSKonstantin Ananyev
340e18a033bSKonstantin Ananyev    if (ngx_test_lockfile(cycle->lock_file.data, log) != NGX_OK) {
341e18a033bSKonstantin Ananyev        goto failed;
342e18a033bSKonstantin Ananyev    }
343e18a033bSKonstantin Ananyev
344e18a033bSKonstantin Ananyev
345e18a033bSKonstantin Ananyev    if (ngx_create_paths(cycle, ccf->user) != NGX_OK) {
346e18a033bSKonstantin Ananyev        goto failed;
347e18a033bSKonstantin Ananyev    }
348e18a033bSKonstantin Ananyev
349e18a033bSKonstantin Ananyev
350e18a033bSKonstantin Ananyev    if (ngx_log_open_default(cycle) != NGX_OK) {
351e18a033bSKonstantin Ananyev        goto failed;
352e18a033bSKonstantin Ananyev    }
353e18a033bSKonstantin Ananyev
354e18a033bSKonstantin Ananyev    /* open the new files */
355e18a033bSKonstantin Ananyev
356e18a033bSKonstantin Ananyev    part = &cycle->open_files.part;
357e18a033bSKonstantin Ananyev    file = part->elts;
358e18a033bSKonstantin Ananyev
359e18a033bSKonstantin Ananyev    for (i = 0; /* void */ ; i++) {
360e18a033bSKonstantin Ananyev
361e18a033bSKonstantin Ananyev        if (i >= part->nelts) {
362e18a033bSKonstantin Ananyev            if (part->next == NULL) {
363e18a033bSKonstantin Ananyev                break;
364e18a033bSKonstantin Ananyev            }
365e18a033bSKonstantin Ananyev            part = part->next;
366e18a033bSKonstantin Ananyev            file = part->elts;
367e18a033bSKonstantin Ananyev            i = 0;
368e18a033bSKonstantin Ananyev        }
369e18a033bSKonstantin Ananyev
370e18a033bSKonstantin Ananyev        if (file[i].name.len == 0) {
371e18a033bSKonstantin Ananyev            continue;
372e18a033bSKonstantin Ananyev        }
373e18a033bSKonstantin Ananyev
374e18a033bSKonstantin Ananyev        file[i].fd = ngx_open_file(file[i].name.data,
375e18a033bSKonstantin Ananyev                                   NGX_FILE_APPEND,
376e18a033bSKonstantin Ananyev                                   NGX_FILE_CREATE_OR_OPEN,
377e18a033bSKonstantin Ananyev                                   NGX_FILE_DEFAULT_ACCESS);
378e18a033bSKonstantin Ananyev
379e18a033bSKonstantin Ananyev        ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0,
380e18a033bSKonstantin Ananyev                       "log: %p %d \"%s\"",
381e18a033bSKonstantin Ananyev                       &file[i], file[i].fd, file[i].name.data);
382e18a033bSKonstantin Ananyev
383e18a033bSKonstantin Ananyev        if (file[i].fd == NGX_INVALID_FILE) {
384e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
385e18a033bSKonstantin Ananyev                          ngx_open_file_n " \"%s\" failed",
386e18a033bSKonstantin Ananyev                          file[i].name.data);
387e18a033bSKonstantin Ananyev            goto failed;
388e18a033bSKonstantin Ananyev        }
389e18a033bSKonstantin Ananyev
390e18a033bSKonstantin Ananyev#if !(NGX_WIN32)
391e18a033bSKonstantin Ananyev        if (fcntl(file[i].fd, F_SETFD, FD_CLOEXEC) == -1) {
392e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
393e18a033bSKonstantin Ananyev                          "fcntl(FD_CLOEXEC) \"%s\" failed",
394e18a033bSKonstantin Ananyev                          file[i].name.data);
395e18a033bSKonstantin Ananyev            goto failed;
396e18a033bSKonstantin Ananyev        }
397e18a033bSKonstantin Ananyev#endif
398e18a033bSKonstantin Ananyev    }
399e18a033bSKonstantin Ananyev
400e18a033bSKonstantin Ananyev    cycle->log = &cycle->new_log;
401e18a033bSKonstantin Ananyev    pool->log = &cycle->new_log;
402e18a033bSKonstantin Ananyev
403e18a033bSKonstantin Ananyev
404e18a033bSKonstantin Ananyev    /* create shared memory */
405e18a033bSKonstantin Ananyev
406e18a033bSKonstantin Ananyev    part = &cycle->shared_memory.part;
407e18a033bSKonstantin Ananyev    shm_zone = part->elts;
408e18a033bSKonstantin Ananyev
409e18a033bSKonstantin Ananyev    for (i = 0; /* void */ ; i++) {
410e18a033bSKonstantin Ananyev
411e18a033bSKonstantin Ananyev        if (i >= part->nelts) {
412e18a033bSKonstantin Ananyev            if (part->next == NULL) {
413e18a033bSKonstantin Ananyev                break;
414e18a033bSKonstantin Ananyev            }
415e18a033bSKonstantin Ananyev            part = part->next;
416e18a033bSKonstantin Ananyev            shm_zone = part->elts;
417e18a033bSKonstantin Ananyev            i = 0;
418e18a033bSKonstantin Ananyev