diff options
Diffstat (limited to 'src/dpl/core/src/errno_string.cpp')
-rw-r--r-- | src/dpl/core/src/errno_string.cpp | 87 |
1 files changed, 43 insertions, 44 deletions
diff --git a/src/dpl/core/src/errno_string.cpp b/src/dpl/core/src/errno_string.cpp index 5b1de37..fa04a45 100644 --- a/src/dpl/core/src/errno_string.cpp +++ b/src/dpl/core/src/errno_string.cpp @@ -34,66 +34,65 @@ #include <cchecker/dpl/scoped_free.h> namespace CCHECKER { -namespace // anonymous -{ +namespace { // anonymous const size_t DEFAULT_ERRNO_STRING_SIZE = 32; } // namespace anonymous std::string GetErrnoString(int error) { - size_t size = DEFAULT_ERRNO_STRING_SIZE; - char *buffer = NULL; - - for (;;) { - // Add one extra characted for end of string null value - char *newBuffer = static_cast<char *>(::realloc(buffer, size + 1)); + size_t size = DEFAULT_ERRNO_STRING_SIZE; + char *buffer = NULL; - if (!newBuffer) { - // Failed to realloc - ::free(buffer); - throw std::bad_alloc(); - } + for (;;) { + // Add one extra characted for end of string null value + char *newBuffer = static_cast<char *>(::realloc(buffer, size + 1)); - // Setup reallocated buffer - buffer = newBuffer; - ::memset(buffer, 0, size + 1); + if (!newBuffer) { + // Failed to realloc + ::free(buffer); + throw std::bad_alloc(); + } - // Try to retrieve error string + // Setup reallocated buffer + buffer = newBuffer; + ::memset(buffer, 0, size + 1); + // Try to retrieve error string #if (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !_GNU_SOURCE - // The XSI-compliant version of strerror_r() is provided if: - int result = ::strerror_r(error, buffer, size); + // The XSI-compliant version of strerror_r() is provided if: + int result = ::strerror_r(error, buffer, size); + + if (result == 0) { + ScopedFree<char> scopedBufferFree(buffer); + return std::string(buffer); + } - if (result == 0) { - ScopedFree<char> scopedBufferFree(buffer); - return std::string(buffer); - } #else - errno = 0; + errno = 0; + // Otherwise, the GNU-specific version is provided. + char *result = ::strerror_r(error, buffer, size); - // Otherwise, the GNU-specific version is provided. - char *result = ::strerror_r(error, buffer, size); + if (result != NULL) { + ScopedFree<char> scopedBufferFree(buffer); + return std::string(result); + } - if (result != NULL) { - ScopedFree<char> scopedBufferFree(buffer); - return std::string(result); - } #endif - // Interpret errors - switch (errno) { - case EINVAL: - // We got an invalid errno value - ::free(buffer); - ThrowMsg(InvalidErrnoValue, "Invalid errno value: " << error); + // Interpret errors + switch (errno) { + case EINVAL: + // We got an invalid errno value + ::free(buffer); + ThrowMsg(InvalidErrnoValue, "Invalid errno value: " << error); - case ERANGE: - // Incease buffer size and retry - size <<= 1; - continue; + case ERANGE: + // Incease buffer size and retry + size <<= 1; + continue; - default: - Assert(0 && "Invalid errno value after call to strerror_r!"); - } - } + default: + Assert(0 && "Invalid errno value after call to strerror_r!"); + } + } } } // namespace CCHECKER |