📄 apr_network.m4
字号:
dnl -----------------------------------------------------------------dnl apr_network.m4: APR's autoconf macros for testing network supportdnldnldnl check for working getaddrinfo()dnldnl Note that if the system doesn't have gai_strerror(), wednl can't use getaddrinfo() because we can't get stringsdnl describing the error codes.dnlAC_DEFUN(APR_CHECK_WORKING_GETADDRINFO,[ AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[ AC_TRY_RUN( [#ifdef HAVE_NETDB_H#include <netdb.h>#endif#ifdef HAVE_STRING_H#include <string.h>#endif#ifdef HAVE_SYS_TYPES_H#include <sys/types.h>#endif#ifdef HAVE_SYS_SOCKET_H#include <sys/socket.h>#endifvoid 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", NULL, &hints, &ai); if (error) { exit(1); } if (ai->ai_addr->sa_family != AF_INET) { exit(1); } 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 if test "$ac_cv_func_gai_strerror" != "yes"; then ac_cv_working_getaddrinfo="no" else AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works well enough for APR]) fifi])dnldnl check for working getnameinfo()dnlAC_DEFUN(APR_CHECK_WORKING_GETNAMEINFO,[ AC_CACHE_CHECK(for working getnameinfo, ac_cv_working_getnameinfo,[ AC_TRY_RUN( [#ifdef HAVE_NETDB_H#include <netdb.h>#endif#ifdef HAVE_STRING_H#include <string.h>#endif#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>#endifvoid 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_NUMERICHOST); 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])dnldnl check for negative error codes for getaddrinfo()dnlAC_DEFUN(APR_CHECK_NEGATIVE_EAI,[ AC_CACHE_CHECK(for negative error codes for getaddrinfo, ac_cv_negative_eai,[ AC_TRY_RUN( [#ifdef HAVE_NETDB_H#include <netdb.h>#endifvoid main(void) { if (EAI_ADDRFAMILY < 0) { exit(0); } exit(1);}],[ ac_cv_negative_eai="yes"],[ ac_cv_negative_eai="no"],[ ac_cv_negative_eai="no"])])if test "$ac_cv_negative_eai" = "yes"; then AC_DEFINE(NEGATIVE_EAI, 1, [Define if EAI_ error codes from getaddrinfo are negative])fi])dnldnl check for presence of retrans/retry variables in the res_state structurednlAC_DEFUN(APR_CHECK_RESOLV_RETRANS,[ AC_CACHE_CHECK(for presence of retrans/retry fields in res_state/resolv.h , ac_cv_retransretry,[ AC_TRY_RUN( [#include <sys/types.h>#if defined(__sun__)#include <inet/ip.h>#endif#include <resolv.h>/* _res is a global defined in resolv.h */int main(void) { _res.retrans = 2; _res.retry = 1; exit(0); return 0;}],[ ac_cv_retransretry="yes"],[ ac_cv_retransretry="no"],[ ac_cv_retransretry="no"])])if test "$ac_cv_retransretry" = "yes"; then AC_DEFINE(RESOLV_RETRANSRETRY, 1, [Define if resolv.h's res_state has the fields retrans/rety])fi])dnldnl Checks the definition of gethostbyname_r and gethostbyaddr_rdnl which are different for glibc, solaris and assorted other operatingdnl systemsdnldnl Note that this test is executed too early to see if we have all ofdnl the headers.AC_DEFUN(APR_CHECK_GETHOSTBYNAME_R_STYLE,[dnl Try and compile a glibc2 gethostbyname_r piece of code, and set thednl style of the routines to glibc2 on successAC_CACHE_CHECK([style of gethostbyname_r routine], ac_cv_gethostbyname_r_style,APR_TRY_COMPILE_NO_WARNING([#ifdef HAVE_SYS_TYPES_H#include <sys/types.h>#endif#ifdef HAVE_NETINET_IN_H#include <netinet/in.h>#endif#ifdef HAVE_ARPA_INET_H#include <arpa/inet.h>#endif#ifdef HAVE_NETDB_H#include <netdb.h>#endif#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif],[int tmp = gethostbyname_r((const char *) 0, (struct hostent *) 0, (char *) 0, 0, (struct hostent **) 0, &tmp);], ac_cv_gethostbyname_r_style=glibc2, ac_cv_gethostbyname_r_style=none))if test "$ac_cv_gethostbyname_r_style" = "glibc2"; then AC_DEFINE(GETHOSTBYNAME_R_GLIBC2, 1, [Define if gethostbyname_r has the glibc style])fiAC_CACHE_CHECK([3rd argument to the gethostbyname_r routines], ac_cv_gethostbyname_r_arg,APR_TRY_COMPILE_NO_WARNING([#ifdef HAVE_SYS_TYPES_H#include <sys/types.h>#endif#ifdef HAVE_NETINET_IN_H#include <netinet/in.h>#endif#ifdef HAVE_ARPA_INET_H#include <arpa/inet.h>#endif#ifdef HAVE_NETDB_H#include <netdb.h>#endif#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif],[int tmp = gethostbyname_r((const char *) 0, (struct hostent *) 0, (struct hostent_data *) 0);],ac_cv_gethostbyname_r_arg=hostent_data, ac_cv_gethostbyname_r_arg=char))if test "$ac_cv_gethostbyname_r_arg" = "hostent_data"; then AC_DEFINE(GETHOSTBYNAME_R_HOSTENT_DATA, 1, [Define if gethostbyname_r has the hostent_data for the third argument])fi])dnldnl see if TCP_NODELAY setting is inherited from listening socketsdnlAC_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#ifndef HAVE_SOCKLEN_Ttypedef int socklen_t;#endifint main(void) { int listen_s, connected_s, client_s; int listen_port, rc; struct sockaddr_in sa; socklen_t sa_len; socklen_t 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=1else tcp_nodelay_inherited=0fi])dnldnl see if O_NONBLOCK setting is inherited from listening socketsdnlAC_DEFUN(APR_CHECK_O_NONBLOCK_INHERITED,[ AC_CACHE_CHECK(if O_NONBLOCK setting is inherited from listening sockets, ac_cv_o_nonblock_inherited,[ AC_TRY_RUN( [#include <stdio.h>#ifdef HAVE_SYS_TYPES_H#include <sys/types.h>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -