libs/libc/string: make strsignal() configurable similar to strerror()
Signed-off-by: Petro Karashchenko <petro.karashchenko@gmail.com>
This commit is contained in:
parent
ddd8686584
commit
733807f635
@ -9,7 +9,7 @@ config LIBC_STRERROR
|
|||||||
bool "Enable strerror"
|
bool "Enable strerror"
|
||||||
default n
|
default n
|
||||||
---help---
|
---help---
|
||||||
strerror() is useful because it decodes 'errno' values into a human readable
|
strerror() is useful because it decodes 'errno' values into human readable
|
||||||
strings. But it can also require a lot of memory. If this option is not
|
strings. But it can also require a lot of memory. If this option is not
|
||||||
selected, strerror() will still exist in the build but it will not decode error
|
selected, strerror() will still exist in the build but it will not decode error
|
||||||
values. This option should be used by other logic to decide if it should use
|
values. This option should be used by other logic to decide if it should use
|
||||||
@ -22,11 +22,11 @@ config LIBC_STRERROR_SHORT
|
|||||||
default n
|
default n
|
||||||
depends on LIBC_STRERROR
|
depends on LIBC_STRERROR
|
||||||
---help---
|
---help---
|
||||||
If this option is selected, then strerror() will use a shortened string when
|
If this option is selected, then strerror() will use shortened string when
|
||||||
it decodes the error. Specifically, strerror() is simply use the string that
|
it decodes the error. Specifically, strerror() is simply use the string that
|
||||||
is the common name for the error. For example, the 'errno' value of 2 will
|
is the common name for the error. For example, the 'errno' value of 2 will
|
||||||
produce the string "No such file or directory" is LIBC_STRERROR_SHORT
|
produce the string "No such file or directory" if LIBC_STRERROR_SHORT
|
||||||
is not defined but the string "ENOENT" is LIBC_STRERROR_SHORT is defined.
|
is not defined but the string "ENOENT" if LIBC_STRERROR_SHORT is defined.
|
||||||
|
|
||||||
config LIBC_PERROR_STDOUT
|
config LIBC_PERROR_STDOUT
|
||||||
bool "perror() to stdout"
|
bool "perror() to stdout"
|
||||||
@ -90,3 +90,30 @@ config MEMSET_64BIT
|
|||||||
efficiently.
|
efficiently.
|
||||||
|
|
||||||
endmenu # memcpy/memset Options
|
endmenu # memcpy/memset Options
|
||||||
|
|
||||||
|
menu "signal Decode Support"
|
||||||
|
|
||||||
|
config LIBC_STRSIGNAL
|
||||||
|
bool "Enable strsignal"
|
||||||
|
default y
|
||||||
|
---help---
|
||||||
|
strsignal() is useful because it decodes signal number values into
|
||||||
|
human readable strings. But it can also require additional memory.
|
||||||
|
If this option is not selected, strsignal() will still exist in the
|
||||||
|
build but it will not decode signal number values to specific string
|
||||||
|
equivalents, but a generic string 'Signal X' will be returned for the
|
||||||
|
valid signal number value and 'Real-time Signal X' will be returned
|
||||||
|
for the valid real-time signal number value.
|
||||||
|
|
||||||
|
config LIBC_STRSIGNAL_SHORT
|
||||||
|
bool "Use short message string descriptions in strsignal()"
|
||||||
|
default DEFAULT_SMALL
|
||||||
|
depends on LIBC_STRSIGNAL
|
||||||
|
---help---
|
||||||
|
If this option is selected, then strsignal() will use a symbolic value
|
||||||
|
string equivalent to the signal number when signal value is decoded.
|
||||||
|
For example, the signal value for SIGTRAP will produce the string
|
||||||
|
"Trace/breakpoint trap" if LIBC_STRSIGNAL_SHORT is not defined but the
|
||||||
|
string "SIGTRAP" if LIBC_STRSIGNAL_SHORT is defined.
|
||||||
|
|
||||||
|
endmenu # signal Decode Support
|
||||||
|
@ -22,53 +22,24 @@
|
|||||||
* Included Files
|
* Included Files
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Data
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* We don't know what signals names will be assigned to which signals in
|
#ifdef CONFIG_LIBC_STRSIGNAL_SHORT
|
||||||
* advance and we do not want to return a volatile value. One solution is
|
# define CASE_SIG_STR(sig, msg) \
|
||||||
* this silly array of useless names:
|
case (sig): \
|
||||||
*/
|
return (FAR char *)#sig
|
||||||
|
#else
|
||||||
static FAR const char *g_default_sigstr[32] =
|
# define CASE_SIG_STR(sig, msg) \
|
||||||
{
|
case (sig): \
|
||||||
"Signal 0",
|
return (FAR char *)(msg)
|
||||||
"Signal 1",
|
#endif
|
||||||
"Signal 2",
|
|
||||||
"Signal 3",
|
|
||||||
"Signal 4",
|
|
||||||
"Signal 5",
|
|
||||||
"Signal 6",
|
|
||||||
"Signal 7",
|
|
||||||
"Signal 8",
|
|
||||||
"Signal 9",
|
|
||||||
"Signal 10",
|
|
||||||
"Signal 11",
|
|
||||||
"Signal 12",
|
|
||||||
"Signal 13",
|
|
||||||
"Signal 14",
|
|
||||||
"Signal 15",
|
|
||||||
"Signal 16",
|
|
||||||
"Signal 17",
|
|
||||||
"Signal 18",
|
|
||||||
"Signal 19",
|
|
||||||
"Signal 20",
|
|
||||||
"Signal 21",
|
|
||||||
"Signal 22",
|
|
||||||
"Signal 23",
|
|
||||||
"Signal 24",
|
|
||||||
"Signal 25",
|
|
||||||
"Signal 26",
|
|
||||||
"Signal 27",
|
|
||||||
"Signal 28",
|
|
||||||
"Signal 29",
|
|
||||||
"Signal 30",
|
|
||||||
"Signal 31",
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
@ -85,6 +56,8 @@ static FAR const char *g_default_sigstr[32] =
|
|||||||
|
|
||||||
FAR char *strsignal(int signum)
|
FAR char *strsignal(int signum)
|
||||||
{
|
{
|
||||||
|
static char sigstr[32];
|
||||||
|
|
||||||
/* Handle invalid signals */
|
/* Handle invalid signals */
|
||||||
|
|
||||||
if (!GOOD_SIGNO(signum))
|
if (!GOOD_SIGNO(signum))
|
||||||
@ -96,73 +69,54 @@ FAR char *strsignal(int signum)
|
|||||||
|
|
||||||
switch (signum)
|
switch (signum)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_LIBC_STRSIGNAL
|
||||||
/* Standard signals */
|
/* Standard signals */
|
||||||
|
|
||||||
#ifdef SIGUSR1
|
CASE_SIG_STR(SIGHUP, "Hangup");
|
||||||
case SIGUSR1:
|
CASE_SIG_STR(SIGINT, "Interrupt");
|
||||||
return (FAR char *)"SIGUSR1";
|
CASE_SIG_STR(SIGQUIT, "Quit");
|
||||||
#endif
|
CASE_SIG_STR(SIGILL, "Illegal instruction");
|
||||||
|
CASE_SIG_STR(SIGTRAP, "Trace/breakpoint trap");
|
||||||
|
CASE_SIG_STR(SIGABRT, "Aborted");
|
||||||
|
CASE_SIG_STR(SIGBUS, "Bus error");
|
||||||
|
CASE_SIG_STR(SIGFPE, "Arithmetic exception");
|
||||||
|
CASE_SIG_STR(SIGKILL, "Killed");
|
||||||
|
CASE_SIG_STR(SIGUSR1, "User defined signal 1");
|
||||||
|
CASE_SIG_STR(SIGSEGV, "Invalid memory reference");
|
||||||
|
CASE_SIG_STR(SIGUSR2, "User defined signal 2");
|
||||||
|
CASE_SIG_STR(SIGPIPE, "Broken pipe");
|
||||||
|
CASE_SIG_STR(SIGALRM, "Alarm clock");
|
||||||
|
CASE_SIG_STR(SIGTERM, "Terminated");
|
||||||
|
CASE_SIG_STR(SIGCHLD, "Child status changed");
|
||||||
|
CASE_SIG_STR(SIGCONT, "Continued");
|
||||||
|
CASE_SIG_STR(SIGSTOP, "Stopped (signal)");
|
||||||
|
CASE_SIG_STR(SIGTSTP, "Stopped");
|
||||||
|
CASE_SIG_STR(SIGTTIN, "Stopped (tty input)");
|
||||||
|
CASE_SIG_STR(SIGTTOU, "Stopped (tty output)");
|
||||||
|
CASE_SIG_STR(SIGURG, "Urgent I/O condition");
|
||||||
|
CASE_SIG_STR(SIGXCPU, "CPU time limit exceeded");
|
||||||
|
CASE_SIG_STR(SIGXFSZ, "File size limit exceeded");
|
||||||
|
CASE_SIG_STR(SIGVTALRM, "Virtual timer expired");
|
||||||
|
CASE_SIG_STR(SIGPROF, "Profiling timer expired");
|
||||||
|
CASE_SIG_STR(SIGPOLL, "Pollable event occurred");
|
||||||
|
CASE_SIG_STR(SIGSYS, "Bad system call");
|
||||||
|
|
||||||
#ifdef SIGUSR2
|
#endif /* CONFIG_LIBC_STRSIGNAL */
|
||||||
case SIGUSR2:
|
|
||||||
return (FAR char *)"SIGUSR2";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SIGALRM
|
default:
|
||||||
case SIGALRM:
|
if (signum >= SIGRTMIN && signum <= SIGRTMAX)
|
||||||
return (FAR char *)"SIGALRM";
|
{
|
||||||
#endif
|
snprintf(sigstr, sizeof(sigstr), "Real-time Signal %d",
|
||||||
|
signum - SIGRTMIN);
|
||||||
#ifdef SIGCHLD
|
}
|
||||||
case SIGCHLD:
|
else
|
||||||
return (FAR char *)"SIGCHLD";
|
{
|
||||||
#endif
|
snprintf(sigstr, sizeof(sigstr), "Signal %d", signum);
|
||||||
|
}
|
||||||
#ifdef SIGPOLL
|
break;
|
||||||
case SIGPOLL:
|
|
||||||
return (FAR char *)"SIGPOLL";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SIGSTOP
|
|
||||||
case SIGSTOP:
|
|
||||||
return (FAR char *)"SIGSTOP";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SIGTSTP
|
|
||||||
case SIGTSTP:
|
|
||||||
return (FAR char *)"SIGTSTP";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SIGCONT
|
|
||||||
case SIGCONT:
|
|
||||||
return (FAR char *)"SIGCONT";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SIGKILL
|
|
||||||
case SIGKILL:
|
|
||||||
return (FAR char *)"SIGKILL";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SIGINT
|
|
||||||
case SIGINT:
|
|
||||||
return (FAR char *)"SIGINT";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SIGQUIT
|
|
||||||
case SIGQUIT:
|
|
||||||
return (FAR char *)"SIGQUIT";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SIGTERM
|
|
||||||
case SIGTERM:
|
|
||||||
return (FAR char *)"SIGTERM";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return a string devoid is meaning */
|
/* Return a string devoid is meaning */
|
||||||
|
|
||||||
return (FAR char *)g_default_sigstr[signum];
|
return sigstr;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user