Errno.cpp revision e29b0aca51e3568a92869daa70c4a0351750fd1e
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 17#if HAVE_STRING_H 18#include <string.h> 19 20#if HAVE_ERRNO_H 21#include <errno.h> 22#endif 23 24//===----------------------------------------------------------------------===// 25//=== WARNING: Implementation here must contain only TRULY operating system 26//=== independent code. 27//===----------------------------------------------------------------------===// 28 29namespace llvm { 30namespace sys { 31 32#if HAVE_ERRNO_H 33std::string StrError() { 34 return StrError(errno); 35} 36#endif // HAVE_ERRNO_H 37 38std::string StrError(int errnum) { 39 const int MaxErrStrLen = 2000; 40 char buffer[MaxErrStrLen]; 41 buffer[0] = '\0'; 42 char* str = buffer; 43#ifdef HAVE_STRERROR_R 44 // strerror_r is thread-safe. 45 if (errnum) 46# if defined(__GLIBC__) && defined(_GNU_SOURCE) 47 // glibc defines its own incompatible version of strerror_r 48 // which may not use the buffer supplied. 49 str = strerror_r(errnum,buffer,MaxErrStrLen-1); 50# else 51 strerror_r(errnum,buffer,MaxErrStrLen-1); 52# endif 53#elif HAVE_DECL_STRERROR_S // "Windows Secure API" 54 if (errnum) 55 strerror_s(buffer, errnum); 56#elif defined(HAVE_STRERROR) 57 // Copy the thread un-safe result of strerror into 58 // the buffer as fast as possible to minimize impact 59 // of collision of strerror in multiple threads. 60 if (errnum) 61 strncpy(buffer,strerror(errnum),MaxErrStrLen-1); 62 buffer[MaxErrStrLen-1] = '\0'; 63#else 64 // Strange that this system doesn't even have strerror 65 // but, oh well, just use a generic message 66 sprintf(buffer, "Error #%d", errnum); 67#endif 68 return str; 69} 70 71} // namespace sys 72} // namespace llvm 73 74#endif // HAVE_STRING_H 75