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__)  \
111    || defined(__APPLE__)
112  if (signo <= 0 || signo >= sys_nsig)
113    return -1;
114  name = sys_signame[signo];
115#else
116  if (signo <= 0 || signo >= aruu_sys_nsig)
117    return -1;
118  name = aruu_sys_signame[signo];
119#endif
120
121  if (name == NULL)
122    return -1;
123  strcpy(str, name);
124  return 0;
125}
126
127int
128aruu_str2sig(const char *str, int *signop)
129{
130  int                n;
131  const char        *s = str;
132  const char *const *table;
133  int                limit;
134
135#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)  \
136    || defined(__APPLE__)
137  table = sys_signame;
138  limit = sys_nsig;
139#else
140  table = aruu_sys_signame;
141  limit = aruu_sys_nsig;
142#endif
143
144  if (strncasecmp(s, "SIG", 3) == 0)
145    s += 3;
146
147  /* check if it is a number */
148  char *ep;
149  long  l = strtol(s, &ep, 10);
150  if (*s && !*ep) {
151    if (l >= 0 && l < limit) {
152      *signop = (int)l;
153      return 0;
154    }
155    return -1;
156  }
157
158  for (n = 1; n < limit; n++) {
159    if (table[n] && strcasecmp(table[n], s) == 0) {
160      *signop = n;
161      return 0;
162    }
163  }
164  return -1;
165}