summaryrefslogtreecommitdiff
path: root/build/apr_network.m4
diff options
context:
space:
mode:
authorJeff Trawick <trawick@apache.org>2001-04-05 18:56:08 +0000
committerJeff Trawick <trawick@apache.org>2001-04-05 18:56:08 +0000
commitdc1e0913b5a168ed4f4758fe53363e62ed1d77b7 (patch)
tree70815185169dde20fa9e2c7f0f69709624fed58a /build/apr_network.m4
parent509719e7f507659f461d14aeb2e3aaaf6a03b557 (diff)
downloadapr-dc1e0913b5a168ed4f4758fe53363e62ed1d77b7.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: https://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.m4105
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