diff options
author | Nick Zitzmann <nickzman@gmail.com> | 2017-08-16 12:24:39 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-16 12:24:39 -0500 |
commit | 870d849d48a26b8eeb0d4bb1f4655367a4a191ca (patch) | |
tree | 48415a008b75a845d0dc8f03c71b66fa4e59d299 | |
parent | ca9630f12843f0bb0baa3ae78491e07431ccf5de (diff) |
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.
-rwxr-xr-x[-rw-r--r--] | acinclude.m4 | 26 | ||||
-rwxr-xr-x[-rw-r--r--] | configure.ac | 1 | ||||
-rwxr-xr-x[-rw-r--r--] | lib/connect.c | 29 |
3 files changed, 46 insertions, 10 deletions
diff --git a/acinclude.m4 b/acinclude.m4 index 539322870..dd5d896bc 100644..100755 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -3243,3 +3243,29 @@ AC_DEFUN([CURL_MAC_CFLAGS], [ 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]) + ]) +]) diff --git a/configure.ac b/configure.ac index edebfc77b..605abc3fd 100644..100755 --- a/configure.ac +++ b/configure.ac @@ -354,6 +354,7 @@ esac CURL_CHECK_WIN32_LARGEFILE CURL_MAC_CFLAGS +CURL_SUPPORTS_BUILTIN_AVAILABLE dnl ************************************************************ dnl switch off particular protocols diff --git a/lib/connect.c b/lib/connect.c index 8d5d32ba6..927ff7cec 100644..100755 --- a/lib/connect.c +++ b/lib/connect.c @@ -1059,16 +1059,25 @@ static CURLcode singleipconnect(struct connectdata *conn, if(!isconnected && (conn->socktype == SOCK_STREAM)) { if(conn->bits.tcp_fastopen) { #if defined(CONNECT_DATA_IDEMPOTENT) /* OS X */ - sa_endpoints_t endpoints; - endpoints.sae_srcif = 0; - 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, - CONNECT_RESUME_ON_READ_WRITE | CONNECT_DATA_IDEMPOTENT, - NULL, 0, NULL, NULL); +#ifdef HAVE_BUILTIN_AVAILABLE + if(__builtin_available(macOS 10.11, iOS 9.0, tvOS 9.0, watchOS 2.0, *)) { +#endif /* HAVE_BUILTIN_AVAILABLE */ + sa_endpoints_t endpoints; + endpoints.sae_srcif = 0; + 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, + CONNECT_RESUME_ON_READ_WRITE | CONNECT_DATA_IDEMPOTENT, + 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 */ if(conn->given->flags & PROTOPT_SSL) rc = connect(sockfd, &addr.sa_addr, addr.addrlen); |