| |
| |
| |
|
|
| #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 |
| } |
|
|
| } |
|
|