diff options
Diffstat (limited to 'newlib/libc/string/strsignal.c')
-rw-r--r-- | newlib/libc/string/strsignal.c | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/newlib/libc/string/strsignal.c b/newlib/libc/string/strsignal.c new file mode 100644 index 000000000..6d39e8b75 --- /dev/null +++ b/newlib/libc/string/strsignal.c @@ -0,0 +1,256 @@ +/* +FUNCTION + <<strsignal>>---convert signal number to string + +INDEX + strsignal + +ANSI_SYNOPSIS + #include <string.h> + char *strsignal(int <[signal]>); + +TRAD_SYNOPSIS + #include <string.h> + char *strsignal(<[signal]>) + int <[signal]>; + +DESCRIPTION +<<strsignal>> converts the signal number <[signal]> into a +string. If <[signal]> is not a known signal number, the result +will be of the form "Unknown signal NN" where NN is the <[signal]> +is a decimal number. + +RETURNS +This function returns a pointer to a string. Your application must +not modify that string. + +PORTABILITY +POSIX.1-2008 C requires <<strsignal>>, but does not specify the strings used +for each signal number. + +<<strsignal>> requires no supporting OS subroutines. + +QUICKREF + strsignal pure +*/ + +/* + * Written by Joel Sherrill <joel.sherrill@OARcorp.com>. + * + * COPYRIGHT (c) 2010. + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + * $Id$ + */ + +#include <string.h> +#include <signal.h> +#include <stdio.h> +#include <reent.h> + +char * +_DEFUN (strsignal, (signal), + int signal) +{ + char *buffer; + struct _reent *ptr; + + ptr = _REENT; + + _REENT_CHECK_SIGNAL_BUF(ptr); + buffer = _REENT_SIGNAL_BUF(ptr); + +#if defined(SIGRTMIN) && defined(SIGRTMAX) + if ((signal >= SIGRTMIN) || (signal <= SIGRTMAX)) { + siprintf (buffer, "Real-time signal %d", signal - SIGRTMIN); + return buffer; + } +#endif + + switch (signal) { +#ifdef SIGHUP + case SIGHUP: + buffer = "Hangup"; + break; +#endif +#ifdef SIGINT + case SIGINT: + buffer = "Interrupt"; + break; +#endif +#ifdef SIGQUIT + case SIGQUIT: + buffer = "Quit"; + break; +#endif +#ifdef SIGILL + case SIGILL: + buffer = "Illegal instruction"; + break; +#endif +#ifdef SIGTRAP + case SIGTRAP: + buffer = "Trace/breakpoint trap"; + break; +#endif +#ifdef SIGIOT + #if defined(SIGABRT) && (SIGIOT != SIGABRT) + case SIGABRT: + #endif + case SIGIOT: + buffer = "IOT trap"; + break; +#endif +#ifdef SIGEMT + case SIGEMT: + buffer = "EMT trap"; + break; +#endif +#ifdef SIGFPE + case SIGFPE: + buffer = "Floating point exception"; + break; +#endif +#ifdef SIGKILL + case SIGKILL: + buffer = "Killed"; + break; +#endif +#ifdef SIGBUS + case SIGBUS: + buffer = "Bus error"; + break; +#endif +#ifdef SIGSEGV + case SIGSEGV: + buffer = "Segmentation fault"; + break; +#endif +#ifdef SIGSYS + case SIGSYS: + buffer = "Bad system call"; + break; +#endif +#ifdef SIGPIPE + case SIGPIPE: + buffer = "Broken pipe"; + break; +#endif +#ifdef SIGALRM + case SIGALRM: + buffer = "Alarm clock"; + break; +#endif +#ifdef SIGTERM + case SIGTERM: + buffer = "Terminated"; + break; +#endif +#ifdef SIGURG + case SIGURG: + buffer = "Urgent I/O condition"; + break; +#endif +#ifdef SIGSTOP + case SIGSTOP: + buffer = "Stopped (signal)"; + break; +#endif +#ifdef SIGTSTP + case SIGTSTP: + buffer = "Stopped"; + break; +#endif +#ifdef SIGCONT + case SIGCONT: + buffer = "Continued"; + break; +#endif +#ifdef SIGCHLD + #if defined(SIGCLD) && (SIGCHLD != SIGCLD) + case SIGCLD: + #endif + case SIGCHLD: + buffer = "Child exited"; + break; +#endif +#ifdef SIGTTIN + case SIGTTIN: + buffer = "Stopped (tty input)"; + break; +#endif +#ifdef SIGTTOUT + case SIGTTOUT: + buffer = "Stopped (tty output)"; + break; +#endif +#ifdef SIGIO + #if defined(SIGPOLL) && (SIGIO != SIGPOLL) + case SIGPOLL: + #endif + case SIGIO: + buffer = "I/O possible"; + break; +#endif +#ifdef SIGWINCH + case SIGWINCH: + buffer = "Window changed"; + break; +#endif +#ifdef SIGUSR1 + case SIGUSR1: + buffer = "User defined signal 1"; + break; +#endif +#ifdef SIGUSR2 + case SIGUSR2: + buffer = "User defined signal 2"; + break; +#endif +#ifdef SIGPWR + case SIGPWR: + buffer = "Power Failure"; + break; +#endif +#ifdef SIGXCPU + case SIGXCPU: + buffer = "CPU time limit exceeded"; + break; +#endif +#ifdef SIGXFSZ + case SIGXFSZ: + buffer = "File size limit exceeded"; + break; +#endif +#ifdef SIGVTALRM + case SIGVTALRM : + buffer = "Virtual timer expired"; + break; +#endif +#ifdef SIGPROF + case SIGPROF: + buffer = "Profiling timer expired"; + break; +#endif +#ifdef SIGLOST + case SIGLOST: + buffer = "Resource lost"; + break; +#endif + default: + siprintf (buffer, "Unknown signal %d", signal); + break; + } + + return buffer; +} |