Coverage Report

Created: 2024-09-19 18:47

/root/bitcoin/src/compat/compat.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-2022 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 <ifaddrs.h>     // IWYU pragma: export
24
#include <net/if.h>      // IWYU pragma: export
25
#include <netdb.h>       // IWYU pragma: export
26
#include <netinet/in.h>  // IWYU pragma: export
27
#include <netinet/tcp.h> // IWYU pragma: export
28
#include <sys/mman.h>    // IWYU pragma: export
29
#include <sys/select.h>  // IWYU pragma: export
30
#include <sys/socket.h>  // IWYU pragma: export
31
#include <sys/types.h>   // IWYU pragma: export
32
#include <unistd.h>      // IWYU pragma: export
33
#endif
34
35
// Windows does not have `sa_family_t` - it defines `sockaddr::sa_family` as `u_short`.
36
// Thus define `sa_family_t` on Windows too so that the rest of the code can use `sa_family_t`.
37
// See https://learn.microsoft.com/en-us/windows/win32/api/winsock/ns-winsock-sockaddr#syntax
38
#ifdef WIN32
39
typedef u_short sa_family_t;
40
#endif
41
42
// We map Linux / BSD error functions and codes, to the equivalent
43
// Windows definitions, and use the WSA* names throughout our code.
44
// Note that glibc defines EWOULDBLOCK as EAGAIN (see errno.h).
45
#ifndef WIN32
46
typedef unsigned int SOCKET;
47
#include <cerrno>
48
0
#define WSAGetLastError()   errno
49
0
#define WSAEINVAL           EINVAL
50
0
#define WSAEWOULDBLOCK      EWOULDBLOCK
51
0
#define WSAEAGAIN           EAGAIN
52
0
#define WSAEMSGSIZE         EMSGSIZE
53
0
#define WSAEINTR            EINTR
54
0
#define WSAEINPROGRESS      EINPROGRESS
55
0
#define WSAEADDRINUSE       EADDRINUSE
56
0
#define INVALID_SOCKET      (SOCKET)(~0)
57
0
#define SOCKET_ERROR        -1
58
#else
59
// WSAEAGAIN doesn't exist on Windows
60
#ifdef EAGAIN
61
#define WSAEAGAIN EAGAIN
62
#else
63
#define WSAEAGAIN WSAEWOULDBLOCK
64
#endif
65
#endif
66
67
// Windows defines MAX_PATH as it's maximum path length.
68
// We define MAX_PATH for use on non-Windows systems.
69
#ifndef WIN32
70
#define MAX_PATH            1024
71
#endif
72
73
// ssize_t is POSIX, and not present when using MSVC.
74
#ifdef _MSC_VER
75
#include <BaseTsd.h>
76
typedef SSIZE_T ssize_t;
77
#endif
78
79
// The type of the option value passed to getsockopt & setsockopt
80
// differs between Windows and non-Windows.
81
#ifndef WIN32
82
typedef void* sockopt_arg_type;
83
#else
84
typedef char* sockopt_arg_type;
85
#endif
86
87
#ifdef WIN32
88
// Export main() and ensure working ASLR when using mingw-w64.
89
// Exporting a symbol will prevent the linker from stripping
90
// the .reloc section from the binary, which is a requirement
91
// for ASLR. While release builds are not affected, anyone
92
// building with a binutils < 2.36 is subject to this ld bug.
93
#define MAIN_FUNCTION __declspec(dllexport) int main(int argc, char* argv[])
94
#else
95
#define MAIN_FUNCTION int main(int argc, char* argv[])
96
#endif
97
98
// Note these both should work with the current usage of poll, but best to be safe
99
// WIN32 poll is broken https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/
100
// __APPLE__ poll is broke https://github.com/bitcoin/bitcoin/pull/14336#issuecomment-437384408
101
#if defined(__linux__)
102
#define USE_POLL
103
#endif
104
105
// MSG_NOSIGNAL is not available on some platforms, if it doesn't exist define it as 0
106
#if !defined(MSG_NOSIGNAL)
107
#define MSG_NOSIGNAL 0
108
#endif
109
110
// MSG_DONTWAIT is not available on some platforms, if it doesn't exist define it as 0
111
#if !defined(MSG_DONTWAIT)
112
#define MSG_DONTWAIT 0
113
#endif
114
115
#endif // BITCOIN_COMPAT_COMPAT_H