[v5,13/13] string: Add strerrorname and strerrordesc

Message ID 20200619134352.297146-13-adhemerval.zanella@linaro.org
State Superseded
Delegated to: Carlos O'Donell
Headers
Series [v5,01/13] signal: Add signum-{generic,arch}.h |

Commit Message

Adhemerval Zanella June 19, 2020, 1:43 p.m. UTC
  The strerrorname returns error number name (i.g. "EINVAL" for EINVAL)
while strerrordesc returns string describing error number (i.g
"Invalid argument" for EINVAL).  Different than strerror, strerrordesc
does not attempt to translate the return description and both functions
return NULL for an invalid error number.

They should be used instead of sys_errlist and sys_nerr and 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.
---
 NEWS                                          | 10 +++
 include/stdio.h                               |  1 +
 manual/errno.texi                             | 23 +++++++
 stdio-common/errlist.c                        | 33 ++++++++++
 stdio-common/test-strerr.c                    | 65 +++++++++++++++++++
 string/Makefile                               |  2 +-
 string/Versions                               |  1 +
 string/strerrordesc.c                         | 26 ++++++++
 string/strerrorname.c                         | 25 +++++++
 string/string.h                               |  7 ++
 sysdeps/mach/hurd/i386/libc.abilist           |  2 +
 sysdeps/mach/hurd/test-err_np.c               |  4 ++
 sysdeps/unix/sysv/linux/aarch64/libc.abilist  |  2 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist    |  2 +
 sysdeps/unix/sysv/linux/arm/be/libc.abilist   |  2 +
 sysdeps/unix/sysv/linux/arm/le/libc.abilist   |  2 +
 sysdeps/unix/sysv/linux/csky/libc.abilist     |  2 +
 sysdeps/unix/sysv/linux/hppa/libc.abilist     |  2 +
 sysdeps/unix/sysv/linux/i386/libc.abilist     |  2 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist     |  2 +
 .../sysv/linux/m68k/coldfire/libc.abilist     |  2 +
 .../unix/sysv/linux/m68k/m680x0/libc.abilist  |  2 +
 .../sysv/linux/microblaze/be/libc.abilist     |  2 +
 .../sysv/linux/microblaze/le/libc.abilist     |  2 +
 .../sysv/linux/mips/mips32/fpu/libc.abilist   |  2 +
 .../sysv/linux/mips/mips32/nofpu/libc.abilist |  2 +
 .../sysv/linux/mips/mips64/n32/libc.abilist   |  2 +
 .../sysv/linux/mips/mips64/n64/libc.abilist   |  2 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist    |  2 +
 .../linux/powerpc/powerpc32/fpu/libc.abilist  |  2 +
 .../powerpc/powerpc32/nofpu/libc.abilist      |  2 +
 .../linux/powerpc/powerpc64/be/libc.abilist   |  2 +
 .../linux/powerpc/powerpc64/le/libc.abilist   |  2 +
 .../unix/sysv/linux/riscv/rv64/libc.abilist   |  2 +
 .../unix/sysv/linux/s390/s390-32/libc.abilist |  2 +
 .../unix/sysv/linux/s390/s390-64/libc.abilist |  2 +
 sysdeps/unix/sysv/linux/sh/be/libc.abilist    |  2 +
 sysdeps/unix/sysv/linux/sh/le/libc.abilist    |  2 +
 .../sysv/linux/sparc/sparc32/libc.abilist     |  2 +
 .../sysv/linux/sparc/sparc64/libc.abilist     |  2 +
 .../unix/sysv/linux/x86_64/64/libc.abilist    |  2 +
 .../unix/sysv/linux/x86_64/x32/libc.abilist   |  2 +
 42 files changed, 258 insertions(+), 1 deletion(-)
 create mode 100644 stdio-common/test-strerr.c
 create mode 100644 string/strerrordesc.c
 create mode 100644 string/strerrorname.c
 create mode 100644 sysdeps/mach/hurd/test-err_np.c
  

Comments

Carlos O'Donell July 2, 2020, 9:43 p.m. UTC | #1
On 6/19/20 9:43 AM, Adhemerval Zanella wrote:
> The strerrorname returns error number name (i.g. "EINVAL" for EINVAL)
> while strerrordesc returns string describing error number (i.g
> "Invalid argument" for EINVAL).  Different than strerror, strerrordesc
> does not attempt to translate the return description and both functions
> return NULL for an invalid error number.
> 
> They should be used instead of sys_errlist and sys_nerr and both are

s/and both/, both/g

> 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.

Why not strerrorname_np or strerrordesc_np? We don't have to use *_np,
but these functions are fiarly close in name to 'strerror' and so it
might be beneficial to use _np at the end, like you did for sigabbrev_np
and sigdescr_np. Thoughts?

No regression on x86_64 and i686.

Tested-by: Carlos O'Donell <carlos@redhat.com>

> ---
>  NEWS                                          | 10 +++
>  include/stdio.h                               |  1 +
>  manual/errno.texi                             | 23 +++++++
>  stdio-common/errlist.c                        | 33 ++++++++++
>  stdio-common/test-strerr.c                    | 65 +++++++++++++++++++
>  string/Makefile                               |  2 +-
>  string/Versions                               |  1 +
>  string/strerrordesc.c                         | 26 ++++++++
>  string/strerrorname.c                         | 25 +++++++
>  string/string.h                               |  7 ++
>  sysdeps/mach/hurd/i386/libc.abilist           |  2 +
>  sysdeps/mach/hurd/test-err_np.c               |  4 ++
>  sysdeps/unix/sysv/linux/aarch64/libc.abilist  |  2 +
>  sysdeps/unix/sysv/linux/alpha/libc.abilist    |  2 +
>  sysdeps/unix/sysv/linux/arm/be/libc.abilist   |  2 +
>  sysdeps/unix/sysv/linux/arm/le/libc.abilist   |  2 +
>  sysdeps/unix/sysv/linux/csky/libc.abilist     |  2 +
>  sysdeps/unix/sysv/linux/hppa/libc.abilist     |  2 +
>  sysdeps/unix/sysv/linux/i386/libc.abilist     |  2 +
>  sysdeps/unix/sysv/linux/ia64/libc.abilist     |  2 +
>  .../sysv/linux/m68k/coldfire/libc.abilist     |  2 +
>  .../unix/sysv/linux/m68k/m680x0/libc.abilist  |  2 +
>  .../sysv/linux/microblaze/be/libc.abilist     |  2 +
>  .../sysv/linux/microblaze/le/libc.abilist     |  2 +
>  .../sysv/linux/mips/mips32/fpu/libc.abilist   |  2 +
>  .../sysv/linux/mips/mips32/nofpu/libc.abilist |  2 +
>  .../sysv/linux/mips/mips64/n32/libc.abilist   |  2 +
>  .../sysv/linux/mips/mips64/n64/libc.abilist   |  2 +
>  sysdeps/unix/sysv/linux/nios2/libc.abilist    |  2 +
>  .../linux/powerpc/powerpc32/fpu/libc.abilist  |  2 +
>  .../powerpc/powerpc32/nofpu/libc.abilist      |  2 +
>  .../linux/powerpc/powerpc64/be/libc.abilist   |  2 +
>  .../linux/powerpc/powerpc64/le/libc.abilist   |  2 +
>  .../unix/sysv/linux/riscv/rv64/libc.abilist   |  2 +
>  .../unix/sysv/linux/s390/s390-32/libc.abilist |  2 +
>  .../unix/sysv/linux/s390/s390-64/libc.abilist |  2 +
>  sysdeps/unix/sysv/linux/sh/be/libc.abilist    |  2 +
>  sysdeps/unix/sysv/linux/sh/le/libc.abilist    |  2 +
>  .../sysv/linux/sparc/sparc32/libc.abilist     |  2 +
>  .../sysv/linux/sparc/sparc64/libc.abilist     |  2 +
>  .../unix/sysv/linux/x86_64/64/libc.abilist    |  2 +
>  .../unix/sysv/linux/x86_64/x32/libc.abilist   |  2 +
>  42 files changed, 258 insertions(+), 1 deletion(-)
>  create mode 100644 stdio-common/test-strerr.c
>  create mode 100644 string/strerrordesc.c
>  create mode 100644 string/strerrorname.c
>  create mode 100644 sysdeps/mach/hurd/test-err_np.c
> 
> diff --git a/NEWS b/NEWS
> index f504772eb6..888727581b 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -41,6 +41,16 @@ Major new features:
>    They should be used instead of sys_siglist or sys_sigabbrev and they
>    are both thread and async-signal safe.  These functions are GNU extensions.
>  
> +* The functions strerrorname and strerrordesc have been added.  The
> +  strerroname returns error number name (i.g. "EINVAL" for EINVAL) while

s/i.g./e.g./g

> +  strerrordesc returns string describing error number (i.g "Invalid argument"
> +  for EINVAL).  Different than strerror, strerrordesc does not attempt to
> +  translate the return description and both functions return NULL for an
> +  invalid error number.
> +
> +  They should be used instead of sys_errlist and sys_nerr and both are

s/and both/, both/g

> +  thread and async-signal safe.  These functions are GNU extensions.
> +
>  Deprecated and removed features, and other changes affecting compatibility:
>  
>  * The deprecated <sys/sysctl.h> header and the sysctl function have been
> diff --git a/include/stdio.h b/include/stdio.h
> index 9e3bf6fe42..bc67d020d4 100644
> --- a/include/stdio.h
> +++ b/include/stdio.h
> @@ -187,6 +187,7 @@ libc_hidden_proto (__libc_readline_unlocked);
>  
>  extern const char *const _sys_errlist_internal[] attribute_hidden;
>  extern const char *__get_errlist (int) attribute_hidden;
> +extern const char *__get_errname (int) attribute_hidden;

OK.

>  
>  libc_hidden_ldbl_proto (__asprintf)
>  
> diff --git a/manual/errno.texi b/manual/errno.texi
> index 8cb4ce8b48..dfc4001af0 100644
> --- a/manual/errno.texi
> +++ b/manual/errno.texi
> @@ -1207,6 +1207,29 @@ to @code{errno}.
>  The function @code{perror} is declared in @file{stdio.h}.
>  @end deftypefun
>  
> +@deftypefun void strerrorname (int @var{errnum})
> +@standards{GNU, string.h}
> +@safety{@prelim{}@mtsafe{@mtssigintr{}}@assafe{}@acsafe{}}

Use @mtsafe{} since it doesn't touch _sigintr.

> +This function returns the name describing the error @var{errnum} or
> +@code{NULL} if there is no known E* constant with this value (i.g "EINVAL"> +for @code{EINVAL}).

s/E*//g

> +
> +@pindex string.h
> +This function is a GNU extension, declared in the header file @file{string.h}.
> +@end deftypefun
> +
> +@deftypefun void errdesc_np (int @var{errnum})
> +@standards{GNU, string.h}
> +@safety{@prelim{}@mtsafe{@mtssigintr{}}@assafe{}@acsafe{}}

Use @mtsafe{} since it doesn't touch _sigintr.

> +This function returns the message describing the error @var{errnum} or
> +@code{NULL} if there is no known E* constant with this value (i.g "Invalid

s/E*//g

> +argument" for @code{EINVAL}).  Different than @code{strerror} the returned
> +description is not translated.
> +
> +@pindex string.h
> +This function is a GNU extension, declared in the header file @file{string.h}.
> +@end deftypefun
> +
>  @code{strerror} and @code{perror} produce the exact same message for any
>  given error code; the precise text varies from system to system.  With
>  @theglibc{}, the messages are fairly short; there are no multi-line
> 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];
> +}

OK.

> +
>  #include <errlist-compat.c>
> diff --git a/stdio-common/test-strerr.c b/stdio-common/test-strerr.c
> new file mode 100644
> index 0000000000..baa8d8e6d4
> --- /dev/null
> +++ b/stdio-common/test-strerr.c
> @@ -0,0 +1,65 @@
> +/* Test strerrorname and strerrordesc.
> +   Copyright (C) 2020 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.

OK.

> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <string.h>
> +#include <errno.h>
> +#include <array_length.h>
> +
> +#include <support/support.h>
> +#include <support/check.h>
> +
> +#define N_(name)      name
> +
> +static const char *const errlist[] =
> +  {
> +/* This file is auto-generated from errlist.def.  */
> +#include <errlist.h>

OK. We cross reference the entire errlist.

> +  };
> +
> +#define MSGSTR_T errname_t
> +#define MSGSTR   errname
> +#define MSGIDX   errnameidx
> +#include <errlist-name.h>
> +#undef MSGSTR
> +#undef MSGIDX
> +
> +static int
> +do_test (void)
> +{
> +  TEST_VERIFY (strerrordesc (-1) == NULL);
> +  TEST_VERIFY (strerrordesc (array_length (errlist)) == NULL);

OK.

> +  for (size_t i = 0; i < array_length (errlist); i++)
> +    {
> +      if (errlist[i] == NULL)
> +        continue;
> +      TEST_COMPARE_STRING (strerrordesc (i), errlist[i]);
> +    }
> +
> +  TEST_VERIFY (strerrorname (-1) == NULL);
> +  TEST_VERIFY (strerrorname (array_length (errlist)) == NULL);
> +  for (size_t i = 0; i < array_length (errlist); i++)
> +    {
> +      if (errlist[i] == NULL)
> +        continue;
> +      TEST_COMPARE_STRING (strerrorname (i), errname.str + errnameidx[i]);
> +    }
> +
> +  return 0;
> +}

OK.

> +
> +#include <support/test-driver.c>
> diff --git a/string/Makefile b/string/Makefile
> index e5075521b7..fd06409197 100644
> --- a/string/Makefile
> +++ b/string/Makefile
> @@ -45,7 +45,7 @@ routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
>  		   envz basename					\
>  		   strcoll_l strxfrm_l string-inlines memrchr		\
>  		   xpg-strerror strerror_l explicit_bzero		\
> -		   sigdescr_np sigabbrev_np
> +		   sigdescr_np sigabbrev_np strerrorname strerrordesc

Why not _np also?

>  
>  strop-tests	:= memchr memcmp memcpy memmove mempcpy memset memccpy	\
>  		   stpcpy stpncpy strcat strchr strcmp strcpy strcspn	\
> diff --git a/string/Versions b/string/Versions
> index 6f8dd2d372..7727fca001 100644
> --- a/string/Versions
> +++ b/string/Versions
> @@ -87,5 +87,6 @@ libc {
>    }
>    GLIBC_2.32 {
>      sigdescr_np; sigabbrev_np;
> +    strerrordesc; strerrorname;

Likewise.

>    }
>  }
> diff --git a/string/strerrordesc.c b/string/strerrordesc.c
> new file mode 100644
> index 0000000000..f59448f2d1
> --- /dev/null
> +++ b/string/strerrordesc.c
> @@ -0,0 +1,26 @@
> +/* Return string describing error number.
> +   Copyright (C) 2020 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <stdio.h>
> +
> +const char *
> +__strerrordesc (int errnum)
> +{
> +  return __get_errlist (errnum);
> +}

OK.

> +weak_alias (__strerrordesc, strerrordesc)
> diff --git a/string/strerrorname.c b/string/strerrorname.c
> new file mode 100644
> index 0000000000..889ea0d245
> --- /dev/null
> +++ b/string/strerrorname.c
> @@ -0,0 +1,25 @@
> +/* Return string describing errno name.
> +   Copyright (C) 2020 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <stdio.h>
> +
> +const char *
> +strerrorname (int errnum)
> +{
> +  return __get_errname (errnum);
> +}

OK.

> diff --git a/string/string.h b/string/string.h
> index 0119d7f45d..bb90219ada 100644
> --- a/string/string.h
> +++ b/string/string.h
> @@ -428,6 +428,13 @@ extern int __xpg_strerror_r (int __errnum, char *__buf, size_t __buflen)
>  extern char *strerror_r (int __errnum, char *__buf, size_t __buflen)
>       __THROW __nonnull ((2)) __wur  __attr_access ((__write_only__, 2, 3));
>  # endif
> +
> +# ifdef __USE_GNU

OK. GNU extension.

> +/* Return a string describing the meaning of tthe error in ERR.  */
> +extern const char *strerrordesc (int __err) __THROW;
> +/* Return a string with the error name in ERR.  */
> +extern const char *strerrorname (int __err) __THROW;
> +# endif
>  #endif
>  
>  #ifdef __USE_XOPEN2K8
> diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
> index ff8ad98d03..193ceba987 100644
> --- a/sysdeps/mach/hurd/i386/libc.abilist
> +++ b/sysdeps/mach/hurd/i386/libc.abilist
> @@ -2181,6 +2181,8 @@ GLIBC_2.3.4 setsourcefilter F
>  GLIBC_2.3.4 xdr_quad_t F
>  GLIBC_2.3.4 xdr_u_quad_t F
>  GLIBC_2.30 twalk_r F
> +GLIBC_2.32 errdescr_np F
> +GLIBC_2.32 errname_np F
>  GLIBC_2.32 mach_print F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> diff --git a/sysdeps/mach/hurd/test-err_np.c b/sysdeps/mach/hurd/test-err_np.c
> new file mode 100644
> index 0000000000..3127141128
> --- /dev/null
> +++ b/sysdeps/mach/hurd/test-err_np.c
> @@ -0,0 +1,4 @@
> +#include <mach/error.h>
> +
> +#define ERR_MAP(value) err_get_code (value)
> +#include <stdio-common/test-err_np.c>
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> index bb6045d8a6..f0529706ee 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> @@ -2157,3 +2157,5 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> index 8e15a58eaf..ac892eceda 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> @@ -2239,6 +2239,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> index ce82b840e8..af574dfb9d 100644
> --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> @@ -141,6 +141,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 _Exit F
>  GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
>  GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> index c7a436cd42..bb0e8bf312 100644
> --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> @@ -138,6 +138,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 _Exit F
>  GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
>  GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
> diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
> index 7f51d47b2f..8a612ece3e 100644
> --- a/sysdeps/unix/sysv/linux/csky/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
> @@ -2101,3 +2101,5 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> index 053cda00a4..ccb61a322a 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> @@ -2060,6 +2060,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> index f18de50f9e..bc5329d7b9 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> @@ -2226,6 +2226,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> index a1966cac5a..8f8cbfa80b 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> @@ -2092,6 +2092,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> index 8f44bc9231..802e16ac7d 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> @@ -142,6 +142,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 _Exit F
>  GLIBC_2.4 _IO_2_1_stderr_ D 0x98
>  GLIBC_2.4 _IO_2_1_stdin_ D 0x98
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> index 088f2fa0f2..62bfa336b8 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> @@ -2172,6 +2172,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> index 34c1c4fdca..680c7b0c77 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> @@ -2152,3 +2152,5 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> index 099d51e893..e102493f6c 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> @@ -2149,3 +2149,5 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> index ea86646c3b..28588017fa 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> @@ -2143,6 +2143,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> index 9adac43e36..64c99116c0 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> @@ -2141,6 +2141,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> index c42c093cfb..7e197736d8 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> @@ -2149,6 +2149,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> index 605e60a35e..e1964effc6 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> @@ -2143,6 +2143,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> index 7a57babca5..f647f86c09 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> @@ -2190,3 +2190,5 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> index c3745c3733..8998f3e0ab 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> @@ -2199,6 +2199,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> index 719512e999..a96c6d1ce2 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> @@ -2232,6 +2232,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> index 3f79daa39c..f9f0a9dd93 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> @@ -2062,6 +2062,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> index af1a2ae8a6..921098b1f3 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> @@ -2352,3 +2352,5 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> index ff5b64c1dd..1e65005b9f 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> @@ -2119,3 +2119,5 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> index 576caca63c..b31811135b 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> @@ -2197,6 +2197,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> index 7201b10288..c30fc0ef71 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> @@ -2098,6 +2098,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> index 4f954ac7ee..9cbe4a650a 100644
> --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> @@ -2067,6 +2067,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> index 9db9ba5cc0..c00327a607 100644
> --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> @@ -2064,6 +2064,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> index ecb54db317..a990eee8f8 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> @@ -2188,6 +2188,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 _IO_fprintf F
>  GLIBC_2.4 _IO_printf F
>  GLIBC_2.4 _IO_sprintf F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> index 74bd6efed8..e988546b20 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> @@ -2115,6 +2115,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> index 50e45a43e8..fa10e68d3a 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> @@ -2073,6 +2073,8 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
>  GLIBC_2.4 __confstr_chk F
>  GLIBC_2.4 __fgets_chk F
>  GLIBC_2.4 __fgets_unlocked_chk F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> index 59b26b097d..29119996ae 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> @@ -2170,3 +2170,5 @@ GLIBC_2.32 pthread_getattr_np F
>  GLIBC_2.32 pthread_sigmask F
>  GLIBC_2.32 sigabbrev_np F
>  GLIBC_2.32 sigdescr_np F
> +GLIBC_2.32 strerrordesc F
> +GLIBC_2.32 strerrorname F
> 

OK.
  
Adhemerval Zanella July 3, 2020, 9:01 p.m. UTC | #2
On 02/07/2020 18:43, Carlos O'Donell wrote:
> On 6/19/20 9:43 AM, Adhemerval Zanella wrote:
>> The strerrorname returns error number name (i.g. "EINVAL" for EINVAL)
>> while strerrordesc returns string describing error number (i.g
>> "Invalid argument" for EINVAL).  Different than strerror, strerrordesc
>> does not attempt to translate the return description and both functions
>> return NULL for an invalid error number.
>>
>> They should be used instead of sys_errlist and sys_nerr and both are
> 
> s/and both/, both/g

Ack.

> 
>> 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.
> 
> Why not strerrorname_np or strerrordesc_np? We don't have to use *_np,
> but these functions are fiarly close in name to 'strerror' and so it
> might be beneficial to use _np at the end, like you did for sigabbrev_np
> and sigdescr_np. Thoughts?

I don't have a strong preference here, on a patch iteration I used 
the the _np suffix and Florian has pointed out the str* namespace
is reserved for libc implementations.

But I think the _np is slight better to indicate it is an extension.
If it is eventually adopted by other system without the _np suffix
we can easily create an alias.

So I have added the _np suffix.

> 
> No regression on x86_64 and i686.
> 
> Tested-by: Carlos O'Donell <carlos@redhat.com>

Should I add the Reviewed-by as well?

> 
>> ---
>>  NEWS                                          | 10 +++
>>  include/stdio.h                               |  1 +
>>  manual/errno.texi                             | 23 +++++++
>>  stdio-common/errlist.c                        | 33 ++++++++++
>>  stdio-common/test-strerr.c                    | 65 +++++++++++++++++++
>>  string/Makefile                               |  2 +-
>>  string/Versions                               |  1 +
>>  string/strerrordesc.c                         | 26 ++++++++
>>  string/strerrorname.c                         | 25 +++++++
>>  string/string.h                               |  7 ++
>>  sysdeps/mach/hurd/i386/libc.abilist           |  2 +
>>  sysdeps/mach/hurd/test-err_np.c               |  4 ++
>>  sysdeps/unix/sysv/linux/aarch64/libc.abilist  |  2 +
>>  sysdeps/unix/sysv/linux/alpha/libc.abilist    |  2 +
>>  sysdeps/unix/sysv/linux/arm/be/libc.abilist   |  2 +
>>  sysdeps/unix/sysv/linux/arm/le/libc.abilist   |  2 +
>>  sysdeps/unix/sysv/linux/csky/libc.abilist     |  2 +
>>  sysdeps/unix/sysv/linux/hppa/libc.abilist     |  2 +
>>  sysdeps/unix/sysv/linux/i386/libc.abilist     |  2 +
>>  sysdeps/unix/sysv/linux/ia64/libc.abilist     |  2 +
>>  .../sysv/linux/m68k/coldfire/libc.abilist     |  2 +
>>  .../unix/sysv/linux/m68k/m680x0/libc.abilist  |  2 +
>>  .../sysv/linux/microblaze/be/libc.abilist     |  2 +
>>  .../sysv/linux/microblaze/le/libc.abilist     |  2 +
>>  .../sysv/linux/mips/mips32/fpu/libc.abilist   |  2 +
>>  .../sysv/linux/mips/mips32/nofpu/libc.abilist |  2 +
>>  .../sysv/linux/mips/mips64/n32/libc.abilist   |  2 +
>>  .../sysv/linux/mips/mips64/n64/libc.abilist   |  2 +
>>  sysdeps/unix/sysv/linux/nios2/libc.abilist    |  2 +
>>  .../linux/powerpc/powerpc32/fpu/libc.abilist  |  2 +
>>  .../powerpc/powerpc32/nofpu/libc.abilist      |  2 +
>>  .../linux/powerpc/powerpc64/be/libc.abilist   |  2 +
>>  .../linux/powerpc/powerpc64/le/libc.abilist   |  2 +
>>  .../unix/sysv/linux/riscv/rv64/libc.abilist   |  2 +
>>  .../unix/sysv/linux/s390/s390-32/libc.abilist |  2 +
>>  .../unix/sysv/linux/s390/s390-64/libc.abilist |  2 +
>>  sysdeps/unix/sysv/linux/sh/be/libc.abilist    |  2 +
>>  sysdeps/unix/sysv/linux/sh/le/libc.abilist    |  2 +
>>  .../sysv/linux/sparc/sparc32/libc.abilist     |  2 +
>>  .../sysv/linux/sparc/sparc64/libc.abilist     |  2 +
>>  .../unix/sysv/linux/x86_64/64/libc.abilist    |  2 +
>>  .../unix/sysv/linux/x86_64/x32/libc.abilist   |  2 +
>>  42 files changed, 258 insertions(+), 1 deletion(-)
>>  create mode 100644 stdio-common/test-strerr.c
>>  create mode 100644 string/strerrordesc.c
>>  create mode 100644 string/strerrorname.c
>>  create mode 100644 sysdeps/mach/hurd/test-err_np.c
>>
>> diff --git a/NEWS b/NEWS
>> index f504772eb6..888727581b 100644
>> --- a/NEWS
>> +++ b/NEWS
>> @@ -41,6 +41,16 @@ Major new features:
>>    They should be used instead of sys_siglist or sys_sigabbrev and they
>>    are both thread and async-signal safe.  These functions are GNU extensions.
>>  
>> +* The functions strerrorname and strerrordesc have been added.  The
>> +  strerroname returns error number name (i.g. "EINVAL" for EINVAL) while
> 
> s/i.g./e.g./g

Ack.

> 
>> +  strerrordesc returns string describing error number (i.g "Invalid argument"
>> +  for EINVAL).  Different than strerror, strerrordesc does not attempt to
>> +  translate the return description and both functions return NULL for an
>> +  invalid error number.
>> +
>> +  They should be used instead of sys_errlist and sys_nerr and both are
> 
> s/and both/, both/g

Ack.

> 
>> +  thread and async-signal safe.  These functions are GNU extensions.
>> +
>>  Deprecated and removed features, and other changes affecting compatibility:
>>  
>>  * The deprecated <sys/sysctl.h> header and the sysctl function have been
>> diff --git a/include/stdio.h b/include/stdio.h
>> index 9e3bf6fe42..bc67d020d4 100644
>> --- a/include/stdio.h
>> +++ b/include/stdio.h
>> @@ -187,6 +187,7 @@ libc_hidden_proto (__libc_readline_unlocked);
>>  
>>  extern const char *const _sys_errlist_internal[] attribute_hidden;
>>  extern const char *__get_errlist (int) attribute_hidden;
>> +extern const char *__get_errname (int) attribute_hidden;
> 
> OK.
> 
>>  
>>  libc_hidden_ldbl_proto (__asprintf)
>>  
>> diff --git a/manual/errno.texi b/manual/errno.texi
>> index 8cb4ce8b48..dfc4001af0 100644
>> --- a/manual/errno.texi
>> +++ b/manual/errno.texi
>> @@ -1207,6 +1207,29 @@ to @code{errno}.
>>  The function @code{perror} is declared in @file{stdio.h}.
>>  @end deftypefun
>>  
>> +@deftypefun void strerrorname (int @var{errnum})
>> +@standards{GNU, string.h}
>> +@safety{@prelim{}@mtsafe{@mtssigintr{}}@assafe{}@acsafe{}}
> 
> Use @mtsafe{} since it doesn't touch _sigintr.
> 
>> +This function returns the name describing the error @var{errnum} or
>> +@code{NULL} if there is no known E* constant with this value (i.g "EINVAL"> +for @code{EINVAL}).
> 
> s/E*//g

Ack.

> 
>> +
>> +@pindex string.h
>> +This function is a GNU extension, declared in the header file @file{string.h}.
>> +@end deftypefun
>> +
>> +@deftypefun void errdesc_np (int @var{errnum})
>> +@standards{GNU, string.h}
>> +@safety{@prelim{}@mtsafe{@mtssigintr{}}@assafe{}@acsafe{}}
> 
> Use @mtsafe{} since it doesn't touch _sigintr.

Ack.

> 
>> +This function returns the message describing the error @var{errnum} or
>> +@code{NULL} if there is no known E* constant with this value (i.g "Invalid
> 
> s/E*//g
> 
>> +argument" for @code{EINVAL}).  Different than @code{strerror} the returned
>> +description is not translated.
>> +
>> +@pindex string.h
>> +This function is a GNU extension, declared in the header file @file{string.h}.
>> +@end deftypefun
>> +
>>  @code{strerror} and @code{perror} produce the exact same message for any
>>  given error code; the precise text varies from system to system.  With
>>  @theglibc{}, the messages are fairly short; there are no multi-line
>> 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];
>> +}
> 
> OK.
> 
>> +
>>  #include <errlist-compat.c>
>> diff --git a/stdio-common/test-strerr.c b/stdio-common/test-strerr.c
>> new file mode 100644
>> index 0000000000..baa8d8e6d4
>> --- /dev/null
>> +++ b/stdio-common/test-strerr.c
>> @@ -0,0 +1,65 @@
>> +/* Test strerrorname and strerrordesc.
>> +   Copyright (C) 2020 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
> 
> OK.
> 
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#include <string.h>
>> +#include <errno.h>
>> +#include <array_length.h>
>> +
>> +#include <support/support.h>
>> +#include <support/check.h>
>> +
>> +#define N_(name)      name
>> +
>> +static const char *const errlist[] =
>> +  {
>> +/* This file is auto-generated from errlist.def.  */
>> +#include <errlist.h>
> 
> OK. We cross reference the entire errlist.
> 
>> +  };
>> +
>> +#define MSGSTR_T errname_t
>> +#define MSGSTR   errname
>> +#define MSGIDX   errnameidx
>> +#include <errlist-name.h>
>> +#undef MSGSTR
>> +#undef MSGIDX
>> +
>> +static int
>> +do_test (void)
>> +{
>> +  TEST_VERIFY (strerrordesc (-1) == NULL);
>> +  TEST_VERIFY (strerrordesc (array_length (errlist)) == NULL);
> 
> OK.
> 
>> +  for (size_t i = 0; i < array_length (errlist); i++)
>> +    {
>> +      if (errlist[i] == NULL)
>> +        continue;
>> +      TEST_COMPARE_STRING (strerrordesc (i), errlist[i]);
>> +    }
>> +
>> +  TEST_VERIFY (strerrorname (-1) == NULL);
>> +  TEST_VERIFY (strerrorname (array_length (errlist)) == NULL);
>> +  for (size_t i = 0; i < array_length (errlist); i++)
>> +    {
>> +      if (errlist[i] == NULL)
>> +        continue;
>> +      TEST_COMPARE_STRING (strerrorname (i), errname.str + errnameidx[i]);
>> +    }
>> +
>> +  return 0;
>> +}
> 
> OK.
> 
>> +
>> +#include <support/test-driver.c>
>> diff --git a/string/Makefile b/string/Makefile
>> index e5075521b7..fd06409197 100644
>> --- a/string/Makefile
>> +++ b/string/Makefile
>> @@ -45,7 +45,7 @@ routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
>>  		   envz basename					\
>>  		   strcoll_l strxfrm_l string-inlines memrchr		\
>>  		   xpg-strerror strerror_l explicit_bzero		\
>> -		   sigdescr_np sigabbrev_np
>> +		   sigdescr_np sigabbrev_np strerrorname strerrordesc
> 
> Why not _np also?
> 
>>  
>>  strop-tests	:= memchr memcmp memcpy memmove mempcpy memset memccpy	\
>>  		   stpcpy stpncpy strcat strchr strcmp strcpy strcspn	\
>> diff --git a/string/Versions b/string/Versions
>> index 6f8dd2d372..7727fca001 100644
>> --- a/string/Versions
>> +++ b/string/Versions
>> @@ -87,5 +87,6 @@ libc {
>>    }
>>    GLIBC_2.32 {
>>      sigdescr_np; sigabbrev_np;
>> +    strerrordesc; strerrorname;
> 
> Likewise.
> 
>>    }
>>  }
>> diff --git a/string/strerrordesc.c b/string/strerrordesc.c
>> new file mode 100644
>> index 0000000000..f59448f2d1
>> --- /dev/null
>> +++ b/string/strerrordesc.c
>> @@ -0,0 +1,26 @@
>> +/* Return string describing error number.
>> +   Copyright (C) 2020 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#include <stdio.h>
>> +
>> +const char *
>> +__strerrordesc (int errnum)
>> +{
>> +  return __get_errlist (errnum);
>> +}
> 
> OK.
> 
>> +weak_alias (__strerrordesc, strerrordesc)
>> diff --git a/string/strerrorname.c b/string/strerrorname.c
>> new file mode 100644
>> index 0000000000..889ea0d245
>> --- /dev/null
>> +++ b/string/strerrorname.c
>> @@ -0,0 +1,25 @@
>> +/* Return string describing errno name.
>> +   Copyright (C) 2020 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#include <stdio.h>
>> +
>> +const char *
>> +strerrorname (int errnum)
>> +{
>> +  return __get_errname (errnum);
>> +}
> 
> OK.
> 
>> diff --git a/string/string.h b/string/string.h
>> index 0119d7f45d..bb90219ada 100644
>> --- a/string/string.h
>> +++ b/string/string.h
>> @@ -428,6 +428,13 @@ extern int __xpg_strerror_r (int __errnum, char *__buf, size_t __buflen)
>>  extern char *strerror_r (int __errnum, char *__buf, size_t __buflen)
>>       __THROW __nonnull ((2)) __wur  __attr_access ((__write_only__, 2, 3));
>>  # endif
>> +
>> +# ifdef __USE_GNU
> 
> OK. GNU extension.
> 
>> +/* Return a string describing the meaning of tthe error in ERR.  */
>> +extern const char *strerrordesc (int __err) __THROW;
>> +/* Return a string with the error name in ERR.  */
>> +extern const char *strerrorname (int __err) __THROW;
>> +# endif
>>  #endif
>>  
>>  #ifdef __USE_XOPEN2K8
>> diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
>> index ff8ad98d03..193ceba987 100644
>> --- a/sysdeps/mach/hurd/i386/libc.abilist
>> +++ b/sysdeps/mach/hurd/i386/libc.abilist
>> @@ -2181,6 +2181,8 @@ GLIBC_2.3.4 setsourcefilter F
>>  GLIBC_2.3.4 xdr_quad_t F
>>  GLIBC_2.3.4 xdr_u_quad_t F
>>  GLIBC_2.30 twalk_r F
>> +GLIBC_2.32 errdescr_np F
>> +GLIBC_2.32 errname_np F
>>  GLIBC_2.32 mach_print F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> diff --git a/sysdeps/mach/hurd/test-err_np.c b/sysdeps/mach/hurd/test-err_np.c
>> new file mode 100644
>> index 0000000000..3127141128
>> --- /dev/null
>> +++ b/sysdeps/mach/hurd/test-err_np.c
>> @@ -0,0 +1,4 @@
>> +#include <mach/error.h>
>> +
>> +#define ERR_MAP(value) err_get_code (value)
>> +#include <stdio-common/test-err_np.c>
>> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
>> index bb6045d8a6..f0529706ee 100644
>> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
>> @@ -2157,3 +2157,5 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
>> index 8e15a58eaf..ac892eceda 100644
>> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
>> @@ -2239,6 +2239,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 _IO_fprintf F
>>  GLIBC_2.4 _IO_printf F
>>  GLIBC_2.4 _IO_sprintf F
>> diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
>> index ce82b840e8..af574dfb9d 100644
>> --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
>> @@ -141,6 +141,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 _Exit F
>>  GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
>>  GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
>> diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
>> index c7a436cd42..bb0e8bf312 100644
>> --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
>> @@ -138,6 +138,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 _Exit F
>>  GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
>>  GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
>> diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
>> index 7f51d47b2f..8a612ece3e 100644
>> --- a/sysdeps/unix/sysv/linux/csky/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
>> @@ -2101,3 +2101,5 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
>> index 053cda00a4..ccb61a322a 100644
>> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
>> @@ -2060,6 +2060,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
>> index f18de50f9e..bc5329d7b9 100644
>> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
>> @@ -2226,6 +2226,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
>> index a1966cac5a..8f8cbfa80b 100644
>> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
>> @@ -2092,6 +2092,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
>> index 8f44bc9231..802e16ac7d 100644
>> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
>> @@ -142,6 +142,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 _Exit F
>>  GLIBC_2.4 _IO_2_1_stderr_ D 0x98
>>  GLIBC_2.4 _IO_2_1_stdin_ D 0x98
>> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
>> index 088f2fa0f2..62bfa336b8 100644
>> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
>> @@ -2172,6 +2172,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
>> index 34c1c4fdca..680c7b0c77 100644
>> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
>> @@ -2152,3 +2152,5 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
>> index 099d51e893..e102493f6c 100644
>> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
>> @@ -2149,3 +2149,5 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
>> index ea86646c3b..28588017fa 100644
>> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
>> @@ -2143,6 +2143,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
>> index 9adac43e36..64c99116c0 100644
>> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
>> @@ -2141,6 +2141,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
>> index c42c093cfb..7e197736d8 100644
>> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
>> @@ -2149,6 +2149,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
>> index 605e60a35e..e1964effc6 100644
>> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
>> @@ -2143,6 +2143,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
>> index 7a57babca5..f647f86c09 100644
>> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
>> @@ -2190,3 +2190,5 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
>> index c3745c3733..8998f3e0ab 100644
>> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
>> @@ -2199,6 +2199,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 _IO_fprintf F
>>  GLIBC_2.4 _IO_printf F
>>  GLIBC_2.4 _IO_sprintf F
>> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
>> index 719512e999..a96c6d1ce2 100644
>> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
>> @@ -2232,6 +2232,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 _IO_fprintf F
>>  GLIBC_2.4 _IO_printf F
>>  GLIBC_2.4 _IO_sprintf F
>> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
>> index 3f79daa39c..f9f0a9dd93 100644
>> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
>> @@ -2062,6 +2062,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 _IO_fprintf F
>>  GLIBC_2.4 _IO_printf F
>>  GLIBC_2.4 _IO_sprintf F
>> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
>> index af1a2ae8a6..921098b1f3 100644
>> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
>> @@ -2352,3 +2352,5 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
>> index ff5b64c1dd..1e65005b9f 100644
>> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
>> @@ -2119,3 +2119,5 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
>> index 576caca63c..b31811135b 100644
>> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
>> @@ -2197,6 +2197,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 _IO_fprintf F
>>  GLIBC_2.4 _IO_printf F
>>  GLIBC_2.4 _IO_sprintf F
>> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
>> index 7201b10288..c30fc0ef71 100644
>> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
>> @@ -2098,6 +2098,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 _IO_fprintf F
>>  GLIBC_2.4 _IO_printf F
>>  GLIBC_2.4 _IO_sprintf F
>> diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
>> index 4f954ac7ee..9cbe4a650a 100644
>> --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
>> @@ -2067,6 +2067,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
>> index 9db9ba5cc0..c00327a607 100644
>> --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
>> @@ -2064,6 +2064,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
>> index ecb54db317..a990eee8f8 100644
>> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
>> @@ -2188,6 +2188,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 _IO_fprintf F
>>  GLIBC_2.4 _IO_printf F
>>  GLIBC_2.4 _IO_sprintf F
>> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
>> index 74bd6efed8..e988546b20 100644
>> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
>> @@ -2115,6 +2115,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
>> index 50e45a43e8..fa10e68d3a 100644
>> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
>> @@ -2073,6 +2073,8 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>  GLIBC_2.4 __confstr_chk F
>>  GLIBC_2.4 __fgets_chk F
>>  GLIBC_2.4 __fgets_unlocked_chk F
>> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
>> index 59b26b097d..29119996ae 100644
>> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
>> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
>> @@ -2170,3 +2170,5 @@ GLIBC_2.32 pthread_getattr_np F
>>  GLIBC_2.32 pthread_sigmask F
>>  GLIBC_2.32 sigabbrev_np F
>>  GLIBC_2.32 sigdescr_np F
>> +GLIBC_2.32 strerrordesc F
>> +GLIBC_2.32 strerrorname F
>>
> 
> OK.
>
  
Carlos O'Donell July 3, 2020, 9:19 p.m. UTC | #3
On 7/3/20 5:01 PM, Adhemerval Zanella wrote:
> 
> 
> On 02/07/2020 18:43, Carlos O'Donell wrote:
>> On 6/19/20 9:43 AM, Adhemerval Zanella wrote:
>>> The strerrorname returns error number name (i.g. "EINVAL" for EINVAL)
>>> while strerrordesc returns string describing error number (i.g
>>> "Invalid argument" for EINVAL).  Different than strerror, strerrordesc
>>> does not attempt to translate the return description and both functions
>>> return NULL for an invalid error number.
>>>
>>> They should be used instead of sys_errlist and sys_nerr and both are
>>
>> s/and both/, both/g
> 
> Ack.
> 
>>
>>> 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.
>>
>> Why not strerrorname_np or strerrordesc_np? We don't have to use *_np,
>> but these functions are fiarly close in name to 'strerror' and so it
>> might be beneficial to use _np at the end, like you did for sigabbrev_np
>> and sigdescr_np. Thoughts?
> 
> I don't have a strong preference here, on a patch iteration I used 
> the the _np suffix and Florian has pointed out the str* namespace
> is reserved for libc implementations.
> 
> But I think the _np is slight better to indicate it is an extension.
> If it is eventually adopted by other system without the _np suffix
> we can easily create an alias.
> 
> So I have added the _np suffix.
> 
>>
>> No regression on x86_64 and i686.
>>
>> Tested-by: Carlos O'Donell <carlos@redhat.com>
> 
> Should I add the Reviewed-by as well?

No. I want to review the final patch and I'll give Reviewed-by there.
  
Adhemerval Zanella July 3, 2020, 10:34 p.m. UTC | #4
On 03/07/2020 18:19, Carlos O'Donell wrote:
> On 7/3/20 5:01 PM, Adhemerval Zanella wrote:
>>
>>
>> On 02/07/2020 18:43, Carlos O'Donell wrote:
>>> On 6/19/20 9:43 AM, Adhemerval Zanella wrote:
>>>> The strerrorname returns error number name (i.g. "EINVAL" for EINVAL)
>>>> while strerrordesc returns string describing error number (i.g
>>>> "Invalid argument" for EINVAL).  Different than strerror, strerrordesc
>>>> does not attempt to translate the return description and both functions
>>>> return NULL for an invalid error number.
>>>>
>>>> They should be used instead of sys_errlist and sys_nerr and both are
>>>
>>> s/and both/, both/g
>>
>> Ack.
>>
>>>
>>>> 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.
>>>
>>> Why not strerrorname_np or strerrordesc_np? We don't have to use *_np,
>>> but these functions are fiarly close in name to 'strerror' and so it
>>> might be beneficial to use _np at the end, like you did for sigabbrev_np
>>> and sigdescr_np. Thoughts?
>>
>> I don't have a strong preference here, on a patch iteration I used 
>> the the _np suffix and Florian has pointed out the str* namespace
>> is reserved for libc implementations.
>>
>> But I think the _np is slight better to indicate it is an extension.
>> If it is eventually adopted by other system without the _np suffix
>> we can easily create an alias.
>>
>> So I have added the _np suffix.
>>
>>>
>>> No regression on x86_64 and i686.
>>>
>>> Tested-by: Carlos O'Donell <carlos@redhat.com>
>>
>> Should I add the Reviewed-by as well?
> 
> No. I want to review the final patch and I'll give Reviewed-by there.
> 

Alright, should I re-send it with the _np changes?
  
Carlos O'Donell July 6, 2020, 12:43 p.m. UTC | #5
On 7/3/20 6:34 PM, Adhemerval Zanella wrote:
> 
> 
> On 03/07/2020 18:19, Carlos O'Donell wrote:
>> On 7/3/20 5:01 PM, Adhemerval Zanella wrote:
>>>
>>>
>>> On 02/07/2020 18:43, Carlos O'Donell wrote:
>>>> On 6/19/20 9:43 AM, Adhemerval Zanella wrote:
>>>>> The strerrorname returns error number name (i.g. "EINVAL" for EINVAL)
>>>>> while strerrordesc returns string describing error number (i.g
>>>>> "Invalid argument" for EINVAL).  Different than strerror, strerrordesc
>>>>> does not attempt to translate the return description and both functions
>>>>> return NULL for an invalid error number.
>>>>>
>>>>> They should be used instead of sys_errlist and sys_nerr and both are
>>>>
>>>> s/and both/, both/g
>>>
>>> Ack.
>>>
>>>>
>>>>> 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.
>>>>
>>>> Why not strerrorname_np or strerrordesc_np? We don't have to use *_np,
>>>> but these functions are fiarly close in name to 'strerror' and so it
>>>> might be beneficial to use _np at the end, like you did for sigabbrev_np
>>>> and sigdescr_np. Thoughts?
>>>
>>> I don't have a strong preference here, on a patch iteration I used 
>>> the the _np suffix and Florian has pointed out the str* namespace
>>> is reserved for libc implementations.
>>>
>>> But I think the _np is slight better to indicate it is an extension.
>>> If it is eventually adopted by other system without the _np suffix
>>> we can easily create an alias.
>>>
>>> So I have added the _np suffix.
>>>
>>>>
>>>> No regression on x86_64 and i686.
>>>>
>>>> Tested-by: Carlos O'Donell <carlos@redhat.com>
>>>
>>> Should I add the Reviewed-by as well?
>>
>> No. I want to review the final patch and I'll give Reviewed-by there.
>>
> 
> Alright, should I re-send it with the _np changes?
 
Yes please. I think the _np APIs are very clearly intended to be APIs
within a known namespace e.g. str* which are non-portable and then we
can try to get POSIX to standardize on existing practice.
  

Patch

diff --git a/NEWS b/NEWS
index f504772eb6..888727581b 100644
--- a/NEWS
+++ b/NEWS
@@ -41,6 +41,16 @@  Major new features:
   They should be used instead of sys_siglist or sys_sigabbrev and they
   are both thread and async-signal safe.  These functions are GNU extensions.
 
+* The functions strerrorname and strerrordesc have been added.  The
+  strerroname returns error number name (i.g. "EINVAL" for EINVAL) while
+  strerrordesc returns string describing error number (i.g "Invalid argument"
+  for EINVAL).  Different than strerror, strerrordesc does not attempt to
+  translate the return description and both functions return NULL for an
+  invalid error number.
+
+  They should be used instead of sys_errlist and sys_nerr and both are
+  thread and async-signal safe.  These functions are GNU extensions.
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * The deprecated <sys/sysctl.h> header and the sysctl function have been
diff --git a/include/stdio.h b/include/stdio.h
index 9e3bf6fe42..bc67d020d4 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -187,6 +187,7 @@  libc_hidden_proto (__libc_readline_unlocked);
 
 extern const char *const _sys_errlist_internal[] attribute_hidden;
 extern const char *__get_errlist (int) attribute_hidden;
+extern const char *__get_errname (int) attribute_hidden;
 
 libc_hidden_ldbl_proto (__asprintf)
 
diff --git a/manual/errno.texi b/manual/errno.texi
index 8cb4ce8b48..dfc4001af0 100644
--- a/manual/errno.texi
+++ b/manual/errno.texi
@@ -1207,6 +1207,29 @@  to @code{errno}.
 The function @code{perror} is declared in @file{stdio.h}.
 @end deftypefun
 
+@deftypefun void strerrorname (int @var{errnum})
+@standards{GNU, string.h}
+@safety{@prelim{}@mtsafe{@mtssigintr{}}@assafe{}@acsafe{}}
+This function returns the name describing the error @var{errnum} or
+@code{NULL} if there is no known E* constant with this value (i.g "EINVAL"
+for @code{EINVAL}).
+
+@pindex string.h
+This function is a GNU extension, declared in the header file @file{string.h}.
+@end deftypefun
+
+@deftypefun void errdesc_np (int @var{errnum})
+@standards{GNU, string.h}
+@safety{@prelim{}@mtsafe{@mtssigintr{}}@assafe{}@acsafe{}}
+This function returns the message describing the error @var{errnum} or
+@code{NULL} if there is no known E* constant with this value (i.g "Invalid
+argument" for @code{EINVAL}).  Different than @code{strerror} the returned
+description is not translated.
+
+@pindex string.h
+This function is a GNU extension, declared in the header file @file{string.h}.
+@end deftypefun
+
 @code{strerror} and @code{perror} produce the exact same message for any
 given error code; the precise text varies from system to system.  With
 @theglibc{}, the messages are fairly short; there are no multi-line
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>
diff --git a/stdio-common/test-strerr.c b/stdio-common/test-strerr.c
new file mode 100644
index 0000000000..baa8d8e6d4
--- /dev/null
+++ b/stdio-common/test-strerr.c
@@ -0,0 +1,65 @@ 
+/* Test strerrorname and strerrordesc.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <string.h>
+#include <errno.h>
+#include <array_length.h>
+
+#include <support/support.h>
+#include <support/check.h>
+
+#define N_(name)      name
+
+static const char *const errlist[] =
+  {
+/* This file is auto-generated from errlist.def.  */
+#include <errlist.h>
+  };
+
+#define MSGSTR_T errname_t
+#define MSGSTR   errname
+#define MSGIDX   errnameidx
+#include <errlist-name.h>
+#undef MSGSTR
+#undef MSGIDX
+
+static int
+do_test (void)
+{
+  TEST_VERIFY (strerrordesc (-1) == NULL);
+  TEST_VERIFY (strerrordesc (array_length (errlist)) == NULL);
+  for (size_t i = 0; i < array_length (errlist); i++)
+    {
+      if (errlist[i] == NULL)
+        continue;
+      TEST_COMPARE_STRING (strerrordesc (i), errlist[i]);
+    }
+
+  TEST_VERIFY (strerrorname (-1) == NULL);
+  TEST_VERIFY (strerrorname (array_length (errlist)) == NULL);
+  for (size_t i = 0; i < array_length (errlist); i++)
+    {
+      if (errlist[i] == NULL)
+        continue;
+      TEST_COMPARE_STRING (strerrorname (i), errname.str + errnameidx[i]);
+    }
+
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/string/Makefile b/string/Makefile
index e5075521b7..fd06409197 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -45,7 +45,7 @@  routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
 		   envz basename					\
 		   strcoll_l strxfrm_l string-inlines memrchr		\
 		   xpg-strerror strerror_l explicit_bzero		\
-		   sigdescr_np sigabbrev_np
+		   sigdescr_np sigabbrev_np strerrorname strerrordesc
 
 strop-tests	:= memchr memcmp memcpy memmove mempcpy memset memccpy	\
 		   stpcpy stpncpy strcat strchr strcmp strcpy strcspn	\
diff --git a/string/Versions b/string/Versions
index 6f8dd2d372..7727fca001 100644
--- a/string/Versions
+++ b/string/Versions
@@ -87,5 +87,6 @@  libc {
   }
   GLIBC_2.32 {
     sigdescr_np; sigabbrev_np;
+    strerrordesc; strerrorname;
   }
 }
diff --git a/string/strerrordesc.c b/string/strerrordesc.c
new file mode 100644
index 0000000000..f59448f2d1
--- /dev/null
+++ b/string/strerrordesc.c
@@ -0,0 +1,26 @@ 
+/* Return string describing error number.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+
+const char *
+__strerrordesc (int errnum)
+{
+  return __get_errlist (errnum);
+}
+weak_alias (__strerrordesc, strerrordesc)
diff --git a/string/strerrorname.c b/string/strerrorname.c
new file mode 100644
index 0000000000..889ea0d245
--- /dev/null
+++ b/string/strerrorname.c
@@ -0,0 +1,25 @@ 
+/* Return string describing errno name.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+
+const char *
+strerrorname (int errnum)
+{
+  return __get_errname (errnum);
+}
diff --git a/string/string.h b/string/string.h
index 0119d7f45d..bb90219ada 100644
--- a/string/string.h
+++ b/string/string.h
@@ -428,6 +428,13 @@  extern int __xpg_strerror_r (int __errnum, char *__buf, size_t __buflen)
 extern char *strerror_r (int __errnum, char *__buf, size_t __buflen)
      __THROW __nonnull ((2)) __wur  __attr_access ((__write_only__, 2, 3));
 # endif
+
+# ifdef __USE_GNU
+/* Return a string describing the meaning of tthe error in ERR.  */
+extern const char *strerrordesc (int __err) __THROW;
+/* Return a string with the error name in ERR.  */
+extern const char *strerrorname (int __err) __THROW;
+# endif
 #endif
 
 #ifdef __USE_XOPEN2K8
diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
index ff8ad98d03..193ceba987 100644
--- a/sysdeps/mach/hurd/i386/libc.abilist
+++ b/sysdeps/mach/hurd/i386/libc.abilist
@@ -2181,6 +2181,8 @@  GLIBC_2.3.4 setsourcefilter F
 GLIBC_2.3.4 xdr_quad_t F
 GLIBC_2.3.4 xdr_u_quad_t F
 GLIBC_2.30 twalk_r F
+GLIBC_2.32 errdescr_np F
+GLIBC_2.32 errname_np F
 GLIBC_2.32 mach_print F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
diff --git a/sysdeps/mach/hurd/test-err_np.c b/sysdeps/mach/hurd/test-err_np.c
new file mode 100644
index 0000000000..3127141128
--- /dev/null
+++ b/sysdeps/mach/hurd/test-err_np.c
@@ -0,0 +1,4 @@ 
+#include <mach/error.h>
+
+#define ERR_MAP(value) err_get_code (value)
+#include <stdio-common/test-err_np.c>
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index bb6045d8a6..f0529706ee 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -2157,3 +2157,5 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index 8e15a58eaf..ac892eceda 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -2239,6 +2239,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
index ce82b840e8..af574dfb9d 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
@@ -141,6 +141,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
index c7a436cd42..bb0e8bf312 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
@@ -138,6 +138,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
index 7f51d47b2f..8a612ece3e 100644
--- a/sysdeps/unix/sysv/linux/csky/libc.abilist
+++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
@@ -2101,3 +2101,5 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index 053cda00a4..ccb61a322a 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -2060,6 +2060,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index f18de50f9e..bc5329d7b9 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -2226,6 +2226,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
index a1966cac5a..8f8cbfa80b 100644
--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
@@ -2092,6 +2092,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index 8f44bc9231..802e16ac7d 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -142,6 +142,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0x98
 GLIBC_2.4 _IO_2_1_stdin_ D 0x98
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index 088f2fa0f2..62bfa336b8 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -2172,6 +2172,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
index 34c1c4fdca..680c7b0c77 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
@@ -2152,3 +2152,5 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
index 099d51e893..e102493f6c 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
@@ -2149,3 +2149,5 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index ea86646c3b..28588017fa 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -2143,6 +2143,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
index 9adac43e36..64c99116c0 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -2141,6 +2141,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index c42c093cfb..7e197736d8 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -2149,6 +2149,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
index 605e60a35e..e1964effc6 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -2143,6 +2143,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
index 7a57babca5..f647f86c09 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -2190,3 +2190,5 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index c3745c3733..8998f3e0ab 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -2199,6 +2199,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index 719512e999..a96c6d1ce2 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -2232,6 +2232,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
index 3f79daa39c..f9f0a9dd93 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
@@ -2062,6 +2062,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
index af1a2ae8a6..921098b1f3 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
@@ -2352,3 +2352,5 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
index ff5b64c1dd..1e65005b9f 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
@@ -2119,3 +2119,5 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index 576caca63c..b31811135b 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -2197,6 +2197,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
index 7201b10288..c30fc0ef71 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -2098,6 +2098,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
index 4f954ac7ee..9cbe4a650a 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
@@ -2067,6 +2067,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
index 9db9ba5cc0..c00327a607 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
@@ -2064,6 +2064,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index ecb54db317..a990eee8f8 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -2188,6 +2188,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
index 74bd6efed8..e988546b20 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -2115,6 +2115,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index 50e45a43e8..fa10e68d3a 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -2073,6 +2073,8 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
index 59b26b097d..29119996ae 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -2170,3 +2170,5 @@  GLIBC_2.32 pthread_getattr_np F
 GLIBC_2.32 pthread_sigmask F
 GLIBC_2.32 sigabbrev_np F
 GLIBC_2.32 sigdescr_np F
+GLIBC_2.32 strerrordesc F
+GLIBC_2.32 strerrorname F