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 18#if HAVE_STRING_H 19#include <string.h> 20 21#if HAVE_ERRNO_H 22#include <errno.h> 23#endif 24 25//===----------------------------------------------------------------------===// 26//=== WARNING: Implementation here must contain only TRULY operating system 27//=== independent code. 28//===----------------------------------------------------------------------===// 29 30namespace llvm { 31namespace sys { 32 33#if HAVE_ERRNO_H 34std::string StrError() { 35 return StrError(errno); 36} 37#endif // HAVE_ERRNO_H 38 39std::string StrError(int errnum) { 40 const int MaxErrStrLen = 2000; 41 char buffer[MaxErrStrLen]; 42 buffer[0] = '\0'; 43 std::string str; 44#ifdef HAVE_STRERROR_R 45 // strerror_r is thread-safe. 46 if (errnum) 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 if (errnum) 57 strerror_s(buffer, MaxErrStrLen - 1, errnum); 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 if (errnum) 63 str = strerror(errnum); 64#else 65 // Strange that this system doesn't even have strerror 66 // but, oh well, just use a generic message 67 raw_string_ostream stream(str); 68 stream << "Error #" << errnum; 69 stream.flush(); 70#endif 71 return str; 72} 73 74} // namespace sys 75} // namespace llvm 76 77#endif // HAVE_STRING_H 78