blob: 69d3f459b3e769a20814c6a7f252315bf4d84db5 [file] [log] [blame]
Igor Sysoev73009772003-02-06 17:21:13 +00001
Igor Sysoev9cf78302003-06-04 17:28:33 +00002#include <ngx_config.h>
3#include <ngx_core.h>
Igor Sysoev73009772003-02-06 17:21:13 +00004
5
Igor Sysoevfa73aac2003-05-21 13:28:21 +00006/*
Igor Sysoev7af6b162004-02-09 07:46:43 +00007 * ioctl(FIONBIO) sets a blocking mode with the single syscall
8 * while fcntl(F_SETFL, ~O_NONBLOCK) needs to learn before
9 * a previous state using fcntl(F_GETFL).
10 *
11 * ioctl() and fcntl() are syscalls on at least FreeBSD 2.x, Linux 2.2
12 * and Solaris 7
13 */
Igor Sysoevfa73aac2003-05-21 13:28:21 +000014
Igor Sysoev9cf78302003-06-04 17:28:33 +000015
16#if (HAVE_FIONBIO)
Igor Sysoev73009772003-02-06 17:21:13 +000017
18int ngx_nonblocking(ngx_socket_t s)
19{
20 unsigned long nb = 1;
21
22 return ioctl(s, FIONBIO, &nb);
23}
24
Igor Sysoev9cf78302003-06-04 17:28:33 +000025
Igor Sysoev73009772003-02-06 17:21:13 +000026int ngx_blocking(ngx_socket_t s)
27{
28 unsigned long nb = 0;
29
30 return ioctl(s, FIONBIO, &nb);
31}
32
33#endif
Igor Sysoev9cf78302003-06-04 17:28:33 +000034
35
36#ifdef __FreeBSD__
37
38int ngx_tcp_nopush(ngx_socket_t s)
39{
40 int tcp_nopush;
41
42 tcp_nopush = 1;
43
44 return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH,
45 (const void *) &tcp_nopush, sizeof(int));
46}
47
48
49int ngx_tcp_push(ngx_socket_t s)
50{
51 int tcp_nopush;
52
53 tcp_nopush = 0;
54
55 return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH,
56 (const void *) &tcp_nopush, sizeof(int));
57}
58
Igor Sysoeva8fa0a62003-11-25 20:44:56 +000059#elif __linux__
60
61int ngx_tcp_nopush(ngx_socket_t s)
62{
63 int cork;
64
65 cork = 1;
66
67 return setsockopt(s, IPPROTO_TCP, TCP_CORK,
68 (const void *) &cork, sizeof(int));
69}
70
71int ngx_tcp_push(ngx_socket_t s)
72{
73 int cork;
74
75 cork = 0;
76
77 return setsockopt(s, IPPROTO_TCP, TCP_CORK,
78 (const void *) &cork, sizeof(int));
79}
80
Igor Sysoev239baac2003-06-11 15:28:34 +000081#else
Igor Sysoev9cf78302003-06-04 17:28:33 +000082
83int ngx_tcp_nopush(ngx_socket_t s)
84{
85 return NGX_OK;
86}
87
88int ngx_tcp_push(ngx_socket_t s)
89{
90 return NGX_OK;
91}
92
93#endif