diff options
author | trawick <trawick@13f79535-47bb-0310-9956-ffa450edef68> | 2001-04-05 18:56:08 +0000 |
---|---|---|
committer | trawick <trawick@13f79535-47bb-0310-9956-ffa450edef68> | 2001-04-05 18:56:08 +0000 |
commit | 79ab1bc787d8c5569ebed6f5fcbc5bdabe5983b2 (patch) | |
tree | 70815185169dde20fa9e2c7f0f69709624fed58a /build/apr_network.m4 | |
parent | add9492c4df0ead034db0fa2fef9f5e6dc737041 (diff) | |
download | libapr-79ab1bc787d8c5569ebed6f5fcbc5bdabe5983b2.tar.gz |
Recognize systems where the TCP_NODELAY setting is inherited from
the listening socket, and optimize apr_setsockopt(APR_TCP_NODELAY)
accordingly.
Also, note a recent change to find getnameinfo() on Tru64 in
CHANGES.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@61463 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'build/apr_network.m4')
-rw-r--r-- | build/apr_network.m4 | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/build/apr_network.m4 b/build/apr_network.m4 index 9fb15354c..ebe5e6b1b 100644 --- a/build/apr_network.m4 +++ b/build/apr_network.m4 @@ -146,6 +146,111 @@ fi ]) +dnl +dnl see if TCP_NODELAY setting is inherited from listening sockets +dnl +AC_DEFUN(APR_CHECK_TCP_NODELAY_INHERITED,[ + AC_CACHE_CHECK(if TCP_NODELAY setting is inherited from listening sockets, ac_cv_tcp_nodelay_inherited,[ + AC_TRY_RUN( [ +#include <stdio.h> +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif +#ifdef HAVE_NETINET_TCP_H +#include <netinet/tcp.h> +#endif +int main(void) { + int listen_s, connected_s, client_s; + int listen_port, rc; + struct sockaddr_in sa; + int sa_len; + int option_len; + int option; + + listen_s = socket(AF_INET, SOCK_STREAM, 0); + if (listen_s < 0) { + perror("socket"); + exit(1); + } + option = 1; + rc = setsockopt(listen_s, IPPROTO_TCP, TCP_NODELAY, &option, sizeof option); + if (rc < 0) { + perror("setsockopt TCP_NODELAY"); + exit(1); + } + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; + /* leave port 0 to get ephemeral */ + rc = bind(listen_s, (struct sockaddr *)&sa, sizeof sa); + if (rc < 0) { + perror("bind for ephemeral port"); + exit(1); + } + /* find ephemeral port */ + sa_len = sizeof(sa); + rc = getsockname(listen_s, (struct sockaddr *)&sa, &sa_len); + if (rc < 0) { + perror("getsockname"); + exit(1); + } + listen_port = sa.sin_port; + rc = listen(listen_s, 5); + if (rc < 0) { + perror("listen"); + exit(1); + } + client_s = socket(AF_INET, SOCK_STREAM, 0); + if (client_s < 0) { + perror("socket"); + exit(1); + } + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; + sa.sin_port = listen_port; + /* leave sin_addr all zeros to use loopback */ + rc = connect(client_s, (struct sockaddr *)&sa, sizeof sa); + if (rc < 0) { + perror("connect"); + exit(1); + } + sa_len = sizeof sa; + connected_s = accept(listen_s, (struct sockaddr *)&sa, &sa_len); + if (connected_s < 0) { + perror("accept"); + exit(1); + } + option_len = sizeof option; + rc = getsockopt(connected_s, IPPROTO_TCP, TCP_NODELAY, &option, &option_len); + if (rc < 0) { + perror("getsockopt"); + exit(1); + } + if (!option) { + fprintf(stderr, "TCP_NODELAY is not set in the child.\n"); + exit(1); + } + return 0; +} +],[ + ac_cv_tcp_nodelay_inherited="yes" +],[ + ac_cv_tcp_nodelay_inherited="no" +],[ + ac_cv_tcp_nodelay_inherited="yes" +])]) +if test "$ac_cv_tcp_nodelay_inherited" = "yes"; then + tcp_nodelay_inherited=1 +else + tcp_nodelay_inherited=0 +fi +]) + dnl dnl check for socklen_t, fall back to unsigned int dnl |