+ std::string systemException::errmsg() const {
+ // For thread safety on linux (and most unix systems), we need
+ // to use the reentrant version of the error translation
+ // function. Microsoft's strerror() is thread safe, since it
+ // returns a pointer to thread local storage. Unfortunately
+ // there several different reentrant versions. Here, we check
+ // for glibc, since we are using gcc. It appears at least the
+ // current version of gcc has strerror_r() available by
+ // default.
+ #ifdef __GLIBC__
+ char buf[1024];
+ // PJD: result not necessarily equal to buf
+ const char* result = strerror_r(code, buf, sizeof(buf));
+ if (result != 0)
+ return result;
+ return exception::errmsg();
+ #else
+ return strerror(code);
+ #endif