libcollectdclient: Copy `sstrerror' from src/common.c.
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Tue, 5 May 2009 18:29:08 +0000 (20:29 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Tue, 5 May 2009 18:29:08 +0000 (20:29 +0200)
I don't want to simply include common.h, since that pulls in a lot of
other daemon-related headers..

src/libcollectdclient/client.c

index 134a5c4..2523eea 100644 (file)
@@ -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);