Annotation of embedaddon/curl/lib/nonblock.c, revision 1.1.1.1
1.1 misho 1: /***************************************************************************
2: * _ _ ____ _
3: * Project ___| | | | _ \| |
4: * / __| | | | |_) | |
5: * | (__| |_| | _ <| |___
6: * \___|\___/|_| \_\_____|
7: *
8: * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
9: *
10: * This software is licensed as described in the file COPYING, which
11: * you should have received as part of this distribution. The terms
12: * are also available at https://curl.haxx.se/docs/copyright.html.
13: *
14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15: * copies of the Software, and permit persons to whom the Software is
16: * furnished to do so, under the terms of the COPYING file.
17: *
18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19: * KIND, either express or implied.
20: *
21: ***************************************************************************/
22:
23: #include "curl_setup.h"
24:
25: #ifdef HAVE_SYS_IOCTL_H
26: #include <sys/ioctl.h>
27: #endif
28: #ifdef HAVE_FCNTL_H
29: #include <fcntl.h>
30: #endif
31:
32: #if (defined(HAVE_IOCTL_FIONBIO) && defined(NETWARE))
33: #include <sys/filio.h>
34: #endif
35: #ifdef __VMS
36: #include <in.h>
37: #include <inet.h>
38: #endif
39:
40: #include "nonblock.h"
41:
42: /*
43: * curlx_nonblock() set the given socket to either blocking or non-blocking
44: * mode based on the 'nonblock' boolean argument. This function is highly
45: * portable.
46: */
47: int curlx_nonblock(curl_socket_t sockfd, /* operate on this */
48: int nonblock /* TRUE or FALSE */)
49: {
50: #if defined(USE_BLOCKING_SOCKETS)
51: (void)sockfd;
52: (void)nonblock;
53: return 0; /* returns success */
54:
55: #elif defined(HAVE_FCNTL_O_NONBLOCK)
56:
57: /* most recent unix versions */
58: int flags;
59: flags = sfcntl(sockfd, F_GETFL, 0);
60: if(nonblock)
61: return sfcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
62: return sfcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
63:
64: #elif defined(HAVE_IOCTL_FIONBIO)
65:
66: /* older unix versions */
67: int flags = nonblock ? 1 : 0;
68: return ioctl(sockfd, FIONBIO, &flags);
69:
70: #elif defined(HAVE_IOCTLSOCKET_FIONBIO)
71:
72: /* Windows */
73: unsigned long flags = nonblock ? 1UL : 0UL;
74: return ioctlsocket(sockfd, FIONBIO, &flags);
75:
76: #elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO)
77:
78: /* Amiga */
79: long flags = nonblock ? 1L : 0L;
80: return IoctlSocket(sockfd, FIONBIO, (char *)&flags);
81:
82: #elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK)
83:
84: /* BeOS */
85: long b = nonblock ? 1L : 0L;
86: return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
87:
88: #else
89: # error "no non-blocking method was found/used/set"
90: #endif
91: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>