mirror of
https://github.com/curl/curl.git
synced 2025-09-19 02:22:47 +03:00
configure: check for __builtin_available() availability (#1788)
This change does two things: 1. It un-breaks the build in Xcode 9.0. (Xcode 9.0 is currently failing trying to compile connectx() in lib/connect.c.) 2. It finally weak-links the connectx() function, and falls back on connect() when run on older operating systems.
This commit is contained in:
parent
ca9630f128
commit
870d849d48
26
acinclude.m4
Normal file → Executable file
26
acinclude.m4
Normal file → Executable file
|
@ -3243,3 +3243,29 @@ AC_DEFUN([CURL_MAC_CFLAGS], [
|
||||||
fi
|
fi
|
||||||
|
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_SUPPORTS_BUILTIN_AVAILABLE
|
||||||
|
dnl
|
||||||
|
dnl Check to see if the compiler supports __builtin_available. This built-in
|
||||||
|
dnl compiler function first appeared in Apple LLVM 9.0.0. It's so new that, at
|
||||||
|
dnl the time this macro was written, the function was not yet documented. Its
|
||||||
|
dnl purpose is to return true if the code is running under a certain OS version
|
||||||
|
dnl or later.
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_SUPPORTS_BUILTIN_AVAILABLE], [
|
||||||
|
AC_MSG_CHECKING([to see if the compiler supports __builtin_available()])
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([[
|
||||||
|
#include <stdlib.h>
|
||||||
|
]],[[
|
||||||
|
if (__builtin_available(macOS 10.8, iOS 5.0, *)) {}
|
||||||
|
]])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_BUILTIN_AVAILABLE, 1,
|
||||||
|
[Define to 1 if you have the __builtin_available function.])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
1
configure.ac
Normal file → Executable file
1
configure.ac
Normal file → Executable file
|
@ -354,6 +354,7 @@ esac
|
||||||
CURL_CHECK_WIN32_LARGEFILE
|
CURL_CHECK_WIN32_LARGEFILE
|
||||||
|
|
||||||
CURL_MAC_CFLAGS
|
CURL_MAC_CFLAGS
|
||||||
|
CURL_SUPPORTS_BUILTIN_AVAILABLE
|
||||||
|
|
||||||
dnl ************************************************************
|
dnl ************************************************************
|
||||||
dnl switch off particular protocols
|
dnl switch off particular protocols
|
||||||
|
|
27
lib/connect.c
Normal file → Executable file
27
lib/connect.c
Normal file → Executable file
|
@ -1059,16 +1059,25 @@ static CURLcode singleipconnect(struct connectdata *conn,
|
||||||
if(!isconnected && (conn->socktype == SOCK_STREAM)) {
|
if(!isconnected && (conn->socktype == SOCK_STREAM)) {
|
||||||
if(conn->bits.tcp_fastopen) {
|
if(conn->bits.tcp_fastopen) {
|
||||||
#if defined(CONNECT_DATA_IDEMPOTENT) /* OS X */
|
#if defined(CONNECT_DATA_IDEMPOTENT) /* OS X */
|
||||||
sa_endpoints_t endpoints;
|
#ifdef HAVE_BUILTIN_AVAILABLE
|
||||||
endpoints.sae_srcif = 0;
|
if(__builtin_available(macOS 10.11, iOS 9.0, tvOS 9.0, watchOS 2.0, *)) {
|
||||||
endpoints.sae_srcaddr = NULL;
|
#endif /* HAVE_BUILTIN_AVAILABLE */
|
||||||
endpoints.sae_srcaddrlen = 0;
|
sa_endpoints_t endpoints;
|
||||||
endpoints.sae_dstaddr = &addr.sa_addr;
|
endpoints.sae_srcif = 0;
|
||||||
endpoints.sae_dstaddrlen = addr.addrlen;
|
endpoints.sae_srcaddr = NULL;
|
||||||
|
endpoints.sae_srcaddrlen = 0;
|
||||||
|
endpoints.sae_dstaddr = &addr.sa_addr;
|
||||||
|
endpoints.sae_dstaddrlen = addr.addrlen;
|
||||||
|
|
||||||
rc = connectx(sockfd, &endpoints, SAE_ASSOCID_ANY,
|
rc = connectx(sockfd, &endpoints, SAE_ASSOCID_ANY,
|
||||||
CONNECT_RESUME_ON_READ_WRITE | CONNECT_DATA_IDEMPOTENT,
|
CONNECT_RESUME_ON_READ_WRITE | CONNECT_DATA_IDEMPOTENT,
|
||||||
NULL, 0, NULL, NULL);
|
NULL, 0, NULL, NULL);
|
||||||
|
#ifdef HAVE_BUILTIN_AVAILABLE
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
|
||||||
|
}
|
||||||
|
#endif /* HAVE_BUILTIN_AVAILABLE */
|
||||||
#elif defined(MSG_FASTOPEN) /* Linux */
|
#elif defined(MSG_FASTOPEN) /* Linux */
|
||||||
if(conn->given->flags & PROTOPT_SSL)
|
if(conn->given->flags & PROTOPT_SSL)
|
||||||
rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
|
rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user