master xplshn/aruu / shared / libutil / sig.c
  1/* See LICENSE file for copyright and license details. */
  2#include "../sig.h"
  3
  4#include <signal.h>
  5#include <stdlib.h>
  6#include <string.h>
  7#include <strings.h>
  8
  9const char *const aruu_sys_signame[NSIG] = {
 10	[0] = "EXIT",
 11#ifdef SIGHUP
 12	[SIGHUP] = "HUP",
 13#endif
 14#ifdef SIGINT
 15	[SIGINT] = "INT",
 16#endif
 17#ifdef SIGQUIT
 18	[SIGQUIT] = "QUIT",
 19#endif
 20#ifdef SIGILL
 21	[SIGILL] = "ILL",
 22#endif
 23#ifdef SIGTRAP
 24	[SIGTRAP] = "TRAP",
 25#endif
 26#ifdef SIGABRT
 27	[SIGABRT] = "ABRT",
 28#endif
 29#ifdef SIGBUS
 30	[SIGBUS] = "BUS",
 31#endif
 32#ifdef SIGFPE
 33	[SIGFPE] = "FPE",
 34#endif
 35#ifdef SIGKILL
 36	[SIGKILL] = "KILL",
 37#endif
 38#ifdef SIGUSR1
 39	[SIGUSR1] = "USR1",
 40#endif
 41#ifdef SIGSEGV
 42	[SIGSEGV] = "SEGV",
 43#endif
 44#ifdef SIGUSR2
 45	[SIGUSR2] = "USR2",
 46#endif
 47#ifdef SIGPIPE
 48	[SIGPIPE] = "PIPE",
 49#endif
 50#ifdef SIGALRM
 51	[SIGALRM] = "ALRM",
 52#endif
 53#ifdef SIGTERM
 54	[SIGTERM] = "TERM",
 55#endif
 56#ifdef SIGCHLD
 57	[SIGCHLD] = "CHLD",
 58#endif
 59#ifdef SIGCONT
 60	[SIGCONT] = "CONT",
 61#endif
 62#ifdef SIGSTOP
 63	[SIGSTOP] = "STOP",
 64#endif
 65#ifdef SIGTSTP
 66	[SIGTSTP] = "TSTP",
 67#endif
 68#ifdef SIGTTIN
 69	[SIGTTIN] = "TTIN",
 70#endif
 71#ifdef SIGTTOU
 72	[SIGTTOU] = "TTOU",
 73#endif
 74#ifdef SIGURG
 75	[SIGURG] = "URG",
 76#endif
 77#ifdef SIGXCPU
 78	[SIGXCPU] = "XCPU",
 79#endif
 80#ifdef SIGXFSZ
 81	[SIGXFSZ] = "XFSZ",
 82#endif
 83#ifdef SIGVTALRM
 84	[SIGVTALRM] = "VTALRM",
 85#endif
 86#ifdef SIGPROF
 87	[SIGPROF] = "PROF",
 88#endif
 89#ifdef SIGWINCH
 90	[SIGWINCH] = "WINCH",
 91#endif
 92#ifdef SIGIO
 93	[SIGIO] = "IO",
 94#endif
 95#ifdef SIGPWR
 96	[SIGPWR] = "PWR",
 97#endif
 98#ifdef SIGSYS
 99	[SIGSYS] = "SYS",
100#endif
101};
102
103const int aruu_sys_nsig = NSIG;
104
105int
106aruu_sig2str(int signo, char *str)
107{
108	const char *name;
109
110#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__)
111	if (signo <= 0 || signo >= sys_nsig)
112		return -1;
113	name = sys_signame[signo];
114#else
115	if (signo <= 0 || signo >= aruu_sys_nsig)
116		return -1;
117	name = aruu_sys_signame[signo];
118#endif
119
120	if (name == NULL)
121		return -1;
122	strcpy(str, name);
123	return 0;
124}
125
126int
127aruu_str2sig(const char *str, int *signop)
128{
129	int n;
130	const char *s = str;
131	const char *const *table;
132	int limit;
133
134#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__)
135	table = sys_signame;
136	limit = sys_nsig;
137#else
138	table = aruu_sys_signame;
139	limit = aruu_sys_nsig;
140#endif
141
142	if (strncasecmp(s, "SIG", 3) == 0)
143		s += 3;
144
145	/* check if it is a number */
146	char *ep;
147	long l = strtol(s, &ep, 10);
148	if (*s && !*ep) {
149		if (l >= 0 && l < limit) {
150			*signop = (int)l;
151			return 0;
152		}
153		return -1;
154	}
155
156	for (n = 1; n < limit; n++) {
157		if (table[n] && strcasecmp(table[n], s) == 0) {
158			*signop = n;
159			return 0;
160		}
161	}
162	return -1;
163}