From 322a56392b9ed2b99f28afbb5ca1d2f642e12786 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Tue, 5 May 2009 20:29:08 +0200 Subject: [PATCH] libcollectdclient: Copy `sstrerror' from src/common.c. I don't want to simply include common.h, since that pulls in a lot of other daemon-related headers.. --- src/libcollectdclient/client.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/libcollectdclient/client.c b/src/libcollectdclient/client.c index 134a5c4d..2523eeaa 100644 --- a/src/libcollectdclient/client.c +++ b/src/libcollectdclient/client.c @@ -118,12 +118,52 @@ typedef struct lcc_response_s lcc_response_t; /* * Private functions */ +/* Even though Posix requires "strerror_r" to return an "int", + * some systems (e.g. the GNU libc) return a "char *" _and_ + * ignore the second argument ... -tokkee */ +char *sstrerror (int errnum, char *buf, size_t buflen) +{ + buf[0] = 0; + +#if !HAVE_STRERROR_R + snprintf (buf, buflen "Error #%i; strerror_r is not available.", errnum); +/* #endif !HAVE_STRERROR_R */ + +#elif STRERROR_R_CHAR_P + { + char *temp; + temp = strerror_r (errnum, buf, buflen); + if (buf[0] == 0) + { + if ((temp != NULL) && (temp != buf) && (temp[0] != 0)) + strncpy (buf, temp, buflen); + else + strncpy (buf, "strerror_r did not return " + "an error message", buflen); + } + } +/* #endif STRERROR_R_CHAR_P */ + +#else + if (strerror_r (errnum, buf, buflen) != 0) + { + snprintf (buf, buflen, "Error #%i; " + "Additionally, strerror_r failed.", + errnum); + } +#endif /* STRERROR_R_CHAR_P */ + + buf[buflen - 1] = 0; + + return (buf); +} /* char *sstrerror */ + static int lcc_set_errno (lcc_connection_t *c, int err) /* {{{ */ { if (c == NULL) return (-1); - strerror_r (err, c->errbuf, sizeof (c->errbuf)); + sstrerror (err, c->errbuf, sizeof (c->errbuf)); c->errbuf[sizeof (c->errbuf) - 1] = 0; return (0); -- 2.11.0