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