[uClibc] [patch] fix strsignal on some archs

Atsushi Nemoto anemo at mba.ocn.ne.jp
Thu Sep 11 09:37:31 UTC 2003


On some architecures, strsignal returns wrong message due to
difference of actual signal number.  I fixed this using same approach
as errno.  This is a patch (tested on mips only).

diff -urN uClibc-0.9.21.org/libc/string/wstring.c uClibc-0.9.21/libc/string/wstring.c
--- uClibc-0.9.21.org/libc/string/wstring.c	Sun Aug 24 12:49:11 2003
+++ uClibc-0.9.21/libc/string/wstring.c	Thu Sep 11 17:07:28 2003
@@ -2141,6 +2141,9 @@
 	/*  29:  445, 13 */ "I/O possible\0"
 	/*  30:  458, 14 */ "Power failure\0"
 	/*  31:  472, 16 */ "Bad system call"
+#if defined(__alpha__) || defined(__mips__) || defined(__hppa__) || defined(__sparc__)
+	/*  32:  488,  9 */ "\0EMT trap"
+#endif
 };
 
 #endif
@@ -2149,70 +2152,43 @@
 #if defined(L_sys_siglist) && defined(__UCLIBC_HAS_SYS_SIGLIST__)
 
 const char *const sys_siglist[_NSIG] = {
-	NULL,
-	_string_syssigmsgs + 1,
-	_string_syssigmsgs + 8,
-	_string_syssigmsgs + 18,
-	_string_syssigmsgs + 23,
-	_string_syssigmsgs + 43,
-	_string_syssigmsgs + 65,
-	_string_syssigmsgs + 73,
-	_string_syssigmsgs + 83,
-	_string_syssigmsgs + 108,
-	_string_syssigmsgs + 115,
-	_string_syssigmsgs + 137,
-	_string_syssigmsgs + 156,
-	_string_syssigmsgs + 178,
-	_string_syssigmsgs + 190,
-	_string_syssigmsgs + 202,
-	_string_syssigmsgs + 213,
-	_string_syssigmsgs + 225,
-	_string_syssigmsgs + 238,
-	_string_syssigmsgs + 248,
-	_string_syssigmsgs + 265,
-	_string_syssigmsgs + 273,
-	_string_syssigmsgs + 293,
-	_string_syssigmsgs + 314,
-	_string_syssigmsgs + 335,
-	_string_syssigmsgs + 359,
-	_string_syssigmsgs + 384,
-	_string_syssigmsgs + 406,
-	_string_syssigmsgs + 430,
-	_string_syssigmsgs + 445,
-	_string_syssigmsgs + 458,
-	_string_syssigmsgs + 472,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	NULL,
+	[0] =		NULL,
+	[SIGHUP] =	_string_syssigmsgs + 1,
+	[SIGINT] =	_string_syssigmsgs + 8,
+	[SIGQUIT] =	_string_syssigmsgs + 18,
+	[SIGILL] =	_string_syssigmsgs + 23,
+	[SIGTRAP] =	_string_syssigmsgs + 43,
+	[SIGABRT] =	_string_syssigmsgs + 65,
+	[SIGBUS] =	_string_syssigmsgs + 73,
+	[SIGFPE] =	_string_syssigmsgs + 83,
+	[SIGKILL] =	_string_syssigmsgs + 108,
+	[SIGUSR1] =	_string_syssigmsgs + 115,
+	[SIGSEGV] =	_string_syssigmsgs + 137,
+	[SIGUSR2] =	_string_syssigmsgs + 156,
+	[SIGPIPE] =	_string_syssigmsgs + 178,
+	[SIGALRM] =	_string_syssigmsgs + 190,
+	[SIGTERM] =	_string_syssigmsgs + 202,
+#if !(defined(__alpha__) || defined(__mips__) || defined(__sparc__))
+	[SIGSTKFLT] =	_string_syssigmsgs + 213,
+#endif
+	[SIGCHLD] =	_string_syssigmsgs + 225,
+	[SIGCONT] =	_string_syssigmsgs + 238,
+	[SIGSTOP] =	_string_syssigmsgs + 248,
+	[SIGTSTP] =	_string_syssigmsgs + 265,
+	[SIGTTIN] =	_string_syssigmsgs + 273,
+	[SIGTTOU] =	_string_syssigmsgs + 293,
+	[SIGURG] =	_string_syssigmsgs + 314,
+	[SIGXCPU] =	_string_syssigmsgs + 335,
+	[SIGXFSZ] =	_string_syssigmsgs + 359,
+	[SIGVTALRM] =	_string_syssigmsgs + 384,
+	[SIGPROF] =	_string_syssigmsgs + 406,
+	[SIGWINCH] =	_string_syssigmsgs + 430,
+	[SIGIO] =	_string_syssigmsgs + 445,
+	[SIGPWR] =	_string_syssigmsgs + 458,
+	[SIGSYS] =	_string_syssigmsgs + 472,
+#if defined(__alpha__) || defined(__mips__) || defined(__hppa__) || defined(__sparc__)
+	[SIGEMT] =	_string_syssigmsgs + 488,
+#endif
 };
 
 #endif
@@ -2223,6 +2199,50 @@
 
 #ifdef __UCLIBC_HAS_SIGNUM_MESSAGES__
 
+#if defined(__alpha__) || defined(__mips__) || defined(__hppa__) || defined(__sparc__)
+static const unsigned char sstridx[] = {
+	0,
+	SIGHUP,
+	SIGINT,
+	SIGQUIT,
+	SIGILL,
+	SIGTRAP,
+	SIGIOT,
+	SIGBUS,
+	SIGFPE,
+	SIGKILL,
+	SIGUSR1,
+	SIGSEGV,
+	SIGUSR2,
+	SIGPIPE,
+	SIGALRM,
+	SIGTERM,
+#if defined(__alpha__) || defined(__mips__) || defined(__sparc__)
+	0,
+#else
+	SIGSTKFLT,
+#endif
+	SIGCHLD,
+	SIGCONT,
+	SIGSTOP,
+	SIGTSTP,
+	SIGTTIN,
+	SIGTTOU,
+	SIGURG,
+	SIGXCPU,
+	SIGXFSZ,
+	SIGVTALRM,
+	SIGPROF,
+	SIGWINCH,
+	SIGIO,
+	SIGPWR,
+	SIGSYS,
+#if defined(__alpha__) || defined(__mips__) || defined(__hppa__) || defined(__sparc__)
+	SIGEMT,
+#endif
+};
+#endif
+
 char *strsignal(int signum)
 {
     register char *s;
@@ -2232,12 +2252,26 @@
 		'U', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 's', 'i', 'g', 'n', 'a', 'l', ' '
     };
 
+#if defined(__alpha__) || defined(__mips__) || defined(__hppa__) || defined(__sparc__)
+	/* Need to translate signum to string index. */
+	for (i = 0 ; i < sizeof(sstridx)/sizeof(sstridx[0]) ; i++) {
+		if (sstridx[i] == signum) {
+			goto GOT_SSTRIDX;
+		}
+	}
+	i = INT_MAX;	/* Failed. */
+ GOT_SSTRIDX:
+#else
+	/* No errno to string index translation needed. */
+	i = signum;
+#endif
+
     if (((unsigned int) signum) < _SYS_NSIG) {
 		/* Trade time for space.  This function should rarely be called
 		 * so rather than keeping an array of pointers for the different
 		 * messages, just run through the buffer until we find the
 		 * correct string. */
-		for (s = (char *) _string_syssigmsgs, i = signum ; i ; ++s) {
+		for (s = (char *) _string_syssigmsgs ; i ; ++s) {
 			if (!*s) {
 				--i;
 			}
---
Atsushi Nemoto



More information about the uClibc mailing list