Index: b/usr/src/lib/libc/port/gen/strerror.c =================================================================== --- a/usr/src/lib/libc/port/gen/strerror.c +++ b/usr/src/lib/libc/port/gen/strerror.c @@ -32,6 +32,7 @@ #include "lint.h" #include "_libc_gettext.h" +#include #include #include #include @@ -85,3 +86,14 @@ strerror_r(int errnum, char *strerrbuf, return (ret); } + +char * +gnu_strerror_r(int errnum, char *buf, size_t buflen) +{ + if (errnum < 0 || errnum >= _sys_num_err) { + const char *unknown = _libc_gettext("Unknown error"); + (void) snprintf(buf, buflen, "%s %d", unknown, errnum); + return buf; + } + return _libc_gettext((char *)&_sys_errs[_sys_index[errnum]]); +} Index: b/usr/src/lib/libc/port/mapfile-vers =================================================================== --- a/usr/src/lib/libc/port/mapfile-vers +++ b/usr/src/lib/libc/port/mapfile-vers @@ -275,6 +275,7 @@ SYMBOL_VERSION DYSON_1 { error_one_per_line; error_print_progname; flock; + gnu_strerror_r; mempcpy; memrchr; program_invocation_name; Index: b/usr/src/head/string.h =================================================================== --- a/usr/src/head/string.h +++ b/usr/src/head/string.h @@ -69,7 +69,14 @@ extern "C" { #if defined(__EXTENSIONS__) || \ (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \ defined(_XPG6) || defined(_REENTRANT) + +#ifdef _GNU_SOURCE +extern char *gnu_strerror_r(int, char*, size_t); +#define strerror_r gnu_strerror_r +#else /* !_GNU_SOURCE */ extern int strerror_r(int, char *, size_t); +#endif /* _GNU_SOURCE */ + #endif #if defined(__EXTENSIONS__) || \