text: /***************************************************************************
   *                                  _   _ ____  _
   *  Project                     ___| | | |  _ \| |
   *                             / __| | | | |_) | |
   *                            | (__| |_| |  _ <| |___
   *                             \___|\___/|_| \_\_____|
   *
   * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
   *
   * This software is licensed as described in the file COPYING, which
   * you should have received as part of this distribution. The terms
   * are also available at http://curl.haxx.se/docs/copyright.html.
   *
   * You may opt to use, copy, modify, merge, publish, distribute and/or sell
   * copies of the Software, and permit persons to whom the Software is
   * furnished to do so, under the terms of the COPYING file.
   *
   * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
   * KIND, either express or implied.
   *
   ***************************************************************************/
  
  #include "setup.h"
  
  #ifdef HAVE_SYS_SOCKET_H
  #include <sys/socket.h>
  #endif
  #ifdef HAVE_SYS_IOCTL_H
  #include <sys/ioctl.h>
  #endif
  #ifdef HAVE_UNISTD_H
  #include <unistd.h>
  #endif
  #ifdef HAVE_FCNTL_H
  #include <fcntl.h>
  #endif
  #ifdef HAVE_STDLIB_H
  #include <stdlib.h>
  #endif
  
  #if (defined(HAVE_IOCTL_FIONBIO) && defined(NETWARE))
  #include <sys/filio.h>
  #endif
  #ifdef __VMS
  #include <in.h>
  #include <inet.h>
  #endif
  
  #include "nonblock.h"
  
  /*
   * curlx_nonblock() set the given socket to either blocking or non-blocking
   * mode based on the 'nonblock' boolean argument. This function is highly
   * portable.
   */
  int curlx_nonblock(curl_socket_t sockfd,    /* operate on this */
                     int nonblock   /* TRUE or FALSE */)
  {
  #if defined(USE_BLOCKING_SOCKETS)
  
    return 0; /* returns success */
  
  #elif defined(HAVE_FCNTL_O_NONBLOCK)
  
    /* most recent unix versions */
    int flags;
    flags = fcntl(sockfd, F_GETFL, 0);
    if(FALSE != nonblock)
      return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
    else
      return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
  
  #elif defined(HAVE_IOCTL_FIONBIO)
  
    /* older unix versions */
    int flags;
    flags = nonblock;
    return ioctl(sockfd, FIONBIO, &flags);
  
  #elif defined(HAVE_IOCTLSOCKET_FIONBIO)
  
    /* Windows */
    unsigned long flags;
    flags = nonblock;
    return ioctlsocket(sockfd, FIONBIO, &flags);
  
  #elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO)
  
    /* Amiga */
    return IoctlSocket(sockfd, FIONBIO, (long)nonblock);
  
  #elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK)
  
    /* BeOS */
    long b = nonblock ? 1 : 0;
    return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
  
  #else
  #  error "no non-blocking method was found/used/set"
  #endif
  }
  