| | |
| | |
| | |
| |
|
| | #include <cstddef> |
| | #ifdef _WIN32 |
| | #include <windows.h> |
| | #else |
| | #include <cerrno> |
| | #include <cstring> |
| | #endif |
| |
|
| | #include "common/error.h" |
| |
|
| | namespace Common { |
| |
|
| | std::string NativeErrorToString(int e) { |
| | #ifdef _WIN32 |
| | LPSTR err_str; |
| |
|
| | DWORD res = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | |
| | FORMAT_MESSAGE_IGNORE_INSERTS, |
| | nullptr, e, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), |
| | reinterpret_cast<LPSTR>(&err_str), 1, nullptr); |
| | if (!res) { |
| | return "(FormatMessageA failed to format error)"; |
| | } |
| | std::string ret(err_str); |
| | LocalFree(err_str); |
| | return ret; |
| | #else |
| | char err_str[255]; |
| | #if defined(ANDROID) || \ |
| | (defined(__GLIBC__) && (_GNU_SOURCE || (_POSIX_C_SOURCE < 200112L && _XOPEN_SOURCE < 600))) |
| | |
| | const char* str = strerror_r(e, err_str, sizeof(err_str)); |
| | return std::string(str); |
| | #else |
| | |
| | int second_err = strerror_r(e, err_str, sizeof(err_str)); |
| | if (second_err != 0) { |
| | return "(strerror_r failed to format error)"; |
| | } |
| | return std::string(err_str); |
| | #endif |
| | #endif |
| | } |
| |
|
| | std::string GetLastErrorMsg() { |
| | #ifdef _WIN32 |
| | return NativeErrorToString(GetLastError()); |
| | #else |
| | return NativeErrorToString(errno); |
| | #endif |
| | } |
| |
|
| | } |
| |
|