X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fcommon.c;h=951bae306e834d15f3b7d1e66fb217740bedaff0;hb=c8ec3924c92ad3ca15229e8e923eaece64221337;hp=6333ab770db2ff6de93669387ce8c298ee096bae;hpb=d6bb65ee60f5ea992b0701b98037cfeb3fd3e4e3;p=collectd.git diff --git a/src/common.c b/src/common.c index 6333ab77..951bae30 100644 --- a/src/common.c +++ b/src/common.c @@ -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);