forked from Mirrors/freeswitch
0488a5109a
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3733 d0543943-73ff-0310-b7d9-9358b9ac24b2
802 lines
19 KiB
Plaintext
802 lines
19 KiB
Plaintext
dnl -------------------------------------------------------- -*- autoconf -*-
|
|
dnl Licensed to the Apache Software Foundation (ASF) under one or more
|
|
dnl contributor license agreements. See the NOTICE file distributed with
|
|
dnl this work for additional information regarding copyright ownership.
|
|
dnl The ASF licenses this file to You under the Apache License, Version 2.0
|
|
dnl (the "License"); you may not use this file except in compliance with
|
|
dnl the License. You may obtain a copy of the License at
|
|
dnl
|
|
dnl http://www.apache.org/licenses/LICENSE-2.0
|
|
dnl
|
|
dnl Unless required by applicable law or agreed to in writing, software
|
|
dnl distributed under the License is distributed on an "AS IS" BASIS,
|
|
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
dnl See the License for the specific language governing permissions and
|
|
dnl limitations under the License.
|
|
|
|
dnl -----------------------------------------------------------------
|
|
dnl apr_network.m4: APR's autoconf macros for testing network support
|
|
dnl
|
|
|
|
dnl
|
|
dnl check for working getaddrinfo()
|
|
dnl
|
|
dnl Note that if the system doesn't have gai_strerror(), we
|
|
dnl can't use getaddrinfo() because we can't get strings
|
|
dnl describing the error codes.
|
|
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 <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
|
|
|
|
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", 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])
|
|
fi
|
|
fi
|
|
])
|
|
|
|
dnl Check whether the AI_ADDRCONFIG flag can be used with getaddrinfo
|
|
AC_DEFUN(APR_CHECK_GETADDRINFO_ADDRCONFIG, [
|
|
AC_CACHE_CHECK(for working AI_ADDRCONFIG, apr_cv_gai_addrconfig, [
|
|
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
|
|
|
|
int main(int argc, char **argv) {
|
|
struct addrinfo hints, *ai;
|
|
|
|
memset(&hints, 0, sizeof(hints));
|
|
hints.ai_family = AF_UNSPEC;
|
|
hints.ai_socktype = SOCK_STREAM;
|
|
hints.ai_flags = AI_ADDRCONFIG;
|
|
return getaddrinfo("localhost", NULL, &hints, &ai) != 0;
|
|
}], [apr_cv_gai_addrconfig=yes],
|
|
[apr_cv_gai_addrconfig=no],
|
|
[apr_cv_gai_addrconfig=no])])
|
|
|
|
if test $apr_cv_gai_addrconfig = yes; then
|
|
AC_DEFINE(HAVE_GAI_ADDRCONFIG, 1, [Define if getaddrinfo accepts the AI_ADDRCONFIG flag])
|
|
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 <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>
|
|
#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_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
|
|
])
|
|
|
|
dnl
|
|
dnl check for negative error codes for getaddrinfo()
|
|
dnl
|
|
AC_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>
|
|
#endif
|
|
|
|
void 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
|
|
])
|
|
|
|
dnl
|
|
dnl Checks the definition of gethostbyname_r and gethostbyaddr_r
|
|
dnl which are different for glibc, solaris and assorted other operating
|
|
dnl systems
|
|
dnl
|
|
dnl Note that this test is executed too early to see if we have all of
|
|
dnl the headers.
|
|
AC_DEFUN(APR_CHECK_GETHOSTBYNAME_R_STYLE,[
|
|
|
|
dnl Try and compile a glibc2 gethostbyname_r piece of code, and set the
|
|
dnl style of the routines to glibc2 on success
|
|
AC_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])
|
|
fi
|
|
|
|
AC_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
|
|
])
|
|
|
|
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
|
|
#ifndef HAVE_SOCKLEN_T
|
|
typedef int socklen_t;
|
|
#endif
|
|
int 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=1
|
|
else
|
|
tcp_nodelay_inherited=0
|
|
fi
|
|
])
|
|
|
|
dnl
|
|
dnl Determine whether TCP_NODELAY and TCP_CORK can both be set
|
|
dnl on a TCP socket.
|
|
dnl
|
|
AC_DEFUN([APR_CHECK_TCP_NODELAY_WITH_CORK], [
|
|
AC_CACHE_CHECK([whether TCP_NODELAY and TCP_CORK can both be enabled],
|
|
[apr_cv_tcp_nodelay_with_cork],
|
|
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[
|
|
#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
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
]], [[
|
|
int fd, flag, rc;
|
|
|
|
fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (fd < 0) {
|
|
exit(1);
|
|
}
|
|
|
|
flag = 1;
|
|
rc = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof flag);
|
|
if (rc < 0) {
|
|
perror("setsockopt TCP_NODELAY");
|
|
exit(2);
|
|
}
|
|
|
|
flag = 1;
|
|
rc = setsockopt(fd, IPPROTO_TCP, TCP_CORK, &flag, sizeof flag);
|
|
if (rc < 0) {
|
|
perror("setsockopt TCP_CORK");
|
|
exit(3);
|
|
}
|
|
|
|
exit(0);
|
|
]])], [apr_cv_tcp_nodelay_with_cork=yes], [apr_cv_tcp_nodelay_with_cork=no])])
|
|
|
|
if test "$apr_cv_tcp_nodelay_with_cork" = "yes"; then
|
|
AC_DEFINE([HAVE_TCP_NODELAY_WITH_CORK], 1,
|
|
[Define if TCP_NODELAY and TCP_CORK can be enabled at the same time])
|
|
fi
|
|
])
|
|
|
|
|
|
dnl
|
|
dnl see if O_NONBLOCK setting is inherited from listening sockets
|
|
dnl
|
|
AC_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>
|
|
#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_T
|
|
typedef int socklen_t;
|
|
#endif
|
|
#ifdef HAVE_FCNTL_H
|
|
#include <fcntl.h>
|
|
#endif
|
|
int main(void) {
|
|
int listen_s, connected_s, client_s;
|
|
int listen_port, rc;
|
|
struct sockaddr_in sa;
|
|
socklen_t sa_len;
|
|
|
|
listen_s = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (listen_s < 0) {
|
|
perror("socket");
|
|
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);
|
|
}
|
|
rc = fcntl(listen_s, F_SETFL, O_NONBLOCK);
|
|
if (rc < 0) {
|
|
perror("fcntl(F_SETFL)");
|
|
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);
|
|
}
|
|
rc = fcntl(connected_s, F_GETFL, 0);
|
|
if (rc < 0) {
|
|
perror("fcntl(F_GETFL)");
|
|
exit(1);
|
|
}
|
|
if (!(rc & O_NONBLOCK)) {
|
|
fprintf(stderr, "O_NONBLOCK is not set in the child.\n");
|
|
exit(1);
|
|
}
|
|
return 0;
|
|
}
|
|
],[
|
|
ac_cv_o_nonblock_inherited="yes"
|
|
],[
|
|
ac_cv_o_nonblock_inherited="no"
|
|
],[
|
|
ac_cv_o_nonblock_inherited="yes"
|
|
])])
|
|
if test "$ac_cv_o_nonblock_inherited" = "yes"; then
|
|
o_nonblock_inherited=1
|
|
else
|
|
o_nonblock_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 <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
#include <sys/socket.h>
|
|
#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 <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_ARPA_INET_H
|
|
#include <arpa/inet.h>
|
|
#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 <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_ARPA_INET_H
|
|
#include <arpa/inet.h>
|
|
#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
|
|
])
|
|
|
|
dnl Check for presence of struct sockaddr_storage.
|
|
AC_DEFUN(APR_CHECK_SOCKADDR_STORAGE,[
|
|
AC_CACHE_CHECK(for sockaddr_storage, apr_cv_define_sockaddr_storage,[
|
|
AC_TRY_COMPILE([
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_NETINET_IN_H
|
|
#include <netinet/in.h>
|
|
#endif
|
|
],[struct sockaddr_storage sa;],
|
|
[apr_cv_define_sockaddr_storage=yes],
|
|
[apr_cv_define_sockaddr_storage=no])])
|
|
|
|
if test "$apr_cv_define_sockaddr_storage" = "yes"; then
|
|
have_sa_storage=1
|
|
else
|
|
have_sa_storage=0
|
|
fi
|
|
AC_SUBST(have_sa_storage)
|
|
])
|
|
|
|
dnl Check for presence of struct sockaddr_in6.
|
|
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 <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_NETINET_IN_H
|
|
#include <netinet/in.h>
|
|
#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 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 <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_NETDB_H
|
|
#include <netdb.h>
|
|
#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_SCTP
|
|
dnl
|
|
dnl check for presence of SCTP protocol support
|
|
dnl
|
|
AC_DEFUN([APR_CHECK_SCTP],
|
|
[
|
|
AC_CACHE_CHECK([whether SCTP is supported], [apr_cv_sctp], [
|
|
AC_TRY_RUN([
|
|
#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_SCTP_H
|
|
#include <netinet/sctp.h>
|
|
#endif
|
|
#ifdef HAVE_NETINET_SCTP_UIO_H
|
|
#include <netinet/sctp_uio.h>
|
|
#endif
|
|
#include <stdlib.h>
|
|
int main(void) {
|
|
int s, opt = 1;
|
|
if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)) < 0)
|
|
exit(1);
|
|
if (setsockopt(s, IPPROTO_SCTP, SCTP_NODELAY, &opt, sizeof(int)) < 0)
|
|
exit(2);
|
|
exit(0);
|
|
}], [apr_cv_sctp=yes], [apr_cv_sctp=no], [apr_cv_sctp=no])])
|
|
|
|
if test "$apr_cv_sctp" = "yes"; then
|
|
have_sctp=1
|
|
else
|
|
have_sctp=0
|
|
fi
|
|
])
|
|
|
|
dnl APR_CHECK_MCAST: check for multicast interfaces
|
|
AC_DEFUN([APR_CHECK_MCAST], [
|
|
AC_CACHE_CHECK([for struct ip_mreq], [apr_cv_struct_ipmreq], [
|
|
AC_TRY_COMPILE([
|
|
#include <sys/types.h>
|
|
#include <netinet/in.h>
|
|
], [
|
|
struct ip_mreq mip;
|
|
mip.imr_interface.s_addr = INADDR_ANY;
|
|
], [apr_cv_struct_ipmreq=yes], [apr_cv_struct_ipmreq=no], [apr_cv_struct_ipmreq=yes])])
|
|
|
|
if test $apr_cv_struct_ipmreq = yes; then
|
|
AC_DEFINE([HAVE_STRUCT_IPMREQ], 1, [Define if struct impreq was found])
|
|
fi
|
|
])
|
|
|
|
dnl
|
|
dnl APR_CHECK_H_ERRNO_FLAG
|
|
dnl
|
|
dnl checks which flags are necessary for <netdb.h> 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)
|
|
])
|
|
|