|  | 
 | /* | 
 |  * Copyright (C) Igor Sysoev | 
 |  */ | 
 |  | 
 |  | 
 | #include <ngx_config.h> | 
 | #include <ngx_core.h> | 
 |  | 
 |  | 
 | /* | 
 |  * ioctl(FIONBIO) sets a non-blocking mode with the single syscall | 
 |  * while fcntl(F_SETFL, O_NONBLOCK) needs to learn the current state | 
 |  * using fcntl(F_GETFL). | 
 |  * | 
 |  * ioctl() and fcntl() are syscalls at least in FreeBSD 2.x, Linux 2.2 | 
 |  * and Solaris 7. | 
 |  * | 
 |  * ioctl() in Linux 2.4 and 2.6 uses BKL, however, fcntl(F_SETFL) uses it too. | 
 |  */ | 
 |  | 
 |  | 
 | #if (NGX_HAVE_FIONBIO) | 
 |  | 
 | int | 
 | ngx_nonblocking(ngx_socket_t s) | 
 | { | 
 |     int  nb; | 
 |  | 
 |     nb = 1; | 
 |  | 
 |     return ioctl(s, FIONBIO, &nb); | 
 | } | 
 |  | 
 |  | 
 | int | 
 | ngx_blocking(ngx_socket_t s) | 
 | { | 
 |     int  nb; | 
 |  | 
 |     nb = 0; | 
 |  | 
 |     return ioctl(s, FIONBIO, &nb); | 
 | } | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | #if (NGX_FREEBSD) | 
 |  | 
 | int | 
 | ngx_tcp_nopush(ngx_socket_t s) | 
 | { | 
 |     int  tcp_nopush; | 
 |  | 
 |     tcp_nopush = 1; | 
 |  | 
 |     return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH, | 
 |                       (const void *) &tcp_nopush, sizeof(int)); | 
 | } | 
 |  | 
 |  | 
 | int | 
 | ngx_tcp_push(ngx_socket_t s) | 
 | { | 
 |     int  tcp_nopush; | 
 |  | 
 |     tcp_nopush = 0; | 
 |  | 
 |     return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH, | 
 |                       (const void *) &tcp_nopush, sizeof(int)); | 
 | } | 
 |  | 
 | #elif (NGX_LINUX) | 
 |  | 
 |  | 
 | int | 
 | ngx_tcp_nopush(ngx_socket_t s) | 
 | { | 
 |     int  cork; | 
 |  | 
 |     cork = 1; | 
 |  | 
 |     return setsockopt(s, IPPROTO_TCP, TCP_CORK, | 
 |                       (const void *) &cork, sizeof(int)); | 
 | } | 
 |  | 
 |  | 
 | int | 
 | ngx_tcp_push(ngx_socket_t s) | 
 | { | 
 |     int  cork; | 
 |  | 
 |     cork = 0; | 
 |  | 
 |     return setsockopt(s, IPPROTO_TCP, TCP_CORK, | 
 |                       (const void *) &cork, sizeof(int)); | 
 | } | 
 |  | 
 | #else | 
 |  | 
 | int | 
 | ngx_tcp_nopush(ngx_socket_t s) | 
 | { | 
 |     return 0; | 
 | } | 
 |  | 
 |  | 
 | int | 
 | ngx_tcp_push(ngx_socket_t s) | 
 | { | 
 |     return 0; | 
 | } | 
 |  | 
 | #endif |