| |
| /* |
| * Copyright (C) Igor Sysoev |
| */ |
| |
| |
| #include <ngx_config.h> |
| #include <ngx_core.h> |
| |
| |
| /* |
| * ioctl(FIONBIO) sets a blocking mode with the single syscall |
| * while fcntl(F_SETFL, !O_NONBLOCK) needs to learn before |
| * the previous 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) |
| { |
| u_long nb; |
| |
| nb = 1; |
| |
| return ioctl(s, FIONBIO, &nb); |
| } |
| |
| |
| int |
| ngx_blocking(ngx_socket_t s) |
| { |
| u_long 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 |