dnl ----------------------------------------------------------------- dnl apr_network.m4: APR's autoconf macros for testing network support dnl dnl dnl check for working getaddrinfo() dnl AC_DEFUN(APR_CHECK_WORKING_GETADDRINFO,[ AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[ AC_TRY_RUN( [ #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif void main(void) { struct addrinfo hints, *ai; int error; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; error = getaddrinfo("127.0.0.1", "8080", &hints, &ai); if (error) { exit(1); } else { exit(0); } } ],[ ac_cv_working_getaddrinfo="yes" ],[ ac_cv_working_getaddrinfo="no" ],[ ac_cv_working_getaddrinfo="yes" ])]) if test "$ac_cv_working_getaddrinfo" = "yes"; then AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works well enough for APR]) fi ]) dnl dnl check for working getnameinfo() dnl AC_DEFUN(APR_CHECK_WORKING_GETNAMEINFO,[ AC_CACHE_CHECK(for working getnameinfo, ac_cv_working_getnameinfo,[ AC_TRY_RUN( [ #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif void main(void) { struct sockaddr_in sa; char hbuf[256]; int error; sa.sin_family = AF_INET; sa.sin_port = 0; sa.sin_addr.s_addr = inet_addr("127.0.0.1"); #ifdef SIN6_LEN sa.sin_len = sizeof(sa); #endif error = getnameinfo((const struct sockaddr *)&sa, sizeof(sa), hbuf, 256, NULL, 0, NI_NAMEREQD); if (error) { exit(1); } else { exit(0); } } ],[ ac_cv_working_getnameinfo="yes" ],[ ac_cv_working_getnameinfo="no" ],[ ac_cv_working_getnameinfo="yes" ])]) if test "$ac_cv_working_getnameinfo"="yes"; then AC_DEFINE(HAVE_GETNAMEINFO, 1, [Define if getnameinfo exists]) fi ]) dnl dnl check for gethostbyname() which handles numeric address strings dnl AC_DEFUN(APR_CHECK_GETHOSTBYNAME_NAS,[ AC_CACHE_CHECK(for gethostbyname() which handles numeric address strings, ac_cv_gethostbyname_nas,[ AC_TRY_RUN( [ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_ARPA_INET_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_STDLIB_H #include #endif void main(void) { struct hostent *he = gethostbyname("127.0.0.1"); if (he == NULL) { exit(1); } else { exit(0); } } ],[ ac_cv_gethostbyname_nas="yes" ],[ ac_cv_gethostbyname_nas="no" ],[ ac_cv_gethostbyname_nas="yes" ])]) if test "$ac_cv_gethostbyname_nas" = "yes"; then AC_DEFINE(GETHOSTBYNAME_HANDLES_NAS, 1, [Define if gethostbyname() handles nnn.nnn.nnn.nnn]) 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 #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_NETINET_TCP_H #include #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; #ifdef BEOS sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); #endif /* 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; #ifdef BEOS sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); #endif /* 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 AC_DEFUN(APR_CHECK_SOCKLEN_T,[ AC_CACHE_CHECK(for socklen_t, ac_cv_socklen_t,[ AC_TRY_COMPILE([ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif ],[ socklen_t foo = (socklen_t) 0; ],[ ac_cv_socklen_t=yes ],[ ac_cv_socklen_t=no ]) ]) if test "$ac_cv_socklen_t" = "yes"; then AC_DEFINE(HAVE_SOCKLEN_T, 1, [Whether you have socklen_t]) fi ]) AC_DEFUN(APR_CHECK_INET_ADDR,[ AC_CACHE_CHECK(for inet_addr, ac_cv_func_inet_addr,[ AC_TRY_COMPILE([ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_ARPA_INET_H #include #endif ],[ inet_addr("127.0.0.1"); ],[ ac_cv_func_inet_addr=yes ],[ ac_cv_func_inet_addr=no ]) ]) if test "$ac_cv_func_inet_addr" = "yes"; then have_inet_addr=1 else have_inet_addr=0 fi ]) AC_DEFUN(APR_CHECK_INET_NETWORK,[ AC_CACHE_CHECK(for inet_network, ac_cv_func_inet_network,[ AC_TRY_COMPILE([ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_ARPA_INET_H #include #endif ],[ inet_network("127.0.0.1"); ],[ ac_cv_func_inet_network=yes ],[ ac_cv_func_inet_network=no ]) ]) if test "$ac_cv_func_inet_network" = "yes"; then have_inet_network=1 else have_inet_network=0 fi ]) AC_DEFUN(APR_CHECK_SOCKADDR_IN6,[ AC_CACHE_CHECK(for sockaddr_in6, ac_cv_define_sockaddr_in6,[ AC_TRY_COMPILE([ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif ],[ struct sockaddr_in6 sa; ],[ ac_cv_define_sockaddr_in6=yes ],[ ac_cv_define_sockaddr_in6=no ]) ]) if test "$ac_cv_define_sockaddr_in6" = "yes"; then have_sockaddr_in6=1 else have_sockaddr_in6=0 fi ]) dnl dnl Check to see if this platform includes sa_len in it's dnl struct sockaddr. If it does it changes the length of sa_family dnl which could cause us problems dnl AC_DEFUN(APR_CHECK_SOCKADDR_SA_LEN,[ AC_CACHE_CHECK(for sockaddr sa_len, ac_cv_define_sockaddr_sa_len,[ AC_TRY_COMPILE([ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif ],[ struct sockaddr_in sai; int i = sai.sin_len; ],[ ac_cv_define_sockaddr_sa_len=yes ],[ ac_cv_define_sockaddr_sa_len=no ]) ]) if test "$ac_cv_define_sockaddr_sa_len" = "yes"; then AC_DEFINE(HAVE_SOCKADDR_SA_LEN, 1 ,[Define if we have length field in sockaddr_in]) fi ]) dnl dnl APR_INADDR_NONE dnl dnl checks for missing INADDR_NONE macro dnl AC_DEFUN(APR_INADDR_NONE,[ AC_CACHE_CHECK(whether system defines INADDR_NONE, ac_cv_inaddr_none,[ AC_TRY_COMPILE([ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_ARPA_INET_H #include #endif ],[ unsigned long foo = INADDR_NONE; ],[ ac_cv_inaddr_none=yes ],[ ac_cv_inaddr_none=no ])]) if test "$ac_cv_inaddr_none" = "no"; then apr_inaddr_none="((unsigned int) 0xffffffff)" else apr_inaddr_none="INADDR_NONE" fi ]) dnl dnl APR_H_ERRNO_COMPILE_CHECK dnl AC_DEFUN(APR_H_ERRNO_COMPILE_CHECK,[ if test x$1 != x; then CPPFLAGS="-D$1 $CPPFLAGS" fi AC_TRY_COMPILE([ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_NETDB_H #include #endif ],[ int h_e = h_errno; ],[ if test x$1 != x; then ac_cv_h_errno_cppflags="$1" else ac_cv_h_errno_cppflags=yes fi ],[ ac_cv_h_errno_cppflags=no ])]) dnl dnl APR_CHECK_H_ERRNO_FLAG dnl dnl checks which flags are necessary for to define h_errno dnl AC_DEFUN(APR_CHECK_H_ERRNO_FLAG,[ AC_MSG_CHECKING([for h_errno in netdb.h]) AC_CACHE_VAL(ac_cv_h_errno_cppflags,[ APR_H_ERRNO_COMPILE_CHECK if test "$ac_cv_h_errno_cppflags" = "no"; then ac_save="$CPPFLAGS" for flag in _XOPEN_SOURCE_EXTENDED; do APR_H_ERRNO_COMPILE_CHECK($flag) if test "$ac_cv_h_errno_cppflags" != "no"; then break fi done CPPFLAGS="$ac_save" fi ]) if test "$ac_cv_h_errno_cppflags" != "no"; then if test "$ac_cv_h_errno_cppflags" != "yes"; then CPPFLAGS="-D$ac_cv_h_errno_cppflags $CPPFLAGS" AC_MSG_RESULT([yes, with -D$ac_cv_h_errno_cppflags]) else AC_MSG_RESULT([$ac_cv_h_errno_cppflags]) fi else AC_MSG_RESULT([$ac_cv_h_errno_cppflags]) fi ]) AC_DEFUN(APR_EBCDIC,[ AC_CACHE_CHECK([whether system uses EBCDIC],ac_cv_ebcdic,[ AC_TRY_RUN( [ int main(void) { return (unsigned char)'A' != (unsigned char)0xC1; } ],[ ac_cv_ebcdic="yes" ],[ ac_cv_ebcdic="no" ],[ ac_cv_ebcdic="no" ])]) if test "$ac_cv_ebcdic" = "yes"; then apr_charset_ebcdic=1 else apr_charset_ebcdic=0 fi AC_SUBST(apr_charset_ebcdic) ])