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
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyevchar    ngx_darwin_kern_ostype[16];
13e18a033bSKonstantin Ananyevchar    ngx_darwin_kern_osrelease[128];
14e18a033bSKonstantin Ananyevint     ngx_darwin_hw_ncpu;
15e18a033bSKonstantin Ananyevint     ngx_darwin_kern_ipc_somaxconn;
16e18a033bSKonstantin Ananyevu_long  ngx_darwin_net_inet_tcp_sendspace;
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyevngx_uint_t  ngx_debug_malloc;
19e18a033bSKonstantin Ananyev
20e18a033bSKonstantin Ananyev
21e18a033bSKonstantin Ananyevstatic ngx_os_io_t ngx_darwin_io = {
22e18a033bSKonstantin Ananyev    ngx_unix_recv,
23e18a033bSKonstantin Ananyev    ngx_readv_chain,
24e18a033bSKonstantin Ananyev    ngx_udp_unix_recv,
25e18a033bSKonstantin Ananyev    ngx_unix_send,
26e18a033bSKonstantin Ananyev    ngx_udp_unix_send,
27e18a033bSKonstantin Ananyev    ngx_udp_unix_sendmsg_chain,
28e18a033bSKonstantin Ananyev#if (NGX_HAVE_SENDFILE)
29e18a033bSKonstantin Ananyev    ngx_darwin_sendfile_chain,
30e18a033bSKonstantin Ananyev    NGX_IO_SENDFILE
31e18a033bSKonstantin Ananyev#else
32e18a033bSKonstantin Ananyev    ngx_writev_chain,
33e18a033bSKonstantin Ananyev    0
34e18a033bSKonstantin Ananyev#endif
35e18a033bSKonstantin Ananyev};
36e18a033bSKonstantin Ananyev
37e18a033bSKonstantin Ananyev
38e18a033bSKonstantin Ananyevtypedef struct {
39e18a033bSKonstantin Ananyev    char        *name;
40e18a033bSKonstantin Ananyev    void        *value;
41e18a033bSKonstantin Ananyev    size_t       size;
42e18a033bSKonstantin Ananyev    ngx_uint_t   exists;
43e18a033bSKonstantin Ananyev} sysctl_t;
44e18a033bSKonstantin Ananyev
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyevsysctl_t sysctls[] = {
47e18a033bSKonstantin Ananyev    { "hw.ncpu",
48e18a033bSKonstantin Ananyev      &ngx_darwin_hw_ncpu,
49e18a033bSKonstantin Ananyev      sizeof(ngx_darwin_hw_ncpu), 0 },
50e18a033bSKonstantin Ananyev
51e18a033bSKonstantin Ananyev    { "net.inet.tcp.sendspace",
52e18a033bSKonstantin Ananyev      &ngx_darwin_net_inet_tcp_sendspace,
53e18a033bSKonstantin Ananyev      sizeof(ngx_darwin_net_inet_tcp_sendspace), 0 },
54e18a033bSKonstantin Ananyev
55e18a033bSKonstantin Ananyev    { "kern.ipc.somaxconn",
56e18a033bSKonstantin Ananyev      &ngx_darwin_kern_ipc_somaxconn,
57e18a033bSKonstantin Ananyev      sizeof(ngx_darwin_kern_ipc_somaxconn), 0 },
58e18a033bSKonstantin Ananyev
59e18a033bSKonstantin Ananyev    { NULL, NULL, 0, 0 }
60e18a033bSKonstantin Ananyev};
61e18a033bSKonstantin Ananyev
62e18a033bSKonstantin Ananyev
63e18a033bSKonstantin Ananyevvoid
64e18a033bSKonstantin Ananyevngx_debug_init(void)
65e18a033bSKonstantin Ananyev{
66e18a033bSKonstantin Ananyev#if (NGX_DEBUG_MALLOC)
67e18a033bSKonstantin Ananyev
68e18a033bSKonstantin Ananyev    /*
69e18a033bSKonstantin Ananyev     * MacOSX 10.6, 10.7:  MallocScribble fills freed memory with 0x55
70e18a033bSKonstantin Ananyev     *                     and fills allocated memory with 0xAA.
71e18a033bSKonstantin Ananyev     * MacOSX 10.4, 10.5:  MallocScribble fills freed memory with 0x55,
72e18a033bSKonstantin Ananyev     *                     MallocPreScribble fills allocated memory with 0xAA.
73e18a033bSKonstantin Ananyev     * MacOSX 10.3:        MallocScribble fills freed memory with 0x55,
74e18a033bSKonstantin Ananyev     *                     and no way to fill allocated memory.
75e18a033bSKonstantin Ananyev     */
76e18a033bSKonstantin Ananyev
77e18a033bSKonstantin Ananyev    setenv("MallocScribble", "1", 0);
78e18a033bSKonstantin Ananyev
79e18a033bSKonstantin Ananyev    ngx_debug_malloc = 1;
80e18a033bSKonstantin Ananyev
81e18a033bSKonstantin Ananyev#else
82e18a033bSKonstantin Ananyev
83e18a033bSKonstantin Ananyev    if (getenv("MallocScribble")) {
84e18a033bSKonstantin Ananyev        ngx_debug_malloc = 1;
85e18a033bSKonstantin Ananyev    }
86e18a033bSKonstantin Ananyev
87e18a033bSKonstantin Ananyev#endif
88e18a033bSKonstantin Ananyev}
89e18a033bSKonstantin Ananyev
90e18a033bSKonstantin Ananyev
91e18a033bSKonstantin Ananyevngx_int_t
92e18a033bSKonstantin Ananyevngx_os_specific_init(ngx_log_t *log)
93e18a033bSKonstantin Ananyev{
94e18a033bSKonstantin Ananyev    size_t      size;
95e18a033bSKonstantin Ananyev    ngx_err_t   err;
96e18a033bSKonstantin Ananyev    ngx_uint_t  i;
97e18a033bSKonstantin Ananyev
98e18a033bSKonstantin Ananyev    size = sizeof(ngx_darwin_kern_ostype);
99e18a033bSKonstantin Ananyev    if (sysctlbyname("kern.ostype", ngx_darwin_kern_ostype, &size, NULL, 0)
100e18a033bSKonstantin Ananyev        == -1)
101e18a033bSKonstantin Ananyev    {
102e18a033bSKonstantin Ananyev        err = ngx_errno;
103e18a033bSKonstantin Ananyev
104e18a033bSKonstantin Ananyev        if (err != NGX_ENOENT) {
105e18a033bSKonstantin Ananyev
106e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, log, err,
107e18a033bSKonstantin Ananyev                          "sysctlbyname(kern.ostype) failed");
108e18a033bSKonstantin Ananyev
109e18a033bSKonstantin Ananyev            if (err != NGX_ENOMEM) {
110e18a033bSKonstantin Ananyev                return NGX_ERROR;
111e18a033bSKonstantin Ananyev            }
112e18a033bSKonstantin Ananyev
113e18a033bSKonstantin Ananyev            ngx_darwin_kern_ostype[size - 1] = '\0';
114e18a033bSKonstantin Ananyev        }
115e18a033bSKonstantin Ananyev    }
116e18a033bSKonstantin Ananyev
117e18a033bSKonstantin Ananyev    size = sizeof(ngx_darwin_kern_osrelease);
118e18a033bSKonstantin Ananyev    if (sysctlbyname("kern.osrelease", ngx_darwin_kern_osrelease, &size,
119e18a033bSKonstantin Ananyev                     NULL, 0)
120e18a033bSKonstantin Ananyev        == -1)
121e18a033bSKonstantin Ananyev    {
122e18a033bSKonstantin Ananyev        err = ngx_errno;
123e18a033bSKonstantin Ananyev
124e18a033bSKonstantin Ananyev        if (err != NGX_ENOENT) {
125e18a033bSKonstantin Ananyev
126e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_ALERT, log, err,
127e18a033bSKonstantin Ananyev                          "sysctlbyname(kern.osrelease) failed");
128e18a033bSKonstantin Ananyev
129e18a033bSKonstantin Ananyev            if (err != NGX_ENOMEM) {
130e18a033bSKonstantin Ananyev                return NGX_ERROR;
131e18a033bSKonstantin Ananyev            }
132e18a033bSKonstantin Ananyev
133e18a033bSKonstantin Ananyev            ngx_darwin_kern_osrelease[size - 1] = '\0';
134e18a033bSKonstantin Ananyev        }
135e18a033bSKonstantin Ananyev    }
136e18a033bSKonstantin Ananyev
137e18a033bSKonstantin Ananyev    for (i = 0; sysctls[i].name; i++) {
138e18a033bSKonstantin Ananyev        size = sysctls[i].size;
139e18a033bSKonstantin Ananyev
140e18a033bSKonstantin Ananyev        if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0)
141e18a033bSKonstantin Ananyev            == 0)
142e18a033bSKonstantin Ananyev        {
143e18a033bSKonstantin Ananyev            sysctls[i].exists = 1;
144e18a033bSKonstantin Ananyev            continue;
145e18a033bSKonstantin Ananyev        }
146e18a033bSKonstantin Ananyev
147e18a033bSKonstantin Ananyev        err = ngx_errno;
148e18a033bSKonstantin Ananyev
149e18a033bSKonstantin Ananyev        if (err == NGX_ENOENT) {
150e18a033bSKonstantin Ananyev            continue;
151e18a033bSKonstantin Ananyev        }
152e18a033bSKonstantin Ananyev
153e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_ALERT, log, err,
154e18a033bSKonstantin Ananyev                      "sysctlbyname(%s) failed", sysctls[i].name);
155e18a033bSKonstantin Ananyev        return NGX_ERROR;
156e18a033bSKonstantin Ananyev    }
157e18a033bSKonstantin Ananyev
158e18a033bSKonstantin Ananyev    ngx_ncpu = ngx_darwin_hw_ncpu;
159e18a033bSKonstantin Ananyev
160e18a033bSKonstantin Ananyev    if (ngx_darwin_kern_ipc_somaxconn > 32767) {
161e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_ALERT, log, 0,
162e18a033bSKonstantin Ananyev                      "sysctl kern.ipc.somaxconn must be less than 32768");
163e18a033bSKonstantin Ananyev        return NGX_ERROR;
164e18a033bSKonstantin Ananyev    }
165e18a033bSKonstantin Ananyev
166e18a033bSKonstantin Ananyev    ngx_tcp_nodelay_and_tcp_nopush = 1;
167e18a033bSKonstantin Ananyev
168e18a033bSKonstantin Ananyev    ngx_os_io = ngx_darwin_io;
169e18a033bSKonstantin Ananyev
170e18a033bSKonstantin Ananyev    return NGX_OK;
171e18a033bSKonstantin Ananyev}
172e18a033bSKonstantin Ananyev
173e18a033bSKonstantin Ananyev
174e18a033bSKonstantin Ananyevvoid
175e18a033bSKonstantin Ananyevngx_os_specific_status(ngx_log_t *log)
176e18a033bSKonstantin Ananyev{
177e18a033bSKonstantin Ananyev    u_long      value;
178e18a033bSKonstantin Ananyev    ngx_uint_t  i;
179e18a033bSKonstantin Ananyev
180e18a033bSKonstantin Ananyev    if (ngx_darwin_kern_ostype[0]) {
181e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s",
182e18a033bSKonstantin Ananyev                      ngx_darwin_kern_ostype, ngx_darwin_kern_osrelease);
183e18a033bSKonstantin Ananyev    }
184e18a033bSKonstantin Ananyev
185e18a033bSKonstantin Ananyev    for (i = 0; sysctls[i].name; i++) {
186e18a033bSKonstantin Ananyev        if (sysctls[i].exists) {
187e18a033bSKonstantin Ananyev            if (sysctls[i].size == sizeof(long)) {
188e18a033bSKonstantin Ananyev                value = *(long *) sysctls[i].value;
189e18a033bSKonstantin Ananyev
190e18a033bSKonstantin Ananyev            } else {
191e18a033bSKonstantin Ananyev                value = *(int *) sysctls[i].value;
192e18a033bSKonstantin Ananyev            }
193e18a033bSKonstantin Ananyev
194e18a033bSKonstantin Ananyev            ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l",
195e18a033bSKonstantin Ananyev                          sysctls[i].name, value);
196e18a033bSKonstantin Ananyev        }
197e18a033bSKonstantin Ananyev    }
198e18a033bSKonstantin Ananyev}
199