Commit 870d849d authored by Nick Zitzmann's avatar Nick Zitzmann Committed by GitHub
Browse files

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.
parent ca9630f1
Loading
Loading
Loading
Loading

acinclude.m4

100644 → 100755
+26 −0
Original line number Diff line number Diff line
@@ -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])
  ])
])

configure.ac

100644 → 100755
+1 −0
Original line number Diff line number Diff line
@@ -354,6 +354,7 @@ esac
CURL_CHECK_WIN32_LARGEFILE

CURL_MAC_CFLAGS
CURL_SUPPORTS_BUILTIN_AVAILABLE

dnl ************************************************************
dnl switch off particular protocols

lib/connect.c

100644 → 100755
+19 −10
Original line number Diff line number Diff line
@@ -1059,6 +1059,9 @@ static CURLcode singleipconnect(struct connectdata *conn,
  if(!isconnected && (conn->socktype == SOCK_STREAM)) {
    if(conn->bits.tcp_fastopen) {
#if defined(CONNECT_DATA_IDEMPOTENT) /* OS X */
#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;
@@ -1069,6 +1072,12 @@ static CURLcode singleipconnect(struct connectdata *conn,
        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);