diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-05-18 17:05:05 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-07-07 14:57:14 -0300 |
commit | bfe05aa289054744b68f136b701705cfd242c4de (patch) | |
tree | 72dcbbc0e28edb061e7a25d22b27518acb6f3023 /string | |
parent | 4f92497488c90fea1ef6796c6d564ff5f8a3add6 (diff) | |
download | glibc-bfe05aa289054744b68f136b701705cfd242c4de.tar.gz glibc-bfe05aa289054744b68f136b701705cfd242c4de.tar.xz glibc-bfe05aa289054744b68f136b701705cfd242c4de.zip |
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 <carlos@redhat.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'string')
-rw-r--r-- | string/Makefile | 5 | ||||
-rw-r--r-- | string/Versions | 3 | ||||
-rw-r--r-- | string/sigabbrev_np.c | 33 | ||||
-rw-r--r-- | string/sigdescr_np.c | 34 | ||||
-rw-r--r-- | string/string.h | 8 | ||||
-rw-r--r-- | string/strsignal.c | 9 | ||||
-rw-r--r-- | string/test-sig_np.c | 51 |
7 files changed, 134 insertions, 9 deletions
diff --git a/string/Makefile b/string/Makefile index 2725c86c34..8fe7e17fe2 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 9b709d12a9..6f8dd2d372 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 0000000000..3cbe14e769 --- /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 + <https://www.gnu.org/licenses/>. */ + +#include <string.h> +#include <signal.h> +#include <array_length.h> + +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 0000000000..5bcf814c1d --- /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 + <https://www.gnu.org/licenses/>. */ + +#include <string.h> +#include <signal.h> +#include <array_length.h> + +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 d7ce0f4a1b..0119d7f45d 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 701ce20e6e..a9b911ce6e 100644 --- a/string/strsignal.c +++ b/string/strsignal.c @@ -21,19 +21,14 @@ #include <string.h> #include <libintl.h> #include <tls-internal.h> -#include <array_length.h> /* 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 0000000000..8b5117050c --- /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 + <https://www.gnu.org/licenses/>. */ + +#include <string.h> +#include <signal.h> +#include <array_length.h> + +#include <support/support.h> +#include <support/check.h> + +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 <siglist.h> +#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 <support/test-driver.c> |