2009-07-01 18:11:20 +00:00
|
|
|
//===- Errno.cpp - errno support --------------------------------*- C++ -*-===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file implements the errno wrappers.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2010-11-29 18:16:10 +00:00
|
|
|
#include "llvm/Support/Errno.h"
|
2009-07-01 18:11:20 +00:00
|
|
|
#include "llvm/Config/config.h" // Get autoconf configuration settings
|
2012-09-28 14:15:28 +00:00
|
|
|
#include "llvm/Support/raw_ostream.h"
|
2009-07-01 18:11:20 +00:00
|
|
|
|
|
|
|
#if HAVE_STRING_H
|
|
|
|
#include <string.h>
|
|
|
|
|
2009-07-06 16:50:27 +00:00
|
|
|
#if HAVE_ERRNO_H
|
|
|
|
#include <errno.h>
|
|
|
|
#endif
|
|
|
|
|
2009-07-01 18:11:20 +00:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//=== WARNING: Implementation here must contain only TRULY operating system
|
|
|
|
//=== independent code.
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
namespace sys {
|
|
|
|
|
|
|
|
#if HAVE_ERRNO_H
|
|
|
|
std::string StrError() {
|
|
|
|
return StrError(errno);
|
|
|
|
}
|
|
|
|
#endif // HAVE_ERRNO_H
|
|
|
|
|
|
|
|
std::string StrError(int errnum) {
|
|
|
|
const int MaxErrStrLen = 2000;
|
|
|
|
char buffer[MaxErrStrLen];
|
|
|
|
buffer[0] = '\0';
|
2012-09-28 14:15:28 +00:00
|
|
|
std::string str;
|
2009-07-01 18:11:20 +00:00
|
|
|
#ifdef HAVE_STRERROR_R
|
|
|
|
// strerror_r is thread-safe.
|
|
|
|
if (errnum)
|
|
|
|
# if defined(__GLIBC__) && defined(_GNU_SOURCE)
|
|
|
|
// glibc defines its own incompatible version of strerror_r
|
|
|
|
// which may not use the buffer supplied.
|
|
|
|
str = strerror_r(errnum,buffer,MaxErrStrLen-1);
|
|
|
|
# else
|
|
|
|
strerror_r(errnum,buffer,MaxErrStrLen-1);
|
2012-09-28 14:15:28 +00:00
|
|
|
str = buffer;
|
2009-07-01 18:11:20 +00:00
|
|
|
# endif
|
2011-02-09 04:18:48 +00:00
|
|
|
#elif HAVE_DECL_STRERROR_S // "Windows Secure API"
|
2012-11-01 00:34:09 +00:00
|
|
|
if (errnum) {
|
2012-06-24 03:51:04 +00:00
|
|
|
strerror_s(buffer, MaxErrStrLen - 1, errnum);
|
2012-11-01 00:34:09 +00:00
|
|
|
str = buffer;
|
|
|
|
}
|
2009-07-02 12:09:50 +00:00
|
|
|
#elif defined(HAVE_STRERROR)
|
2009-07-01 18:11:20 +00:00
|
|
|
// Copy the thread un-safe result of strerror into
|
|
|
|
// the buffer as fast as possible to minimize impact
|
|
|
|
// of collision of strerror in multiple threads.
|
|
|
|
if (errnum)
|
2012-09-28 14:15:28 +00:00
|
|
|
str = strerror(errnum);
|
2009-07-01 18:11:20 +00:00
|
|
|
#else
|
|
|
|
// Strange that this system doesn't even have strerror
|
|
|
|
// but, oh well, just use a generic message
|
2012-09-28 14:15:28 +00:00
|
|
|
raw_string_ostream stream(str);
|
|
|
|
stream << "Error #" << errnum;
|
|
|
|
stream.flush();
|
2009-07-01 18:11:20 +00:00
|
|
|
#endif
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace sys
|
|
|
|
} // namespace llvm
|
|
|
|
|
|
|
|
#endif // HAVE_STRING_H
|