Bitcoin Core
30.99.0
P2P Digital Currency
src
compat
compat.h
Go to the documentation of this file.
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-present 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_COMPAT_H
7
#define BITCOIN_COMPAT_COMPAT_H
8
9
// Windows defines FD_SETSIZE to 64 (see _fd_types.h in mingw-w64),
10
// which is too small for our usage, but allows us to redefine it safely.
11
// We redefine it to be 1024, to match glibc, see typesizes.h.
12
#ifdef WIN32
13
#ifdef FD_SETSIZE
14
#undef FD_SETSIZE
15
#endif
16
#define FD_SETSIZE 1024
17
#include <winsock2.h>
18
#include <ws2tcpip.h>
19
#include <cstdint>
20
#else
21
#include <arpa/inet.h>
// IWYU pragma: export
22
#include <fcntl.h>
// IWYU pragma: export
23
#include <net/if.h>
// IWYU pragma: export
24
#include <netdb.h>
// IWYU pragma: export
25
#include <netinet/in.h>
// IWYU pragma: export
26
#include <netinet/tcp.h>
// IWYU pragma: export
27
#include <sys/mman.h>
// IWYU pragma: export
28
#include <sys/select.h>
// IWYU pragma: export
29
#include <sys/socket.h>
// IWYU pragma: export
30
#include <sys/types.h>
// IWYU pragma: export
31
#include <unistd.h>
// IWYU pragma: export
32
#endif
33
34
// Windows does not have `sa_family_t` - it defines `sockaddr::sa_family` as `u_short`.
35
// Thus define `sa_family_t` on Windows too so that the rest of the code can use `sa_family_t`.
36
// See https://learn.microsoft.com/en-us/windows/win32/api/winsock/ns-winsock-sockaddr#syntax
37
#ifdef WIN32
38
typedef
u_short sa_family_t;
39
#endif
40
41
// Brace style in the IN6ADDR_*_INIT macros differs across platforms.
42
#if defined(__illumos__)
43
#define COMPAT_IN6ADDR_ANY_INIT {{IN6ADDR_ANY_INIT}}
44
#else
45
#define COMPAT_IN6ADDR_ANY_INIT IN6ADDR_ANY_INIT
46
#endif
47
#if defined(__illumos__) || defined(_MSC_VER)
48
#define COMPAT_IN6ADDR_LOOPBACK_INIT {{IN6ADDR_LOOPBACK_INIT}}
49
#else
50
#define COMPAT_IN6ADDR_LOOPBACK_INIT IN6ADDR_LOOPBACK_INIT
51
#endif
52
53
// We map Linux / BSD error functions and codes, to the equivalent
54
// Windows definitions, and use the WSA* names throughout our code.
55
// Note that glibc defines EWOULDBLOCK as EAGAIN (see errno.h).
56
#ifndef WIN32
57
typedef
unsigned
int
SOCKET
;
58
#include <cerrno>
59
#define WSAGetLastError() errno
60
#define WSAEINVAL EINVAL
61
#define WSAEWOULDBLOCK EWOULDBLOCK
62
#define WSAEAGAIN EAGAIN
63
#define WSAEMSGSIZE EMSGSIZE
64
#define WSAEINTR EINTR
65
#define WSAEINPROGRESS EINPROGRESS
66
#define WSAEADDRINUSE EADDRINUSE
67
#define INVALID_SOCKET (SOCKET)(~0)
68
#define SOCKET_ERROR -1
69
#else
70
// WSAEAGAIN doesn't exist on Windows
71
#ifdef EAGAIN
72
#define WSAEAGAIN EAGAIN
73
#else
74
#define WSAEAGAIN WSAEWOULDBLOCK
75
#endif
76
#endif
77
78
// Windows defines MAX_PATH as it's maximum path length.
79
// We define MAX_PATH for use on non-Windows systems.
80
#ifndef WIN32
81
#define MAX_PATH 1024
82
#endif
83
84
// ssize_t is POSIX, and not present when using MSVC.
85
#ifdef _MSC_VER
86
#include <BaseTsd.h>
87
typedef
SSIZE_T ssize_t;
88
#endif
89
90
#ifdef WIN32
91
// Export main() and ensure working ASLR when using mingw-w64.
92
// Exporting a symbol will prevent the linker from stripping
93
// the .reloc section from the binary, which is a requirement
94
// for ASLR. While release builds are not affected, anyone
95
// building with a binutils < 2.36 is subject to this ld bug.
96
#define MAIN_FUNCTION __declspec(dllexport) int main(int argc, char* argv[])
97
#else
98
#define MAIN_FUNCTION int main(int argc, char* argv[])
99
#endif
100
101
// Note these both should work with the current usage of poll, but best to be safe
102
// WIN32 poll is broken https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/
103
// __APPLE__ poll is broke https://github.com/bitcoin/bitcoin/pull/14336#issuecomment-437384408
104
#if defined(__linux__)
105
#define USE_POLL
106
#endif
107
108
// MSG_NOSIGNAL is not available on some platforms, if it doesn't exist define it as 0
109
#if !defined(MSG_NOSIGNAL)
110
#define MSG_NOSIGNAL 0
111
#endif
112
113
// MSG_DONTWAIT is not available on some platforms, if it doesn't exist define it as 0
114
#if !defined(MSG_DONTWAIT)
115
#define MSG_DONTWAIT 0
116
#endif
117
118
#endif
// BITCOIN_COMPAT_COMPAT_H
SOCKET
unsigned int SOCKET
Definition:
compat.h:57
Generated on Sat Jan 31 2026 20:00:29 for Bitcoin Core by
1.9.4