]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
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" | |
223e47cc LB |
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 | ||
28 | namespace llvm { | |
29 | namespace sys { | |
30 | ||
31 | #if HAVE_ERRNO_H | |
32 | std::string StrError() { | |
33 | return StrError(errno); | |
34 | } | |
35 | #endif // HAVE_ERRNO_H | |
36 | ||
37 | std::string StrError(int errnum) { | |
223e47cc | 38 | std::string str; |
1a4d82fc JJ |
39 | if (errnum == 0) |
40 | return str; | |
85aaf69f SL |
41 | #if defined(HAVE_STRERROR_R) || HAVE_DECL_STRERROR_S |
42 | const int MaxErrStrLen = 2000; | |
43 | char buffer[MaxErrStrLen]; | |
44 | buffer[0] = '\0'; | |
45 | #endif | |
1a4d82fc | 46 | |
223e47cc LB |
47 | #ifdef HAVE_STRERROR_R |
48 | // strerror_r is thread-safe. | |
1a4d82fc JJ |
49 | #if defined(__GLIBC__) && defined(_GNU_SOURCE) |
50 | // glibc defines its own incompatible version of strerror_r | |
51 | // which may not use the buffer supplied. | |
52 | str = strerror_r(errnum, buffer, MaxErrStrLen - 1); | |
53 | #else | |
54 | strerror_r(errnum, buffer, MaxErrStrLen - 1); | |
55 | str = buffer; | |
56 | #endif | |
223e47cc | 57 | #elif HAVE_DECL_STRERROR_S // "Windows Secure API" |
1a4d82fc JJ |
58 | strerror_s(buffer, MaxErrStrLen - 1, errnum); |
59 | str = buffer; | |
223e47cc LB |
60 | #elif defined(HAVE_STRERROR) |
61 | // Copy the thread un-safe result of strerror into | |
62 | // the buffer as fast as possible to minimize impact | |
63 | // of collision of strerror in multiple threads. | |
1a4d82fc | 64 | str = strerror(errnum); |
223e47cc LB |
65 | #else |
66 | // Strange that this system doesn't even have strerror | |
67 | // but, oh well, just use a generic message | |
68 | raw_string_ostream stream(str); | |
69 | stream << "Error #" << errnum; | |
70 | stream.flush(); | |
71 | #endif | |
72 | return str; | |
73 | } | |
74 | ||
75 | } // namespace sys | |
76 | } // namespace llvm |