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 <nginx.h>
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev
13e18a033bSKonstantin Ananyevngx_int_t   ngx_ncpu;
14e18a033bSKonstantin Ananyevngx_int_t   ngx_max_sockets;
15e18a033bSKonstantin Ananyevngx_uint_t  ngx_inherited_nonblocking;
16e18a033bSKonstantin Ananyevngx_uint_t  ngx_tcp_nodelay_and_tcp_nopush;
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyevstruct rlimit  rlmt;
20e18a033bSKonstantin Ananyev
21e18a033bSKonstantin Ananyev
22e18a033bSKonstantin Ananyevngx_os_io_t ngx_os_io = {
23e18a033bSKonstantin Ananyev    ngx_unix_recv,
24e18a033bSKonstantin Ananyev    ngx_readv_chain,
25e18a033bSKonstantin Ananyev    ngx_udp_unix_recv,
26e18a033bSKonstantin Ananyev    ngx_unix_send,
27e18a033bSKonstantin Ananyev    ngx_udp_unix_send,
28e18a033bSKonstantin Ananyev    ngx_udp_unix_sendmsg_chain,
29e18a033bSKonstantin Ananyev    ngx_writev_chain,
30e18a033bSKonstantin Ananyev    0
31e18a033bSKonstantin Ananyev};
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyev
34e18a033bSKonstantin Ananyevngx_int_t
35e18a033bSKonstantin Ananyevngx_os_init(ngx_log_t *log)
36e18a033bSKonstantin Ananyev{
37e18a033bSKonstantin Ananyev    ngx_time_t  *tp;
38e18a033bSKonstantin Ananyev    ngx_uint_t   n;
39e18a033bSKonstantin Ananyev
40e18a033bSKonstantin Ananyev#if (NGX_HAVE_OS_SPECIFIC_INIT)
41e18a033bSKonstantin Ananyev    if (ngx_os_specific_init(log) != NGX_OK) {
42e18a033bSKonstantin Ananyev        return NGX_ERROR;
43e18a033bSKonstantin Ananyev    }
44e18a033bSKonstantin Ananyev#endif
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyev    if (ngx_init_setproctitle(log) != NGX_OK) {
47e18a033bSKonstantin Ananyev        return NGX_ERROR;
48e18a033bSKonstantin Ananyev    }
49e18a033bSKonstantin Ananyev
50e18a033bSKonstantin Ananyev    ngx_pagesize = getpagesize();
51e18a033bSKonstantin Ananyev    ngx_cacheline_size = NGX_CPU_CACHE_LINE;
52e18a033bSKonstantin Ananyev
53e18a033bSKonstantin Ananyev    for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }
54e18a033bSKonstantin Ananyev
55e18a033bSKonstantin Ananyev#if (NGX_HAVE_SC_NPROCESSORS_ONLN)
56e18a033bSKonstantin Ananyev    if (ngx_ncpu == 0) {
57e18a033bSKonstantin Ananyev        ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN);
58e18a033bSKonstantin Ananyev    }
59e18a033bSKonstantin Ananyev#endif
60e18a033bSKonstantin Ananyev
61e18a033bSKonstantin Ananyev    if (ngx_ncpu < 1) {
62e18a033bSKonstantin Ananyev        ngx_ncpu = 1;
63e18a033bSKonstantin Ananyev    }
64e18a033bSKonstantin Ananyev
65e18a033bSKonstantin Ananyev    ngx_cpuinfo();
66e18a033bSKonstantin Ananyev
67e18a033bSKonstantin Ananyev    if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {
68e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_ALERT, log, errno,
69e18a033bSKonstantin Ananyev                      "getrlimit(RLIMIT_NOFILE) failed");
70e18a033bSKonstantin Ananyev        return NGX_ERROR;
71e18a033bSKonstantin Ananyev    }
72e18a033bSKonstantin Ananyev
73e18a033bSKonstantin Ananyev    ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur;
74e18a033bSKonstantin Ananyev
75e18a033bSKonstantin Ananyev#if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4)
76e18a033bSKonstantin Ananyev    ngx_inherited_nonblocking = 1;
77e18a033bSKonstantin Ananyev#else
78e18a033bSKonstantin Ananyev    ngx_inherited_nonblocking = 0;
79e18a033bSKonstantin Ananyev#endif
80e18a033bSKonstantin Ananyev
81e18a033bSKonstantin Ananyev    tp = ngx_timeofday();
82e18a033bSKonstantin Ananyev    srandom(((unsigned) ngx_pid << 16) ^ tp->sec ^ tp->msec);
83e18a033bSKonstantin Ananyev
84e18a033bSKonstantin Ananyev    return NGX_OK;
85e18a033bSKonstantin Ananyev}
86e18a033bSKonstantin Ananyev
87e18a033bSKonstantin Ananyev
88e18a033bSKonstantin Ananyevvoid
89e18a033bSKonstantin Ananyevngx_os_status(ngx_log_t *log)
90e18a033bSKonstantin Ananyev{
91e18a033bSKonstantin Ananyev    ngx_log_error(NGX_LOG_NOTICE, log, 0, NGINX_VER_BUILD);
92e18a033bSKonstantin Ananyev
93e18a033bSKonstantin Ananyev#ifdef NGX_COMPILER
94e18a033bSKonstantin Ananyev    ngx_log_error(NGX_LOG_NOTICE, log, 0, "built by " NGX_COMPILER);
95e18a033bSKonstantin Ananyev#endif
96e18a033bSKonstantin Ananyev
97e18a033bSKonstantin Ananyev#if (NGX_HAVE_OS_SPECIFIC_INIT)
98e18a033bSKonstantin Ananyev    ngx_os_specific_status(log);
99e18a033bSKonstantin Ananyev#endif
100e18a033bSKonstantin Ananyev
101e18a033bSKonstantin Ananyev    ngx_log_error(NGX_LOG_NOTICE, log, 0,
102e18a033bSKonstantin Ananyev                  "getrlimit(RLIMIT_NOFILE): %r:%r",
103e18a033bSKonstantin Ananyev                  rlmt.rlim_cur, rlmt.rlim_max);
104e18a033bSKonstantin Ananyev}
105e18a033bSKonstantin Ananyev
106e18a033bSKonstantin Ananyev
107e18a033bSKonstantin Ananyev#if 0
108e18a033bSKonstantin Ananyev
109e18a033bSKonstantin Ananyevngx_int_t
110e18a033bSKonstantin Ananyevngx_posix_post_conf_init(ngx_log_t *log)
111e18a033bSKonstantin Ananyev{
112e18a033bSKonstantin Ananyev    ngx_fd_t  pp[2];
113e18a033bSKonstantin Ananyev
114e18a033bSKonstantin Ananyev    if (pipe(pp) == -1) {
115e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "pipe() failed");
116e18a033bSKonstantin Ananyev        return NGX_ERROR;
117e18a033bSKonstantin Ananyev    }
118e18a033bSKonstantin Ananyev
119e18a033bSKonstantin Ananyev    if (dup2(pp[1], STDERR_FILENO) == -1) {
120e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDERR) failed");
121e18a033bSKonstantin Ananyev        return NGX_ERROR;
122e18a033bSKonstantin Ananyev    }
123e18a033bSKonstantin Ananyev
124e18a033bSKonstantin Ananyev    if (pp[1] > STDERR_FILENO) {
125e18a033bSKonstantin Ananyev        if (close(pp[1]) == -1) {
126e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_EMERG, log, errno, "close() failed");
127e18a033bSKonstantin Ananyev            return NGX_ERROR;
128e18a033bSKonstantin Ananyev        }
129e18a033bSKonstantin Ananyev    }
130e18a033bSKonstantin Ananyev
131e18a033bSKonstantin Ananyev    return NGX_OK;
132e18a033bSKonstantin Ananyev}
133e18a033bSKonstantin Ananyev
134e18a033bSKonstantin Ananyev#endif
135