1
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
6
7
8 #include <ngx_config.h>
9 #include <ngx_core.h>
10
11
12 /*
13 * ioctl(FIONBIO) sets a non-blocking mode with the single syscall
14 * while fcntl(F_SETFL, O_NONBLOCK) needs to learn the current state
15 * using fcntl(F_GETFL).
16 *
17 * ioctl() and fcntl() are syscalls at least in FreeBSD 2.x, Linux 2.2
18 * and Solaris 7.
19 *
20 * ioctl() in Linux 2.4 and 2.6 uses BKL, however, fcntl(F_SETFL) uses it too.
21 */
22
23
24 #if (NGX_HAVE_FIONBIO)
25
26 int
ngx_nonblocking(ngx_socket_t s)27 ngx_nonblocking(ngx_socket_t s)
28 {
29 int nb;
30
31 nb = 1;
32
33 return ioctl(s, FIONBIO, &nb);
34 }
35
36
37 int
ngx_blocking(ngx_socket_t s)38 ngx_blocking(ngx_socket_t s)
39 {
40 int nb;
41
42 nb = 0;
43
44 return ioctl(s, FIONBIO, &nb);
45 }
46
47 #endif
48
49
50 #if (NGX_FREEBSD)
51
52 int
ngx_tcp_nopush(ngx_socket_t s)53 ngx_tcp_nopush(ngx_socket_t s)
54 {
55 int tcp_nopush;
56
57 tcp_nopush = 1;
58
59 return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH,
60 (const void *) &tcp_nopush, sizeof(int));
61 }
62
63
64 int
ngx_tcp_push(ngx_socket_t s)65 ngx_tcp_push(ngx_socket_t s)
66 {
67 int tcp_nopush;
68
69 tcp_nopush = 0;
70
71 return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH,
72 (const void *) &tcp_nopush, sizeof(int));
73 }
74
75 #elif (NGX_LINUX)
76
77
78 int
ngx_tcp_nopush(ngx_socket_t s)79 ngx_tcp_nopush(ngx_socket_t s)
80 {
81 int cork;
82
83 cork = 1;
84
85 return setsockopt(s, IPPROTO_TCP, TCP_CORK,
86 (const void *) &cork, sizeof(int));
87 }
88
89
90 int
ngx_tcp_push(ngx_socket_t s)91 ngx_tcp_push(ngx_socket_t s)
92 {
93 int cork;
94
95 cork = 0;
96
97 return setsockopt(s, IPPROTO_TCP, TCP_CORK,
98 (const void *) &cork, sizeof(int));
99 }
100
101 #else
102
103 int
ngx_tcp_nopush(ngx_socket_t s)104 ngx_tcp_nopush(ngx_socket_t s)
105 {
106 return 0;
107 }
108
109
110 int
ngx_tcp_push(ngx_socket_t s)111 ngx_tcp_push(ngx_socket_t s)
112 {
113 return 0;
114 }
115
116 #endif
117