From bfe05aa289054744b68f136b701705cfd242c4de Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Mon, 18 May 2020 17:05:05 -0300 Subject: string: Add sigabbrev_np and sigdescr_np The sigabbrev_np returns the abbreviated signal name (e.g. "HUP" for SIGHUP) while sigdescr_np returns the string describing the error number (e.g "Hangup" for SIGHUP). Different than strsignal, sigdescr_np does not attempt to translate the return description and both functions return NULL for an invalid signal number. They should be used instead of sys_siglist or sys_sigabbrev and they are both thread and async-signal safe. They are added as GNU extensions on string.h header (same as strsignal). Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu, and s390x-linux-gnu. Tested-by: Carlos O'Donell Reviewed-by: Carlos O'Donell --- string/Makefile | 5 +++-- string/Versions | 3 +++ string/sigabbrev_np.c | 33 +++++++++++++++++++++++++++++++++ string/sigdescr_np.c | 34 ++++++++++++++++++++++++++++++++++ string/string.h | 8 ++++++++ string/strsignal.c | 9 ++------- string/test-sig_np.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 134 insertions(+), 9 deletions(-) create mode 100644 string/sigabbrev_np.c create mode 100644 string/sigdescr_np.c create mode 100644 string/test-sig_np.c (limited to 'string') diff --git a/string/Makefile b/string/Makefile index 2725c86..8fe7e17 100644 --- a/string/Makefile +++ b/string/Makefile @@ -44,7 +44,8 @@ routines := strcat strchr strcmp strcoll strcpy strcspn \ addsep replace) \ envz basename \ strcoll_l strxfrm_l string-inlines memrchr \ - xpg-strerror strerror_l explicit_bzero + xpg-strerror strerror_l explicit_bzero \ + sigdescr_np sigabbrev_np strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \ stpcpy stpncpy strcat strchr strcmp strcpy strcspn \ @@ -61,7 +62,7 @@ tests := tester inl-tester noinl-tester testcopy test-ffs \ tst-strtok_r bug-strcoll2 tst-cmp tst-xbzero-opt \ test-endian-types test-endian-file-scope \ test-endian-sign-conversion tst-memmove-overflow \ - tst-strsignal tst-strerror + tst-strsignal tst-strerror test-sig_np # This test allocates a lot of memory and can run for a long time. xtests = tst-strcoll-overflow diff --git a/string/Versions b/string/Versions index 9b709d1..6f8dd2d 100644 --- a/string/Versions +++ b/string/Versions @@ -85,4 +85,7 @@ libc { GLIBC_2.25 { explicit_bzero; } + GLIBC_2.32 { + sigdescr_np; sigabbrev_np; + } } diff --git a/string/sigabbrev_np.c b/string/sigabbrev_np.c new file mode 100644 index 0000000..3cbe14e --- /dev/null +++ b/string/sigabbrev_np.c @@ -0,0 +1,33 @@ +/* Return string describing signal abbreviation. + 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 + . */ + +#include +#include +#include + +const char *const +sigabbrev_np (int signum) +{ + const char *abbrev = NULL; + + if (signum >= 0 && signum <= NSIG + && signum < array_length (__sys_sigabbrev)) + abbrev = __sys_sigabbrev[signum]; + + return abbrev; +} diff --git a/string/sigdescr_np.c b/string/sigdescr_np.c new file mode 100644 index 0000000..5bcf814 --- /dev/null +++ b/string/sigdescr_np.c @@ -0,0 +1,34 @@ +/* Return string describing signal. + 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 + . */ + +#include +#include +#include + +const char *const +__sigdescr_np (int signum) +{ + const char *descr = NULL; + + if (signum >= 0 && signum <= NSIG && signum < array_length (__sys_siglist)) + descr = __sys_siglist[signum]; + + return descr; +} +libc_hidden_def (__sigdescr_np) +weak_alias (__sigdescr_np, sigdescr_np) diff --git a/string/string.h b/string/string.h index d7ce0f4..0119d7f 100644 --- a/string/string.h +++ b/string/string.h @@ -454,6 +454,14 @@ extern char *strsep (char **__restrict __stringp, /* Return a string describing the meaning of the signal number in SIG. */ extern char *strsignal (int __sig) __THROW; +# ifdef __USE_GNU +/* Return an abbreviation string for the signal number SIG. */ +extern const char *sigabbrev_np (int __sig) __THROW; +/* Return a string describing the meaning of the signal number in SIG, + the result is not translated. */ +extern const char *sigdescr_np (int __sig) __THROW; +# endif + /* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */ extern char *__stpcpy (char *__restrict __dest, const char *__restrict __src) __THROW __nonnull ((1, 2)); diff --git a/string/strsignal.c b/string/strsignal.c index 701ce20..a9b911c 100644 --- a/string/strsignal.c +++ b/string/strsignal.c @@ -21,19 +21,14 @@ #include #include #include -#include /* Return a string describing the meaning of the signal number SIGNUM. */ char * strsignal (int signum) { - const char *desc = NULL; - - if (signum >= 0 && signum <= NSIG && signum < array_length (__sys_siglist)) - desc = __sys_siglist[signum]; - + const char *desc = __sigdescr_np (signum); if (desc != NULL) - return (char *) _(desc); + return _(desc); struct tls_internal_t *tls_internal = __glibc_tls_internal (); free (tls_internal->strsignal_buf); diff --git a/string/test-sig_np.c b/string/test-sig_np.c new file mode 100644 index 0000000..8b51170 --- /dev/null +++ b/string/test-sig_np.c @@ -0,0 +1,51 @@ +/* Test and sigabbrev_np and sigdescr_np. + 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 + . */ + +#include +#include +#include + +#include +#include + +static const struct test_t +{ + int errno; + const char *abbrev; + const char *descr; +} tests[] = +{ +#define N_(name) name +#define init_sig(sig, abbrev, desc) { sig, abbrev, desc }, +#include +#undef init_sig +}; + +static int +do_test (void) +{ + for (size_t i = 0; i < array_length (tests); i++) + { + TEST_COMPARE_STRING (sigabbrev_np (tests[i].errno), tests[i].abbrev); + TEST_COMPARE_STRING (sigdescr_np (tests[i].errno), tests[i].descr); + } + + return 0; +} + +#include -- cgit v1.1