xref: /freebsd/lib/libc/string/strsignal.c (revision fc7c35283172dbed0e31df879b3586088c73403f)
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];
57fba5c5faSAlexey Zelkin 	int signum, n;
58fba5c5faSAlexey Zelkin 	char *t, *p;
5978121e79SPeter Wemm 
60fba5c5faSAlexey Zelkin #if defined(NLS)
61fba5c5faSAlexey Zelkin 	int saved_errno = errno;
62fba5c5faSAlexey Zelkin 	nl_catd catd;
63fba5c5faSAlexey Zelkin 	catd = catopen("libc", NL_CAT_LOCALE);
64fba5c5faSAlexey Zelkin #endif
6578121e79SPeter Wemm 
66fba5c5faSAlexey Zelkin 	if (num > 0 && num < sys_nsig) {
67fba5c5faSAlexey Zelkin 		strlcpy(ebuf,
68fba5c5faSAlexey Zelkin #if defined(NLS)
69fba5c5faSAlexey Zelkin 			catgets(catd, 2, num, sys_siglist[num]),
70fba5c5faSAlexey Zelkin #else
71fba5c5faSAlexey Zelkin 			sys_siglist[num],
72fba5c5faSAlexey Zelkin #endif
73fba5c5faSAlexey Zelkin 			sizeof(ebuf));
74fba5c5faSAlexey Zelkin 	} else {
75fba5c5faSAlexey Zelkin 		n = strlcpy(ebuf,
76fba5c5faSAlexey Zelkin #if defined(NLS)
77fba5c5faSAlexey Zelkin 			catgets(catd, 2, 0xffff, UPREFIX),
78fba5c5faSAlexey Zelkin #else
79fba5c5faSAlexey Zelkin 			UPREFIX,
80fba5c5faSAlexey Zelkin #endif
81fba5c5faSAlexey Zelkin 			sizeof(ebuf));
82fba5c5faSAlexey Zelkin 	}
83fba5c5faSAlexey Zelkin 
84fba5c5faSAlexey Zelkin 	signum = num;
8578121e79SPeter Wemm 	if (num < 0)
8678121e79SPeter Wemm 		signum = -signum;
87fba5c5faSAlexey Zelkin 
88fba5c5faSAlexey Zelkin 	t = tmp;
8978121e79SPeter Wemm 	do {
9078121e79SPeter Wemm 		*t++ = "0123456789"[signum % 10];
9178121e79SPeter Wemm 	} while (signum /= 10);
9278121e79SPeter Wemm 	if (num < 0)
9378121e79SPeter Wemm 		*t++ = '-';
94fba5c5faSAlexey Zelkin 
95fba5c5faSAlexey Zelkin 	p = (ebuf + n);
96fba5c5faSAlexey Zelkin 	*p++ = ':';
97fba5c5faSAlexey Zelkin 	*p++ = ' ';
98fba5c5faSAlexey Zelkin 
99fba5c5faSAlexey Zelkin 	for (;;) {
10078121e79SPeter Wemm 		*p++ = *--t;
10178121e79SPeter Wemm 		if (t <= tmp)
10278121e79SPeter Wemm 			break;
10378121e79SPeter Wemm 	}
10478121e79SPeter Wemm 	*p = '\0';
105fba5c5faSAlexey Zelkin 
106fba5c5faSAlexey Zelkin #if defined(NLS)
107fba5c5faSAlexey Zelkin 	catclose(catd);
108fba5c5faSAlexey Zelkin 	errno = saved_errno;
109fba5c5faSAlexey Zelkin #endif
11078121e79SPeter Wemm 	return (ebuf);
11178121e79SPeter Wemm }
112