1*8a16b7a1SPedro F. Giffuni /*- 2*8a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 3*8a16b7a1SPedro F. Giffuni * 478121e79SPeter Wemm * Copyright (c) 1988, 1993 578121e79SPeter Wemm * The Regents of the University of California. All rights reserved. 678121e79SPeter Wemm * 778121e79SPeter Wemm * Redistribution and use in source and binary forms, with or without 878121e79SPeter Wemm * modification, are permitted provided that the following conditions 978121e79SPeter Wemm * are met: 1078121e79SPeter Wemm * 1. Redistributions of source code must retain the above copyright 1178121e79SPeter Wemm * notice, this list of conditions and the following disclaimer. 1278121e79SPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright 1378121e79SPeter Wemm * notice, this list of conditions and the following disclaimer in the 1478121e79SPeter Wemm * documentation and/or other materials provided with the distribution. 153fb3b97cSEd Maste * 3. Neither the name of the University nor the names of its contributors 1678121e79SPeter Wemm * may be used to endorse or promote products derived from this software 1778121e79SPeter Wemm * without specific prior written permission. 1878121e79SPeter Wemm * 1978121e79SPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2078121e79SPeter Wemm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2178121e79SPeter Wemm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2278121e79SPeter Wemm * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2378121e79SPeter Wemm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2478121e79SPeter Wemm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2578121e79SPeter Wemm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2678121e79SPeter Wemm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2778121e79SPeter Wemm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2878121e79SPeter Wemm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2978121e79SPeter Wemm * SUCH DAMAGE. 3078121e79SPeter Wemm */ 3178121e79SPeter Wemm 3278121e79SPeter Wemm #if defined(LIBC_SCCS) && !defined(lint) 3378121e79SPeter Wemm static char sccsid[] = "@(#)strerror.c 8.1 (Berkeley) 6/4/93"; 3478121e79SPeter Wemm #endif /* LIBC_SCCS and not lint */ 35de5fe5d5SDavid E. O'Brien #include <sys/cdefs.h> 36de5fe5d5SDavid E. O'Brien __FBSDID("$FreeBSD$"); 3778121e79SPeter Wemm 384f86602cSHajimu UMEMOTO #include "namespace.h" 39fba5c5faSAlexey Zelkin #if defined(NLS) 40fba5c5faSAlexey Zelkin #include <nl_types.h> 41fba5c5faSAlexey Zelkin #endif 42fc7c3528SAlexey Zelkin #include <limits.h> 43fba5c5faSAlexey Zelkin #include <errno.h> 444f86602cSHajimu UMEMOTO #include <stdlib.h> 4578121e79SPeter Wemm #include <string.h> 4678121e79SPeter Wemm #include <signal.h> 474f86602cSHajimu UMEMOTO #include "reentrant.h" 484f86602cSHajimu UMEMOTO #include "un-namespace.h" 4978121e79SPeter Wemm 50fba5c5faSAlexey Zelkin #define UPREFIX "Unknown signal" 51fba5c5faSAlexey Zelkin 524f86602cSHajimu UMEMOTO static char sig_ebuf[NL_TEXTMAX]; 534f86602cSHajimu UMEMOTO static char sig_ebuf_err[NL_TEXTMAX]; 544f86602cSHajimu UMEMOTO static once_t sig_init_once = ONCE_INITIALIZER; 554f86602cSHajimu UMEMOTO static thread_key_t sig_key; 564f86602cSHajimu UMEMOTO static int sig_keycreated = 0; 574f86602cSHajimu UMEMOTO 584f86602cSHajimu UMEMOTO static void 594f86602cSHajimu UMEMOTO sig_keycreate(void) 604f86602cSHajimu UMEMOTO { 614f86602cSHajimu UMEMOTO sig_keycreated = (thr_keycreate(&sig_key, free) == 0); 624f86602cSHajimu UMEMOTO } 634f86602cSHajimu UMEMOTO 644f86602cSHajimu UMEMOTO static char * 654f86602cSHajimu UMEMOTO sig_tlsalloc(void) 664f86602cSHajimu UMEMOTO { 674f86602cSHajimu UMEMOTO char *ebuf = NULL; 684f86602cSHajimu UMEMOTO 694f86602cSHajimu UMEMOTO if (thr_main() != 0) 704f86602cSHajimu UMEMOTO ebuf = sig_ebuf; 714f86602cSHajimu UMEMOTO else { 724f86602cSHajimu UMEMOTO if (thr_once(&sig_init_once, sig_keycreate) != 0 || 734f86602cSHajimu UMEMOTO !sig_keycreated) 744f86602cSHajimu UMEMOTO goto thr_err; 754f86602cSHajimu UMEMOTO if ((ebuf = thr_getspecific(sig_key)) == NULL) { 764f86602cSHajimu UMEMOTO if ((ebuf = malloc(sizeof(sig_ebuf))) == NULL) 774f86602cSHajimu UMEMOTO goto thr_err; 784f86602cSHajimu UMEMOTO if (thr_setspecific(sig_key, ebuf) != 0) { 794f86602cSHajimu UMEMOTO free(ebuf); 804f86602cSHajimu UMEMOTO ebuf = NULL; 814f86602cSHajimu UMEMOTO goto thr_err; 824f86602cSHajimu UMEMOTO } 834f86602cSHajimu UMEMOTO } 844f86602cSHajimu UMEMOTO } 854f86602cSHajimu UMEMOTO thr_err: 864f86602cSHajimu UMEMOTO if (ebuf == NULL) 874f86602cSHajimu UMEMOTO ebuf = sig_ebuf_err; 884f86602cSHajimu UMEMOTO return (ebuf); 894f86602cSHajimu UMEMOTO } 904f86602cSHajimu UMEMOTO 91fba5c5faSAlexey Zelkin /* XXX: negative 'num' ? (REGR) */ 9278121e79SPeter Wemm char * 93fba5c5faSAlexey Zelkin strsignal(int num) 9478121e79SPeter Wemm { 954f86602cSHajimu UMEMOTO char *ebuf; 96fba5c5faSAlexey Zelkin char tmp[20]; 97cea5da04SMaxime Henrion size_t n; 98cea5da04SMaxime Henrion int signum; 99fba5c5faSAlexey Zelkin char *t, *p; 10078121e79SPeter Wemm 101fba5c5faSAlexey Zelkin #if defined(NLS) 102fba5c5faSAlexey Zelkin int saved_errno = errno; 103fba5c5faSAlexey Zelkin nl_catd catd; 104fba5c5faSAlexey Zelkin catd = catopen("libc", NL_CAT_LOCALE); 105fba5c5faSAlexey Zelkin #endif 10678121e79SPeter Wemm 1074f86602cSHajimu UMEMOTO ebuf = sig_tlsalloc(); 1084f86602cSHajimu UMEMOTO 109fba5c5faSAlexey Zelkin if (num > 0 && num < sys_nsig) { 110cea5da04SMaxime Henrion n = strlcpy(ebuf, 111fba5c5faSAlexey Zelkin #if defined(NLS) 112fba5c5faSAlexey Zelkin catgets(catd, 2, num, sys_siglist[num]), 113fba5c5faSAlexey Zelkin #else 114fba5c5faSAlexey Zelkin sys_siglist[num], 115fba5c5faSAlexey Zelkin #endif 1164f86602cSHajimu UMEMOTO sizeof(sig_ebuf)); 117fba5c5faSAlexey Zelkin } else { 118fba5c5faSAlexey Zelkin n = strlcpy(ebuf, 119fba5c5faSAlexey Zelkin #if defined(NLS) 120fba5c5faSAlexey Zelkin catgets(catd, 2, 0xffff, UPREFIX), 121fba5c5faSAlexey Zelkin #else 122fba5c5faSAlexey Zelkin UPREFIX, 123fba5c5faSAlexey Zelkin #endif 1244f86602cSHajimu UMEMOTO sizeof(sig_ebuf)); 125fba5c5faSAlexey Zelkin 126fba5c5faSAlexey Zelkin signum = num; 12778121e79SPeter Wemm if (num < 0) 12878121e79SPeter Wemm signum = -signum; 129fba5c5faSAlexey Zelkin 130fba5c5faSAlexey Zelkin t = tmp; 13178121e79SPeter Wemm do { 13278121e79SPeter Wemm *t++ = "0123456789"[signum % 10]; 13378121e79SPeter Wemm } while (signum /= 10); 13478121e79SPeter Wemm if (num < 0) 13578121e79SPeter Wemm *t++ = '-'; 136fba5c5faSAlexey Zelkin 137fba5c5faSAlexey Zelkin p = (ebuf + n); 138fba5c5faSAlexey Zelkin *p++ = ':'; 139fba5c5faSAlexey Zelkin *p++ = ' '; 140fba5c5faSAlexey Zelkin 141fba5c5faSAlexey Zelkin for (;;) { 14278121e79SPeter Wemm *p++ = *--t; 14378121e79SPeter Wemm if (t <= tmp) 14478121e79SPeter Wemm break; 14578121e79SPeter Wemm } 14678121e79SPeter Wemm *p = '\0'; 147b8d472d7SJilles Tjoelker } 148fba5c5faSAlexey Zelkin 149fba5c5faSAlexey Zelkin #if defined(NLS) 150fba5c5faSAlexey Zelkin catclose(catd); 151fba5c5faSAlexey Zelkin errno = saved_errno; 152fba5c5faSAlexey Zelkin #endif 15378121e79SPeter Wemm return (ebuf); 15478121e79SPeter Wemm } 155