@@ -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
@@ -19,35 +19,113 @@
import sys
import argparse
+from enum import Enum
+from collections import OrderedDict
-# The input file should be in the form
+# The input file should be in the form:
#
# VALUE, DESCRIPTION
#
-# An entry for each will be created in the output file in the form:
+# Line that contains an starting '#' are ignored.
+#
+# For mode 'descr' each input line will create an entry in the form
+# on the output file:
#
# [VALUE] = "DESCRIPTION",
+#
+#
+# For mode 'name' the output is in the form:
+#
+# static const union MSGSTR_T {
+# struct {
+# char strN[sizeof("DESCRIPTION_N")],
+# [...]
+# };
+# char str[0];
+# } MSGSTR = { {
+# "DESCRIPTION_N",
+# [...]
+# }};
+# static const TYPE MSGIDX = {
+# [VALUE] = offsetof (union MSGSTR_T, strN),
+# [...]
+# };
+#
+# The description N could be obtained by:
+#
+# MSGSTR_T.str + MSGSTR_T[N]
+
+class Mode(Enum):
+ NAME = 0
+ DESCR = 1
+
+def errlist_name_idx_type(errlist):
+ errlen = sum(len(err) + 1 for err in errlist)
+ if errlen < (1<<8):
+ return 'unsigned char'
+ elif errlen < (1<<16):
+ return 'unsigned short'
+ return 'unsigned int'
+
+def generate_errlist_name(fin, fout):
+ errlist = []
+ for line in fin:
+ if line.lstrip().startswith('#'):
+ continue
+ fields = [f.strip() for f in line.rstrip('\n').split(',')]
+ errlist.append(fields)
+
+ fout.write('static const union MSGSTR_T {\n'
+ ' struct {\n')
+ for idx,item in enumerate(errlist):
+ fout.write (' char str{}[sizeof(\"{}\")];\n'
+ .format(idx, item[1]))
+ fout.write(' };\n'
+ ' char str[0];\n'
+ '} MSGSTR = { {\n')
+ for item in errlist:
+ fout.write (' \"{}\",\n'.format(item[1]))
+ fout.write('} };\n\n');
+
+ fout.write('static const {} MSGIDX[] = {{\n'
+ .format(errlist_name_idx_type(errlist)))
+ for idx,item in enumerate(errlist):
+ fout.write (' [{}] = offsetof (union MSGSTR_T, str{}),\n'
+ .format(item[0], idx))
+ fout.write('};\n')
+
+def generate_errlist_desc(fin, fout):
+ idx = Mode.DESCR.value
+ for line in fin:
+ if line.lstrip().startswith('#'):
+ continue
+ fields = [f.strip() for f in line.rstrip('\n').split(',')]
+ fout.write('[ERR_MAP({})] = N_(\"{}\"),\n'.format(fields[0],
+ fields[idx]))
-def generate_errlist(input_file, output_file):
+def generate_errlist(mode, input_file, output_file):
with open(input_file, 'r') as fin, open(output_file, 'w') as fout:
fout.write("#ifndef ERR_MAP\n")
fout.write("#define ERR_MAP(value) value\n")
fout.write("#endif\n")
- for line in fin:
- if line.lstrip().startswith('#'):
- continue
- fields = [f.strip() for f in line.rstrip('\n').split(',')]
- fout.write("[ERR_MAP(%s)] = N_(\"%s\"),\n" % (fields[0],
- fields[1]))
+ if mode == Mode.NAME:
+ generate_errlist_name(fin, fout)
+ else:
+ generate_errlist_desc(fin, fout)
def main():
parser = argparse.ArgumentParser(description='Generate errlist.h')
+ parser.add_argument('-m', dest='mode',
+ help='Output mode', default='name',
+ choices=('name', 'desc'),
+ required=True)
parser.add_argument('-i', dest='input', metavar='FILE',
help='Error definitions')
parser.add_argument('-o', dest='output', metavar='FILE',
help='Include file')
args = parser.parse_args()
- generate_errlist(args.input, args.output)
+ generate_errlist(Mode.NAME if args.mode == 'name' else Mode.DESCR,
+ args.input, args.output)
if __name__ == '__main__':
main()
@@ -66,7 +66,8 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
tst-scanf-round \
tst-renameat2 tst-bz11319 tst-bz11319-fortify2 \
scanf14a scanf16a \
- tst-printf-bz25691
+ tst-printf-bz25691 \
+ test-strerr
test-srcs = tst-unbputc tst-printf tst-printfsz-islongdouble
@@ -92,10 +93,17 @@ errlist-def = $(firstword $(wildcard $(addsuffix /errlist.def,$(sysdirs) .)))
$(objpfx)errlist.h: $(errlist-def) \
$(..)scripts/gen-errlist.py
- $(PYTHON) $(..)scripts/gen-errlist.py -i $(errlist-def) -o $@
+ $(PYTHON) $(..)scripts/gen-errlist.py -m desc -i $(errlist-def) -o $@
+
+$(objpfx)errlist-name.h: $(errlist-def) \
+ $(..)scripts/gen-errlist.py
+ $(PYTHON) $(..)scripts/gen-errlist.py -m name -i $(errlist-def) -o $@
+
+$(foreach o,$(object-suffixes) $(object-suffixes:=.d),\
+ $(objpfx)errlist$o): $(objpfx)errlist.h $(objpfx)errlist-name.h
$(foreach o,$(object-suffixes) $(object-suffixes:=.d),\
- $(objpfx)errlist$o): $(objpfx)errlist.h
+ $(objpfx)test-err_np$o): $(objpfx)errlist.h $(objpfx)errlist-name.h
ifeq ($(run-built-tests),yes)
LOCALES := de_DE.ISO-8859-1 de_DE.UTF-8 en_US.ISO-8859-1 ja_JP.EUC-JP
@@ -34,4 +34,20 @@ __get_errlist (int errnum)
return NULL;
}
+#define MSGSTR_T sys_errname_t
+#define MSGSTR _sys_errname
+#define MSGIDX _sys_errnameidx
+#include <errlist-name.h>
+#undef MSGSTR
+#undef MSGIDX
+
+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
@@ -18,4 +18,3 @@
#include <mach/error.h>
#define ERR_MAP(value) err_get_code (value)
-#include <stdio-common/errlist.c>
@@ -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