diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2006-08-21 06:02:44 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2006-08-21 06:02:44 +0000 |
commit | 4ce5dc63778f36f61b510456783f15a224406e68 (patch) | |
tree | 5645a0ef58e6818f6dae4146240204f6d0940eaf /lib/System/Unix/Unix.h | |
parent | d2a8e656c504b0708e1343542d984e14b8eb948c (diff) |
For PR797:
Remove all exception code from Program.inc and implement its new interface
with an ErrMsg string argument.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29790 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Unix/Unix.h')
-rw-r--r-- | lib/System/Unix/Unix.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/System/Unix/Unix.h b/lib/System/Unix/Unix.h index 4ef38963ff..1516d453dd 100644 --- a/lib/System/Unix/Unix.h +++ b/lib/System/Unix/Unix.h @@ -119,4 +119,35 @@ inline void ThrowErrno(const std::string& prefix, int errnum = -1) { throw prefix + ": " + buffer; } +/// This function builds an error message into \p ErrMsg using the \p prefix +/// string and the Unix error number given by \p errnum. If errnum is -1, the +/// default then the value of errno is used. +/// @brief Make an error message +inline void MakeErrMsg( + std::string* ErrMsg, const std::string& prefix, int errnum = -1) { + if (!ErrMsg) + return; + char buffer[MAXPATHLEN]; + buffer[0] = 0; + if (errnum == -1) + errnum = errno; +#ifdef HAVE_STRERROR_R + // strerror_r is thread-safe. + if (errnum) + strerror_r(errnum,buffer,MAXPATHLEN-1); +#elif HAVE_STRERROR + // 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) + strncpy(buffer,strerror(errnum),MAXPATHLEN-1); + buffer[MAXPATHLEN-1] = 0; +#else + // Strange that this system doesn't even have strerror + // but, oh well, just use a generic message + sprintf(buffer, "Error #%d", errnum); +#endif + *ErrMsg = buffer; +} + #endif |