1//===- Errno.cpp - errno support --------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements the errno wrappers. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/Support/Errno.h" 15#include "llvm/Config/config.h" // Get autoconf configuration settings 16#include "llvm/Support/raw_ostream.h" 17#include <string.h> 18 19#if HAVE_ERRNO_H 20#include <errno.h> 21#endif 22 23//===----------------------------------------------------------------------===// 24//=== WARNING: Implementation here must contain only TRULY operating system 25//=== independent code. 26//===----------------------------------------------------------------------===// 27 28namespace llvm { 29namespace sys { 30 31#if HAVE_ERRNO_H 32std::string StrError() { 33 return StrError(errno); 34} 35#endif // HAVE_ERRNO_H 36 37std::string StrError(int errnum) { 38 const int MaxErrStrLen = 2000; 39 char buffer[MaxErrStrLen]; 40 buffer[0] = '\0'; 41 std::string str; 42 if (errnum == 0) 43 return str; 44 45#ifdef HAVE_STRERROR_R 46 // strerror_r is thread-safe. 47#if defined(__GLIBC__) && defined(_GNU_SOURCE) 48 // glibc defines its own incompatible version of strerror_r 49 // which may not use the buffer supplied. 50 str = strerror_r(errnum, buffer, MaxErrStrLen - 1); 51#else 52 strerror_r(errnum, buffer, MaxErrStrLen - 1); 53 str = buffer; 54#endif 55#elif HAVE_DECL_STRERROR_S // "Windows Secure API" 56 strerror_s(buffer, MaxErrStrLen - 1, errnum); 57 str = buffer; 58#elif defined(HAVE_STRERROR) 59 // Copy the thread un-safe result of strerror into 60 // the buffer as fast as possible to minimize impact 61 // of collision of strerror in multiple threads. 62 str = strerror(errnum); 63#else 64 // Strange that this system doesn't even have strerror 65 // but, oh well, just use a generic message 66 raw_string_ostream stream(str); 67 stream << "Error #" << errnum; 68 stream.flush(); 69#endif 70 return str; 71} 72 73} // namespace sys 74} // namespace llvm 75