@@ -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
@@ -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)
@@ -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
@@ -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>
new file mode 100644
@@ -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>
@@ -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 \
@@ -87,5 +87,6 @@ libc {
}
GLIBC_2.32 {
sigdescr_np; sigabbrev_np;
+ strerrordesc; strerrorname;
}
}
new file mode 100644
@@ -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)
new file mode 100644
@@ -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);
+}
@@ -428,6 +428,11 @@ 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
+extern const char *strerrordesc (int __err) __THROW;
+extern const char *strerrorname (int __err) __THROW;
+# endif
#endif
#ifdef __USE_XOPEN2K8
@@ -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
new file mode 100644
@@ -0,0 +1,4 @@
+#include <mach/error.h>
+
+#define ERR_MAP(value) err_get_code (value)
+#include <stdio-common/test-err_np.c>
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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