1 /*
2 FUNCTION
3 	<<strsignal>>---convert signal number to string
4 
5 INDEX
6 	strsignal
7 
8 SYNOPSIS
9 	#include <string.h>
10 	char *strsignal(int <[signal]>);
11 
12 DESCRIPTION
13 <<strsignal>> converts the signal number <[signal]> into a
14 string.  If <[signal]> is not a known signal number, the result
15 will be of the form "Unknown signal NN" where NN is the <[signal]>
16 is a decimal number.
17 
18 RETURNS
19 This function returns a pointer to a string.  Your application must
20 not modify that string.
21 
22 PORTABILITY
23 POSIX.1-2008 C requires <<strsignal>>, but does not specify the strings used
24 for each signal number.
25 
26 <<strsignal>> requires no supporting OS subroutines.
27 
28 QUICKREF
29 	strsignal pure
30 */
31 
32 /*
33  *  Written by Joel Sherrill <joel.sherrill@OARcorp.com>.
34  *
35  *  COPYRIGHT (c) 2010, 2017.
36  *  On-Line Applications Research Corporation (OAR).
37  *
38  *  Permission to use, copy, modify, and distribute this software for any
39  *  purpose without fee is hereby granted, provided that this entire notice
40  *  is included in all copies of any software which is or includes a copy
41  *  or modification of this software.
42  *
43  *  THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
44  *  WARRANTY.  IN PARTICULAR,  THE AUTHOR MAKES NO REPRESENTATION
45  *  OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS
46  *  SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
47  */
48 
49 #define _DEFAULT_SOURCE
50 #include <string.h>
51 #include <signal.h>
52 #include <stdio.h>
53 #include <stdlib.h>
54 
55 char *
strsignal(int signal)56 strsignal (int signal)
57 {
58   char *buffer;
59   static NEWLIB_THREAD_LOCAL char _signal_buf[24];
60 
61   buffer = _signal_buf;
62 #if defined(SIGRTMIN) && defined(SIGRTMAX)
63   if ((signal >= SIGRTMIN) && (signal <= SIGRTMAX)) {
64     sprintf (buffer, "Real-time signal %d", signal - SIGRTMIN);
65     return buffer;
66   }
67 #endif
68 
69   switch (signal) {
70 #ifdef SIGHUP
71     case SIGHUP:
72       buffer = "Hangup";
73       break;
74 #endif
75 #ifdef SIGINT
76     case SIGINT:
77       buffer = "Interrupt";
78       break;
79 #endif
80 #ifdef SIGQUIT
81     case SIGQUIT:
82       buffer = "Quit";
83       break;
84 #endif
85 #ifdef SIGILL
86     case SIGILL:
87       buffer = "Illegal instruction";
88       break;
89 #endif
90 #ifdef SIGTRAP
91     case SIGTRAP:
92       buffer = "Trace/breakpoint trap";
93       break;
94 #endif
95 #ifdef SIGIOT
96   #if  defined(SIGABRT) && (SIGIOT != SIGABRT)
97     case SIGABRT:
98   #endif
99     case SIGIOT:
100       buffer = "IOT trap";
101       break;
102 #endif
103 #ifdef SIGEMT
104     case SIGEMT:
105       buffer = "EMT trap";
106       break;
107 #endif
108 #ifdef SIGFPE
109     case SIGFPE:
110       buffer = "Floating point exception";
111       break;
112 #endif
113 #ifdef SIGKILL
114     case SIGKILL:
115       buffer = "Killed";
116       break;
117 #endif
118 #ifdef SIGBUS
119     case SIGBUS:
120       buffer = "Bus error";
121       break;
122 #endif
123 #ifdef SIGSEGV
124     case SIGSEGV:
125       buffer = "Segmentation fault";
126       break;
127 #endif
128 #ifdef SIGSYS
129     case SIGSYS:
130       buffer = "Bad system call";
131       break;
132 #endif
133 #ifdef SIGPIPE
134     case SIGPIPE:
135       buffer = "Broken pipe";
136       break;
137 #endif
138 #ifdef SIGALRM
139     case SIGALRM:
140       buffer = "Alarm clock";
141       break;
142 #endif
143 #ifdef SIGTERM
144     case SIGTERM:
145       buffer = "Terminated";
146       break;
147 #endif
148 #ifdef SIGURG
149     case SIGURG:
150       buffer = "Urgent I/O condition";
151       break;
152 #endif
153 #ifdef SIGSTOP
154     case SIGSTOP:
155       buffer = "Stopped (signal)";
156       break;
157 #endif
158 #ifdef SIGTSTP
159     case SIGTSTP:
160       buffer = "Stopped";
161       break;
162 #endif
163 #ifdef SIGCONT
164     case SIGCONT:
165       buffer = "Continued";
166       break;
167 #endif
168 #ifdef SIGCHLD
169   #if  defined(SIGCLD) && (SIGCHLD != SIGCLD)
170     case SIGCLD:
171   #endif
172     case SIGCHLD:
173       buffer = "Child exited";
174       break;
175 #endif
176 #ifdef SIGTTIN
177     case SIGTTIN:
178       buffer = "Stopped (tty input)";
179       break;
180 #endif
181 #ifdef SIGTTOUT
182     case SIGTTOUT:
183       buffer = "Stopped (tty output)";
184       break;
185 #endif
186 #ifdef SIGIO
187   #if  defined(SIGPOLL) && (SIGIO != SIGPOLL)
188     case SIGPOLL:
189   #endif
190     case SIGIO:
191       buffer = "I/O possible";
192       break;
193 #endif
194 #ifdef SIGWINCH
195     case SIGWINCH:
196       buffer = "Window changed";
197       break;
198 #endif
199 #ifdef SIGUSR1
200     case SIGUSR1:
201       buffer = "User defined signal 1";
202       break;
203 #endif
204 #ifdef SIGUSR2
205     case SIGUSR2:
206       buffer = "User defined signal 2";
207       break;
208 #endif
209 #ifdef SIGPWR
210     case SIGPWR:
211       buffer = "Power Failure";
212       break;
213 #endif
214 #ifdef SIGXCPU
215     case SIGXCPU:
216       buffer = "CPU time limit exceeded";
217       break;
218 #endif
219 #ifdef SIGXFSZ
220     case SIGXFSZ:
221       buffer = "File size limit exceeded";
222       break;
223 #endif
224 #ifdef SIGVTALRM
225     case SIGVTALRM :
226       buffer = "Virtual timer expired";
227       break;
228 #endif
229 #ifdef SIGPROF
230     case SIGPROF:
231       buffer = "Profiling timer expired";
232       break;
233 #endif
234 #if defined(SIGLOST) && SIGLOST != SIGPWR
235     case SIGLOST:
236       buffer = "Resource lost";
237       break;
238 #endif
239     default:
240       sprintf (buffer, "Unknown signal %d", signal);
241       break;
242   }
243 
244   return buffer;
245 }
246