Merge branch 'pull/collectd-4.1' into collectd-4.1
[collectd.git] / src / common.c
index 6333ab7..951bae3 100644 (file)
@@ -70,12 +70,35 @@ char *sstrdup (const char *s)
        return (r);
 }
 
-/* Don't use the return value of `strerror_r', because the GNU-people got
- * inventive there.. -octo */
+/* 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';
-       strerror_r (errnum, buf, buflen);
+#ifdef 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);
+                       buf[buflen - 1] = '\0';
+               }
+       }
+#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 */
 
@@ -695,7 +718,8 @@ int getpwnam_r (const char *name, struct passwd *pwbuf, char *buf,
                pwbuf->pw_uid = pw->pw_uid;
                pwbuf->pw_gid = pw->pw_gid;
 
-               *pwbufp = pwbuf;
+               if (pwbufp != NULL)
+                       *pwbufp = pwbuf;
        } while (0);
 
        pthread_mutex_unlock (&getpwnam_r_lock);