diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-05-18 17:41:25 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-07-07 15:02:57 -0300 |
commit | 325081b9eb2035f8f025255206889208f330b590 (patch) | |
tree | 43a32de8fdd6777e290d7310795b41ea86df12b6 /stdio-common/errlist.c | |
parent | bfe05aa289054744b68f136b701705cfd242c4de (diff) | |
download | glibc-325081b9eb2035f8f025255206889208f330b590.tar.gz glibc-325081b9eb2035f8f025255206889208f330b590.tar.xz glibc-325081b9eb2035f8f025255206889208f330b590.zip |
string: Add strerrorname_np and strerrordesc_np
The strerrorname_np returns error number name (e.g. "EINVAL" for EINVAL) while strerrordesc_np returns string describing error number (e.g "Invalid argument" for EINVAL). Different than strerror, strerrordesc_np does not attempt to translate the return description, both functions return NULL for an invalid error number. They should be used instead of sys_errlist and sys_nerr, both are thread and async-signal safe. These functions are GNU extensions. Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, and s390x-linux-gnu. Tested-by: Carlos O'Donell <carlos@redhat.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'stdio-common/errlist.c')
-rw-r--r-- | stdio-common/errlist.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/stdio-common/errlist.c b/stdio-common/errlist.c index df52356066..d15f13a22a 100644 --- a/stdio-common/errlist.c +++ b/stdio-common/errlist.c @@ -35,4 +35,37 @@ __get_errlist (int errnum) return NULL; } +static const union sys_errname_t +{ + struct + { +#define MSGSTRFIELD1(line) str##line +#define MSGSTRFIELD(line) MSGSTRFIELD1(line) +#define _S(n, str) char MSGSTRFIELD(__LINE__)[sizeof(str)]; +#include <errlist.h> +#undef _S + }; + char str[0]; +} _sys_errname = { { +#define _S(n, s) s, +#include <errlist.h> +#undef _S +} }; + +static const unsigned short _sys_errnameidx[] = +{ +#define _S(n, s) [n] = offsetof(union sys_errname_t, MSGSTRFIELD(__LINE__)), +#include <errlist.h> +#undef _S +}; + +const char * +__get_errname (int errnum) +{ + if (errnum < 0 || errnum >= array_length (_sys_errnameidx) + || (errnum > 0 && _sys_errnameidx[errnum] == 0)) + return NULL; + return _sys_errname.str + _sys_errnameidx[errnum]; +} + #include <errlist-compat.c> |