use fmt::safe_strerror

This commit is contained in:
gabime 2018-06-01 17:06:20 +03:00
parent f2bc1571b4
commit 38b3ecb02e
2 changed files with 14 additions and 53 deletions

View File

@ -158,7 +158,18 @@ public:
spdlog_ex(const std::string &msg, int last_errno) spdlog_ex(const std::string &msg, int last_errno)
{ {
_msg = msg + ": " + details::os::errno_str(last_errno); std::string errno_string;
char buf[256], *buf_ptr = buf;
if (fmt::safe_strerror(last_errno, buf_ptr, sizeof(buf)) == 0)
{
errno_string = buf_ptr;
}
else
{
errno_string = "Unknown error";
}
_msg = msg + ": " + errno_string;
} }
const char *what() const SPDLOG_NOEXCEPT override const char *what() const SPDLOG_NOEXCEPT override

View File

@ -4,7 +4,7 @@
// //
#pragma once #pragma once
#include "spdlog/common.h" #include "../common.h"
#include <algorithm> #include <algorithm>
#include <chrono> #include <chrono>
@ -13,7 +13,6 @@
#include <cstring> #include <cstring>
#include <ctime> #include <ctime>
#include <functional> #include <functional>
#include <mutex>
#include <string> #include <string>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
@ -283,7 +282,7 @@ inline int utc_minutes_offset(const std::tm &tm = details::os::localtime())
return offset; return offset;
#else #else
#if defined(sun) || defined(__sun) #if defined(sun) || defined(__sun) || defined(_AIX)
// 'tm_gmtoff' field is BSD extension and it's missing on SunOS/Solaris // 'tm_gmtoff' field is BSD extension and it's missing on SunOS/Solaris
struct helper struct helper
{ {
@ -384,54 +383,6 @@ inline std::string filename_to_str(const filename_t &filename)
} }
#endif #endif
inline std::string errno_to_string(char[256], char *res)
{
return std::string(res);
}
inline std::string errno_to_string(char buf[256], int res)
{
if (res == 0)
{
return std::string(buf);
}
return "Unknown error";
}
// Return errno string (thread safe)
inline std::string errno_str(int err_num)
{
char buf[256];
SPDLOG_CONSTEXPR auto buf_size = sizeof(buf);
#ifdef _WIN32
if (strerror_s(buf, buf_size, err_num) == 0)
{
return std::string(buf);
}
else
{
return "Unknown error";
}
#elif defined(__FreeBSD__) || defined(__APPLE__) || defined(ANDROID) || defined(__SUNPRO_CC) || \
((_POSIX_C_SOURCE >= 200112L) && !defined(_GNU_SOURCE)) // posix version
if (strerror_r(err_num, buf, buf_size) == 0)
{
return std::string(buf);
}
else
{
return "Unknown error";
}
#else // gnu version (might not use the given buf, so its retval pointer must be used)
auto err = strerror_r(err_num, buf, buf_size); // let compiler choose type
return errno_to_string(buf, err); // use overloading to select correct stringify function
#endif
}
inline int pid() inline int pid()
{ {
@ -475,7 +426,6 @@ inline bool in_terminal(FILE *file)
return isatty(fileno(file)) != 0; return isatty(fileno(file)) != 0;
#endif #endif
} }
} // namespace os } // namespace os
} // namespace details } // namespace details
} // namespace spdlog } // namespace spdlog