Bitcoin Core  0.20.99
P2P Digital Currency
compat.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2018 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #ifndef BITCOIN_COMPAT_H
7 #define BITCOIN_COMPAT_H
8 
9 #if defined(HAVE_CONFIG_H)
10 #include <config/bitcoin-config.h>
11 #endif
12 
13 #ifdef WIN32
14 #ifndef NOMINMAX
15 #define NOMINMAX
16 #endif
17 #ifdef FD_SETSIZE
18 #undef FD_SETSIZE // prevent redefinition compiler warning
19 #endif
20 #define FD_SETSIZE 1024 // max number of fds in fd_set
21 
22 #include <winsock2.h> // Must be included before mswsock.h and windows.h
23 
24 #include <mswsock.h>
25 #include <windows.h>
26 #include <ws2tcpip.h>
27 #include <stdint.h>
28 #else
29 #include <fcntl.h>
30 #include <sys/mman.h>
31 #include <sys/select.h>
32 #include <sys/socket.h>
33 #include <sys/types.h>
34 #include <net/if.h>
35 #include <netinet/in.h>
36 #include <netinet/tcp.h>
37 #include <arpa/inet.h>
38 #include <ifaddrs.h>
39 #include <limits.h>
40 #include <netdb.h>
41 #include <unistd.h>
42 #endif
43 
44 #ifndef WIN32
45 typedef unsigned int SOCKET;
46 #include <errno.h>
47 #define WSAGetLastError() errno
48 #define WSAEINVAL EINVAL
49 #define WSAEALREADY EALREADY
50 #define WSAEWOULDBLOCK EWOULDBLOCK
51 #define WSAEMSGSIZE EMSGSIZE
52 #define WSAEINTR EINTR
53 #define WSAEINPROGRESS EINPROGRESS
54 #define WSAEADDRINUSE EADDRINUSE
55 #define WSAENOTSOCK EBADF
56 #define INVALID_SOCKET (SOCKET)(~0)
57 #define SOCKET_ERROR -1
58 #endif
59 
60 #ifdef WIN32
61 #ifndef S_IRUSR
62 #define S_IRUSR 0400
63 #define S_IWUSR 0200
64 #endif
65 #else
66 #define MAX_PATH 1024
67 #endif
68 #ifdef _MSC_VER
69 #if !defined(ssize_t)
70 #ifdef _WIN64
71 typedef int64_t ssize_t;
72 #else
73 typedef int32_t ssize_t;
74 #endif
75 #endif
76 #endif
77 
78 #if HAVE_DECL_STRNLEN == 0
79 size_t strnlen( const char *start, size_t max_len);
80 #endif // HAVE_DECL_STRNLEN
81 
82 #ifndef WIN32
83 typedef void* sockopt_arg_type;
84 #else
85 typedef char* sockopt_arg_type;
86 #endif
87 
88 // Note these both should work with the current usage of poll, but best to be safe
89 // WIN32 poll is broken https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/
90 // __APPLE__ poll is broke https://github.com/bitcoin/bitcoin/pull/14336#issuecomment-437384408
91 #if defined(__linux__)
92 #define USE_POLL
93 #endif
94 
95 bool static inline IsSelectableSocket(const SOCKET& s) {
96 #if defined(USE_POLL) || defined(WIN32)
97  return true;
98 #else
99  return (s < FD_SETSIZE);
100 #endif
101 }
102 
103 #endif // BITCOIN_COMPAT_H
static bool IsSelectableSocket(const SOCKET &s)
Definition: compat.h:95
void * sockopt_arg_type
Definition: compat.h:83
unsigned int SOCKET
Definition: compat.h:45
size_t strnlen(const char *start, size_t max_len)
Definition: strnlen.cpp:12