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