1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
/*
* No copyright is claimed. This code is in the public domain; do with
* it what you wish.
* Written by:
* Sami Kerola <kerolasa@iki.fi>
* Karel Zak <kzak@redhat.com>
* Niklas Hambüchen <mail@nh2.me>
*/
#include <ctype.h> /* for isdigit() */
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include "c.h"
#include "cctype.h"
#include "strutils.h"
#include "signames.h"
static const struct ul_signal_name {
const char *name;
int val;
} ul_signames[] = {
/* POSIX signals */
{ "HUP", SIGHUP }, /* 1 */
{ "INT", SIGINT }, /* 2 */
{ "QUIT", SIGQUIT }, /* 3 */
{ "ILL", SIGILL }, /* 4 */
#ifdef SIGTRAP
{ "TRAP", SIGTRAP }, /* 5 */
#endif
{ "ABRT", SIGABRT }, /* 6 */
#ifdef SIGIOT
{ "IOT", SIGIOT }, /* 6, same as SIGABRT */
#endif
#ifdef SIGEMT
{ "EMT", SIGEMT }, /* 7 (mips,alpha,sparc*) */
#endif
#ifdef SIGBUS
{ "BUS", SIGBUS }, /* 7 (arm,i386,m68k,ppc), 10 (mips,alpha,sparc*) */
#endif
{ "FPE", SIGFPE }, /* 8 */
{ "KILL", SIGKILL }, /* 9 */
{ "USR1", SIGUSR1 }, /* 10 (arm,i386,m68k,ppc), 30 (alpha,sparc*), 16 (mips) */
{ "SEGV", SIGSEGV }, /* 11 */
{ "USR2", SIGUSR2 }, /* 12 (arm,i386,m68k,ppc), 31 (alpha,sparc*), 17 (mips) */
{ "PIPE", SIGPIPE }, /* 13 */
{ "ALRM", SIGALRM }, /* 14 */
{ "TERM", SIGTERM }, /* 15 */
#ifdef SIGSTKFLT
{ "STKFLT", SIGSTKFLT }, /* 16 (arm,i386,m68k,ppc) */
#endif
{ "CHLD", SIGCHLD }, /* 17 (arm,i386,m68k,ppc), 20 (alpha,sparc*), 18 (mips) */
#ifdef SIGCLD
{ "CLD", SIGCLD }, /* same as SIGCHLD (mips) */
#endif
{ "CONT", SIGCONT }, /* 18 (arm,i386,m68k,ppc), 19 (alpha,sparc*), 25 (mips) */
{ "STOP", SIGSTOP }, /* 19 (arm,i386,m68k,ppc), 17 (alpha,sparc*), 23 (mips) */
{ "TSTP", SIGTSTP }, /* 20 (arm,i386,m68k,ppc), 18 (alpha,sparc*), 24 (mips) */
{ "TTIN", SIGTTIN }, /* 21 (arm,i386,m68k,ppc,alpha,sparc*), 26 (mips) */
{ "TTOU", SIGTTOU }, /* 22 (arm,i386,m68k,ppc,alpha,sparc*), 27 (mips) */
#ifdef SIGURG
{ "URG", SIGURG }, /* 23 (arm,i386,m68k,ppc), 16 (alpha,sparc*), 21 (mips) */
#endif
#ifdef SIGXCPU
{ "XCPU", SIGXCPU }, /* 24 (arm,i386,m68k,ppc,alpha,sparc*), 30 (mips) */
#endif
#ifdef SIGXFSZ
{ "XFSZ", SIGXFSZ }, /* 25 (arm,i386,m68k,ppc,alpha,sparc*), 31 (mips) */
#endif
#ifdef SIGVTALRM
{ "VTALRM", SIGVTALRM }, /* 26 (arm,i386,m68k,ppc,alpha,sparc*), 28 (mips) */
#endif
#ifdef SIGPROF
{ "PROF", SIGPROF }, /* 27 (arm,i386,m68k,ppc,alpha,sparc*), 29 (mips) */
#endif
#ifdef SIGWINCH
{ "WINCH", SIGWINCH }, /* 28 (arm,i386,m68k,ppc,alpha,sparc*), 20 (mips) */
#endif
#ifdef SIGIO
{ "IO", SIGIO }, /* 29 (arm,i386,m68k,ppc), 23 (alpha,sparc*), 22 (mips) */
#endif
#ifdef SIGPOLL
{ "POLL", SIGPOLL }, /* same as SIGIO */
#endif
#ifdef SIGINFO
{ "INFO", SIGINFO }, /* 29 (alpha) */
#endif
#ifdef SIGLOST
{ "LOST", SIGLOST }, /* 29 (arm,i386,m68k,ppc,sparc*) */
#endif
#ifdef SIGPWR
{ "PWR", SIGPWR }, /* 30 (arm,i386,m68k,ppc), 29 (alpha,sparc*), 19 (mips) */
#endif
#ifdef SIGUNUSED
{ "UNUSED", SIGUNUSED }, /* 31 (arm,i386,m68k,ppc) */
#endif
#ifdef SIGSYS
{ "SYS", SIGSYS }, /* 31 (mips,alpha,sparc*) */
#endif
};
#ifdef SIGRTMIN
static int rtsig_to_signum(const char *sig)
{
int num, maxi = 0;
char *ep = NULL;
if (c_strncasecmp(sig, "min+", 4) == 0)
sig += 4;
else if (c_strncasecmp(sig, "max-", 4) == 0) {
sig += 4;
maxi = 1;
}
if (!isdigit(*sig))
return -1;
errno = 0;
num = strtol(sig, &ep, 10);
if (!ep || sig == ep || errno || num < 0)
return -1;
num = maxi ? SIGRTMAX - num : SIGRTMIN + num;
if (num < SIGRTMIN || SIGRTMAX < num)
return -1;
return num;
}
#endif
int signame_to_signum(const char *sig)
{
size_t n;
if (!c_strncasecmp(sig, "sig", 3))
sig += 3;
#ifdef SIGRTMIN
/* RT signals */
if (!c_strncasecmp(sig, "rt", 2))
return rtsig_to_signum(sig + 2);
#endif
/* Normal signals */
for (n = 0; n < ARRAY_SIZE(ul_signames); n++) {
if (!c_strcasecmp(ul_signames[n].name, sig))
return ul_signames[n].val;
}
return -1;
}
const char *signum_to_signame(int signum)
{
size_t n;
for (n = 0; n < ARRAY_SIZE(ul_signames); n++) {
if (ul_signames[n].val == signum) {
return ul_signames[n].name;
}
}
return NULL;
}
int get_signame_by_idx(size_t idx, const char **signame, int *signum)
{
if (idx >= ARRAY_SIZE(ul_signames))
return -1;
if (signame)
*signame = ul_signames[idx].name;
if (signum)
*signum = ul_signames[idx].val;
return 0;
}
|