xref: /freebsd/lib/libc/string/strsignal.c (revision cea5da0456112ac3867777e926339e4a86293572)
178121e79SPeter Wemm /*
278121e79SPeter Wemm  * Copyright (c) 1988, 1993
378121e79SPeter Wemm  *	The Regents of the University of California.  All rights reserved.
478121e79SPeter Wemm  *
578121e79SPeter Wemm  * Redistribution and use in source and binary forms, with or without
678121e79SPeter Wemm  * modification, are permitted provided that the following conditions
778121e79SPeter Wemm  * are met:
878121e79SPeter Wemm  * 1. Redistributions of source code must retain the above copyright
978121e79SPeter Wemm  *    notice, this list of conditions and the following disclaimer.
1078121e79SPeter Wemm  * 2. Redistributions in binary form must reproduce the above copyright
1178121e79SPeter Wemm  *    notice, this list of conditions and the following disclaimer in the
1278121e79SPeter Wemm  *    documentation and/or other materials provided with the distribution.
1378121e79SPeter Wemm  * 3. All advertising materials mentioning features or use of this software
1478121e79SPeter Wemm  *    must display the following acknowledgement:
1578121e79SPeter Wemm  *	This product includes software developed by the University of
1678121e79SPeter Wemm  *	California, Berkeley and its contributors.
1778121e79SPeter Wemm  * 4. Neither the name of the University nor the names of its contributors
1878121e79SPeter Wemm  *    may be used to endorse or promote products derived from this software
1978121e79SPeter Wemm  *    without specific prior written permission.
2078121e79SPeter Wemm  *
2178121e79SPeter Wemm  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2278121e79SPeter Wemm  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2378121e79SPeter Wemm  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2478121e79SPeter Wemm  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2578121e79SPeter Wemm  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2678121e79SPeter Wemm  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2778121e79SPeter Wemm  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2878121e79SPeter Wemm  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2978121e79SPeter Wemm  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3078121e79SPeter Wemm  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3178121e79SPeter Wemm  * SUCH DAMAGE.
3278121e79SPeter Wemm  */
3378121e79SPeter Wemm 
3478121e79SPeter Wemm #if defined(LIBC_SCCS) && !defined(lint)
3578121e79SPeter Wemm static char sccsid[] = "@(#)strerror.c	8.1 (Berkeley) 6/4/93";
3678121e79SPeter Wemm #endif /* LIBC_SCCS and not lint */
37de5fe5d5SDavid E. O'Brien #include <sys/cdefs.h>
38de5fe5d5SDavid E. O'Brien __FBSDID("$FreeBSD$");
3978121e79SPeter Wemm 
40fba5c5faSAlexey Zelkin #if defined(NLS)
41fba5c5faSAlexey Zelkin #include <nl_types.h>
42fba5c5faSAlexey Zelkin #endif
43fba5c5faSAlexey Zelkin 
44fc7c3528SAlexey Zelkin #include <limits.h>
45fba5c5faSAlexey Zelkin #include <errno.h>
4678121e79SPeter Wemm #include <string.h>
4778121e79SPeter Wemm #include <signal.h>
4878121e79SPeter Wemm 
49fba5c5faSAlexey Zelkin #define	UPREFIX		"Unknown signal"
50fba5c5faSAlexey Zelkin 
51fba5c5faSAlexey Zelkin /* XXX: negative 'num' ? (REGR) */
5278121e79SPeter Wemm char *
53fba5c5faSAlexey Zelkin strsignal(int num)
5478121e79SPeter Wemm {
55fba5c5faSAlexey Zelkin 	static char ebuf[NL_TEXTMAX];
56fba5c5faSAlexey Zelkin 	char tmp[20];
57cea5da04SMaxime Henrion 	size_t n;
58cea5da04SMaxime Henrion 	int signum;
59fba5c5faSAlexey Zelkin 	char *t, *p;
6078121e79SPeter Wemm 
61fba5c5faSAlexey Zelkin #if defined(NLS)
62fba5c5faSAlexey Zelkin 	int saved_errno = errno;
63fba5c5faSAlexey Zelkin 	nl_catd catd;
64fba5c5faSAlexey Zelkin 	catd = catopen("libc", NL_CAT_LOCALE);
65fba5c5faSAlexey Zelkin #endif
6678121e79SPeter Wemm 
67fba5c5faSAlexey Zelkin 	if (num > 0 && num < sys_nsig) {
68cea5da04SMaxime Henrion 		n = strlcpy(ebuf,
69fba5c5faSAlexey Zelkin #if defined(NLS)
70fba5c5faSAlexey Zelkin 			catgets(catd, 2, num, sys_siglist[num]),
71fba5c5faSAlexey Zelkin #else
72fba5c5faSAlexey Zelkin 			sys_siglist[num],
73fba5c5faSAlexey Zelkin #endif
74fba5c5faSAlexey Zelkin 			sizeof(ebuf));
75fba5c5faSAlexey Zelkin 	} else {
76fba5c5faSAlexey Zelkin 		n = strlcpy(ebuf,
77fba5c5faSAlexey Zelkin #if defined(NLS)
78fba5c5faSAlexey Zelkin 			catgets(catd, 2, 0xffff, UPREFIX),
79fba5c5faSAlexey Zelkin #else
80fba5c5faSAlexey Zelkin 			UPREFIX,
81fba5c5faSAlexey Zelkin #endif
82fba5c5faSAlexey Zelkin 			sizeof(ebuf));
83fba5c5faSAlexey Zelkin 	}
84fba5c5faSAlexey Zelkin 
85fba5c5faSAlexey Zelkin 	signum = num;
8678121e79SPeter Wemm 	if (num < 0)
8778121e79SPeter Wemm 		signum = -signum;
88fba5c5faSAlexey Zelkin 
89fba5c5faSAlexey Zelkin 	t = tmp;
9078121e79SPeter Wemm 	do {
9178121e79SPeter Wemm 		*t++ = "0123456789"[signum % 10];
9278121e79SPeter Wemm 	} while (signum /= 10);
9378121e79SPeter Wemm 	if (num < 0)
9478121e79SPeter Wemm 		*t++ = '-';
95fba5c5faSAlexey Zelkin 
96fba5c5faSAlexey Zelkin 	p = (ebuf + n);
97fba5c5faSAlexey Zelkin 	*p++ = ':';
98fba5c5faSAlexey Zelkin 	*p++ = ' ';
99fba5c5faSAlexey Zelkin 
100fba5c5faSAlexey Zelkin 	for (;;) {
10178121e79SPeter Wemm 		*p++ = *--t;
10278121e79SPeter Wemm 		if (t <= tmp)
10378121e79SPeter Wemm 			break;
10478121e79SPeter Wemm 	}
10578121e79SPeter Wemm 	*p = '\0';
106fba5c5faSAlexey Zelkin 
107fba5c5faSAlexey Zelkin #if defined(NLS)
108fba5c5faSAlexey Zelkin 	catclose(catd);
109fba5c5faSAlexey Zelkin 	errno = saved_errno;
110fba5c5faSAlexey Zelkin #endif
11178121e79SPeter Wemm 	return (ebuf);
11278121e79SPeter Wemm }
113