| include(CheckCSourceCompiles) |
| |
| # - check_nonblocking_socket_support() |
| # |
| # Check for how to set a socket to non-blocking state. There seems to exist |
| # four known different ways, with the one used almost everywhere being POSIX |
| # and XPG3, while the other different ways for different systems (old BSD, |
| # Windows and Amiga). |
| # |
| # One of the following variables will be set indicating the supported |
| # method (if any): |
| # HAVE_O_NONBLOCK |
| # HAVE_FIONBIO |
| # HAVE_IOCTLSOCKET |
| # HAVE_IOCTLSOCKET_CASE |
| # HAVE_SO_NONBLOCK |
| # HAVE_DISABLED_NONBLOCKING |
| # |
| # The following variables may be set before calling this macro to |
| # modify the way the check is run: |
| # |
| # CMAKE_REQUIRED_FLAGS = string of compile command line flags |
| # CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) |
| # CMAKE_REQUIRED_INCLUDES = list of include directories |
| # CMAKE_REQUIRED_LIBRARIES = list of libraries to link |
| # |
| macro(check_nonblocking_socket_support) |
| # There are two known platforms (AIX 3.x and SunOS 4.1.x) where the |
| # O_NONBLOCK define is found but does not work. |
| check_c_source_compiles(" |
| #include <sys/types.h> |
| #include <unistd.h> |
| #include <fcntl.h> |
| |
| #if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) |
| # if defined(__SVR4) || defined(__srv4__) |
| # define PLATFORM_SOLARIS |
| # else |
| # define PLATFORM_SUNOS4 |
| # endif |
| #endif |
| #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41) |
| # define PLATFORM_AIX_V3 |
| #endif |
| |
| #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__) |
| #error \"O_NONBLOCK does not work on this platform\" |
| #endif |
| |
| int main() |
| { |
| int socket; |
| int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK); |
| }" |
| HAVE_O_NONBLOCK) |
| |
| if(NOT HAVE_O_NONBLOCK) |
| check_c_source_compiles("/* FIONBIO test (old-style unix) */ |
| #include <unistd.h> |
| #include <stropts.h> |
| |
| int main() |
| { |
| int socket; |
| int flags = ioctl(socket, FIONBIO, &flags); |
| }" |
| HAVE_FIONBIO) |
| |
| if(NOT HAVE_FIONBIO) |
| check_c_source_compiles("/* ioctlsocket test (Windows) */ |
| #undef inline |
| #ifndef WIN32_LEAN_AND_MEAN |
| #define WIN32_LEAN_AND_MEAN |
| #endif |
| |
| #include <windows.h> |
| #include <winsock2.h> |
| |
| int main() |
| { |
| SOCKET sd; |
| unsigned long flags = 0; |
| sd = socket(0, 0, 0); |
| ioctlsocket(sd, FIONBIO, &flags); |
| }" |
| HAVE_IOCTLSOCKET) |
| |
| if(NOT HAVE_IOCTLSOCKET) |
| check_c_source_compiles("/* IoctlSocket test (Amiga?) */ |
| #include <sys/ioctl.h> |
| |
| int main() |
| { |
| int socket; |
| int flags = IoctlSocket(socket, FIONBIO, (long)1); |
| }" |
| HAVE_IOCTLSOCKET_CASE) |
| |
| if(NOT HAVE_IOCTLSOCKET_CASE) |
| check_c_source_compiles("/* SO_NONBLOCK test (BeOS) */ |
| #include <socket.h> |
| |
| int main() |
| { |
| long b = 1; |
| int socket; |
| int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); |
| }" |
| HAVE_SO_NONBLOCK) |
| |
| if(NOT HAVE_SO_NONBLOCK) |
| # No non-blocking socket method found |
| set(HAVE_DISABLED_NONBLOCKING 1) |
| endif() |
| endif() |
| endif() |
| endif() |
| endif() |
| endmacro() |