blob: b9afc6ff1a85d08bb9586d4d286aeea82cb730ab [file] [log] [blame]
Eric Andersenbdfd0d72001-10-24 05:00:29 +00001/* vi: set sw=4 ts=4: */
2/*
Rob Landleyc9c1a412006-07-12 19:17:55 +00003 * Signal name/number conversion routines.
Eric Andersenbdfd0d72001-10-24 05:00:29 +00004 *
Rob Landleyc9c1a412006-07-12 19:17:55 +00005 * Copyright 2006 Rob Landley <rob@landley.net>
Eric Andersenbdfd0d72001-10-24 05:00:29 +00006 *
Bernhard Reutner-Fischer421d9e52006-04-03 16:39:31 +00007 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
Eric Andersenbdfd0d72001-10-24 05:00:29 +00008 */
9
Bernhard Reutner-Fischer421d9e52006-04-03 16:39:31 +000010#include "libbb.h"
11
Rob Landleyc9c1a412006-07-12 19:17:55 +000012static struct signal_name {
13 char *name;
Eric Andersen842757d2001-08-02 05:18:55 +000014 int number;
Rob Landleyc9c1a412006-07-12 19:17:55 +000015} signals[] = {
16 // SUSv3 says kill must support these, and specifies the numerical values,
17 // http://www.opengroup.org/onlinepubs/009695399/utilities/kill.html
18 {"0", 0}, {"HUP", 1}, {"INT", 2}, {"QUIT", 3}, {"ABRT", 6}, {"KILL", 9},
Denis Vlasenko9213a9e2006-09-17 16:28:10 +000019 {"ALRM", 14}, {"TERM", 15},
Rob Landleyc9c1a412006-07-12 19:17:55 +000020 // And Posix adds the following:
21 {"ILL", SIGILL}, {"TRAP", SIGTRAP}, {"FPE", SIGFPE}, {"USR1", SIGUSR1},
Denis Vlasenko9213a9e2006-09-17 16:28:10 +000022 {"SEGV", SIGSEGV}, {"USR2", SIGUSR2}, {"PIPE", SIGPIPE}, {"CHLD", SIGCHLD},
23 {"CONT", SIGCONT}, {"STOP", SIGSTOP}, {"TSTP", SIGTSTP}, {"TTIN", SIGTTIN},
24 {"TTOU", SIGTTOU}
Eric Andersen842757d2001-08-02 05:18:55 +000025};
26
Rob Landleyc9c1a412006-07-12 19:17:55 +000027// Convert signal name to number.
Eric Andersen842757d2001-08-02 05:18:55 +000028
Rob Landleyc9c1a412006-07-12 19:17:55 +000029int get_signum(char *name)
Eric Andersen842757d2001-08-02 05:18:55 +000030{
Rob Landleyc9c1a412006-07-12 19:17:55 +000031 int i;
Eric Andersen842757d2001-08-02 05:18:55 +000032
Rob Landleyc9c1a412006-07-12 19:17:55 +000033 i = atoi(name);
34 if(i) return i;
35 for(i=0; i < sizeof(signals) / sizeof(struct signal_name); i++)
36 if (!strcasecmp(signals[i].name, name) ||
37 (!strncasecmp(signals[i].name, "SIG", 3)
38 && !strcasecmp(signals[i].name+3, signals[i].name)))
39 return signals[i].number;
40 return -1;
41}
42
43// Convert signal number to name
44
45char *get_signame(int number)
46{
47 int i;
48 static char buf[8];
49
50 itoa_to_buf(number, buf, 8);
51 for (i=0; i < sizeof(signals) / sizeof(struct signal_name); i++) {
52 if (number == signals[i].number) {
53 sprintf("SIG%s", signals[i].name);
54 break;
Eric Andersen842757d2001-08-02 05:18:55 +000055 }
56 }
Rob Landleyc9c1a412006-07-12 19:17:55 +000057
58 return buf;
Eric Andersen842757d2001-08-02 05:18:55 +000059}