Bitcoin Core 30.99.0
P2P Digital Currency
syserror.cpp
Go to the documentation of this file.
1// Copyright (c) 2020-2022 The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <bitcoin-build-config.h> // IWYU pragma: keep
6
7#include <tinyformat.h>
8#include <util/syserror.h>
9
10#include <cstring>
11#include <string>
12
13#if defined(WIN32)
14#include <windows.h>
15#endif
16
17std::string SysErrorString(int err)
18{
19 char buf[1024];
20 /* Too bad there are three incompatible implementations of the
21 * thread-safe strerror. */
22 const char *s = nullptr;
23#ifdef WIN32
24 if (strerror_s(buf, sizeof(buf), err) == 0) s = buf;
25#else
26#ifdef STRERROR_R_CHAR_P /* GNU variant can return a pointer outside the passed buffer */
27 s = strerror_r(err, buf, sizeof(buf));
28#else /* POSIX variant always returns message in buffer */
29 if (strerror_r(err, buf, sizeof(buf)) == 0) s = buf;
30#endif
31#endif
32 if (s != nullptr) {
33 return strprintf("%s (%d)", s, err);
34 } else {
35 return strprintf("Unknown error (%d)", err);
36 }
37}
38
39#if defined(WIN32)
40std::string Win32ErrorString(int err)
41{
42 char buf[256];
43 buf[0] = 0;
44 if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK,
45 nullptr, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
46 buf, ARRAYSIZE(buf), nullptr)) {
47 return strprintf("%s (%d)", buf, err);
48 } else {
49 return strprintf("Unknown error (%d)", err);
50 }
51}
52#endif
std::string SysErrorString(int err)
Return system error string from errno value.
Definition: syserror.cpp:17
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1172