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