15ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/*************************************************************************** 25ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * _ _ ____ _ 35ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Project ___| | | | _ \| | 45ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * / __| | | | |_) | | 55ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * | (__| |_| | _ <| |___ 65ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * \___|\___/|_| \_\_____| 75ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al. 95ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is licensed as described in the file COPYING, which 115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * you should have received as part of this distribution. The terms 125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * are also available at http://curl.haxx.se/docs/copyright.html. 135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * You may opt to use, copy, modify, merge, publish, distribute and/or sell 155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * copies of the Software, and permit persons to whom the Software is 165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * furnished to do so, under the terms of the COPYING file. 175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * KIND, either express or implied. 205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ***************************************************************************/ 225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 23e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "curl_setup.h" 245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_SYS_IOCTL_H 265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <sys/ioctl.h> 275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef HAVE_FCNTL_H 295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <fcntl.h> 305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if (defined(HAVE_IOCTL_FIONBIO) && defined(NETWARE)) 335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <sys/filio.h> 345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef __VMS 365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <in.h> 375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <inet.h> 385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "nonblock.h" 415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * curlx_nonblock() set the given socket to either blocking or non-blocking 445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * mode based on the 'nonblock' boolean argument. This function is highly 455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * portable. 465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenint curlx_nonblock(curl_socket_t sockfd, /* operate on this */ 485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int nonblock /* TRUE or FALSE */) 495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#if defined(USE_BLOCKING_SOCKETS) 515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return 0; /* returns success */ 535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#elif defined(HAVE_FCNTL_O_NONBLOCK) 555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* most recent unix versions */ 575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen int flags; 58e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET flags = sfcntl(sockfd, F_GETFL, 0); 59e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(nonblock) 60e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return sfcntl(sockfd, F_SETFL, flags | O_NONBLOCK); 615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen else 62e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return sfcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); 635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#elif defined(HAVE_IOCTL_FIONBIO) 655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* older unix versions */ 67e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET int flags = nonblock ? 1 : 0; 685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return ioctl(sockfd, FIONBIO, &flags); 695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#elif defined(HAVE_IOCTLSOCKET_FIONBIO) 715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* Windows */ 73e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET unsigned long flags = nonblock ? 1UL : 0UL; 745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return ioctlsocket(sockfd, FIONBIO, &flags); 755ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 765ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO) 775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* Amiga */ 79e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET long flags = nonblock ? 1L : 0L; 80e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return IoctlSocket(sockfd, FIONBIO, flags); 815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 825ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK) 835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* BeOS */ 85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET long b = nonblock ? 1L : 0L; 865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b)); 875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#else 895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen# error "no non-blocking method was found/used/set" 905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 915ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 92