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