diff --git a/src/rrd_thread_safe.c b/src/rrd_thread_safe.c
index 8144c528691dd77c5788c99ca56689ffcdfc38d0..e1e3cbeaa1b660b3b698de0f504738c4ec961683 100644 (file)
--- a/src/rrd_thread_safe.c
+++ b/src/rrd_thread_safe.c
/*****************************************************************************
/*****************************************************************************
- * RRDtool 1.3.1 Copyright by Tobi Oetiker, 1997-2008
+ * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008
* This file: Copyright 2003 Peter Stamfest <peter@stamfest.at>
* & Tobias Oetiker
* Distributed under the GPL
*****************************************************************************
* rrd_thread_safe.c Contains routines used when thread safety is required
*****************************************************************************
* This file: Copyright 2003 Peter Stamfest <peter@stamfest.at>
* & Tobias Oetiker
* Distributed under the GPL
*****************************************************************************
* rrd_thread_safe.c Contains routines used when thread safety is required
*****************************************************************************
- * $Id: rrd_thread_safe.c 1447 2008-07-23 13:02:26Z oetiker $
+ * $Id$
*************************************************************************** */
#include <pthread.h>
*************************************************************************** */
#include <pthread.h>
int err)
{
rrd_context_t *ctx = rrd_get_context();
int err)
{
rrd_context_t *ctx = rrd_get_context();
+ char *ret = "unknown error";
- if (strerror_r(err, ctx->lib_errstr, sizeof(ctx->lib_errstr)))
- return "strerror_r failed. sorry!";
- else
- return ctx->lib_errstr;
+ *ctx->lib_errstr = '\0';
+
+ /* Even though POSIX/XSI requires "strerror_r" to return an "int", some
+ * systems (e.g. the GNU libc) return a "char *" _and_ ignore the second
+ * argument ... -tokkee */
+#ifdef STRERROR_R_CHAR_P
+ ret = strerror_r(err, ctx->lib_errstr, sizeof(ctx->lib_errstr));
+ if ((! ret) || (*ret == '\0')) {
+ if (*ctx->lib_errstr != '\0')
+ ret = ctx->lib_errstr;
+ else {
+ /* according to the manpage this should not happen -
+ let's handle it somehow sanely anyway */
+ snprintf(ctx->lib_errstr, sizeof(ctx->lib_errstr),
+ "unknown error %i - strerror_r did not return anything",
+ err);
+ ctx->lib_errstr[sizeof(ctx->lib_errstr) - 1] = '\0';
+ ret = ctx->lib_errstr;
+ }
+ }
+#else /* ! STRERROR_R_CHAR_P */
+ if (strerror_r(err, ctx->lib_errstr, sizeof(ctx->lib_errstr))) {
+ snprintf(ctx->lib_errstr, sizeof(ctx->lib_errstr),
+ "unknown error %i - strerror_r returned with errno = %i",
+ err, errno);
+ ctx->lib_errstr[sizeof(ctx->lib_errstr) - 1] = '\0';
+ }
+ ret = ctx->lib_errstr;
+#endif
+ return ret;
}
#else
#undef strerror
}
#else
#undef strerror