diff options
| author | lizzie <lizzie@eden-emu.dev> | 2026-09-19 08:21:39 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2026-09-19 08:21:39 +0200 |
| commit | 2d1eb0dab91ec9389870ed6da7d1ef1fd01ab14a (patch) | |
| tree | d084df1cf7ea6c0f2e91c2a27cb8fb84e244b7da /src/common | |
| parent | 9a30172e45fcb7833cc49ba4d6450211449b14df (diff) | |
[common/error] remove preprocessor macros for strerror_r gating (#4450)
We use C++, we can just use SFINAE for this.
Signed-off-by: lizzie <lizzie@eden-emu.dev>
- [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions).
- [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md)
- [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability.
-------------------
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4450
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Reviewed-by: Shinmegumi <shinmegumi@eden-emu.dev>
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/error.cpp | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/src/common/error.cpp b/src/common/error.cpp index 070c9a5c7e..1d67dad6a9 100644 --- a/src/common/error.cpp +++ b/src/common/error.cpp @@ -17,35 +17,33 @@ namespace Common { +// glibc, mlibc, musl, and newlib all define their own variants of strerror_r +// We don't need to use the preprocessor, we can just select depending on return type +template<typename T> std::string HandleStrerrorR(T r, char *err_str); +template<> std::string HandleStrerrorR(char* r, char *) { return std::string{r}; } +template<> std::string HandleStrerrorR(const char* r, char *) { return std::string{r}; } +template<> std::string HandleStrerrorR(int r, char *err_str) { + return std::string{r != 0 + ? "(strerror_r failed to format error)" + : err_str}; +} + 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)"; + LPSTR(&err_str), 1, nullptr); + if (res) { + std::string ret(err_str); + LocalFree(err_str); + return ret; } - std::string ret(err_str); - LocalFree(err_str); - return ret; + return "(FormatMessageA failed to format error)"; #else char err_str[255]; -#if defined(__ANDROID__) || \ - (defined(__GLIBC__) && (_GNU_SOURCE || (_POSIX_C_SOURCE < 200112L && _XOPEN_SOURCE < 600))) - // Thread safe (GNU-specific) - const char* str = strerror_r(e, err_str, sizeof(err_str)); - return std::string(str); -#else - // Thread safe (XSI-compliant) - 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 // GLIBC etc. + return HandleStrerrorR(strerror_r(e, err_str, sizeof(err_str)), err_str); #endif // _WIN32 } |
