#include <stdexcept>
#include <iterator>
#include <cctype>
+#include <string.h>
#include <glog/logging.h>
namespace folly {
// https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/strerror_r.3.html
// http://www.kernel.org/doc/man-pages/online/pages/man3/strerror.3.html
-#if defined(__APPLE__) || defined(__FreeBSD__) ||\
- defined(__CYGWIN__) || defined(__ANDROID__) ||\
- ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !_GNU_SOURCE)
+#if defined(_WIN32) && (defined(__MINGW32__) || defined(_MSC_VER))
+ // mingw64 has no strerror_r, but Windows has strerror_s, which C11 added
+ // as well. So maybe we should use this across all platforms (together
+ // with strerrorlen_s). Note strerror_r and _s have swapped args.
+ int r = strerror_s(buf, sizeof(buf), err);
+ if (r != 0) {
+ result = to<fbstring>(
+ "Unknown error ", err,
+ " (strerror_r failed with error ", errno, ")");
+ } else {
+ result.assign(buf);
+ }
+#elif defined(FOLLY_HAVE_XSI_STRERROR_R) || \
+ defined(__APPLE__) || defined(__ANDROID__)
// Using XSI-compatible strerror_r
int r = strerror_r(err, buf, sizeof(buf));