123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- /* vi: set sw=4 ts=4: */
- /*
- * Signal name/number conversion routines.
- *
- * Copyright 2006 Rob Landley <rob@landley.net>
- *
- * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
- */
- #include "libbb.h"
- /* Believe it or not, but some arches have more than 32 SIGs!
- * HPPA: SIGSTKFLT == 36. */
- static const char signals[][7] = {
- // SUSv3 says kill must support these, and specifies the numerical values,
- // http://www.opengroup.org/onlinepubs/009695399/utilities/kill.html
- // {0, "EXIT"}, {1, "HUP"}, {2, "INT"}, {3, "QUIT"},
- // {6, "ABRT"}, {9, "KILL"}, {14, "ALRM"}, {15, "TERM"}
- // And Posix adds the following:
- // {SIGILL, "ILL"}, {SIGTRAP, "TRAP"}, {SIGFPE, "FPE"}, {SIGUSR1, "USR1"},
- // {SIGSEGV, "SEGV"}, {SIGUSR2, "USR2"}, {SIGPIPE, "PIPE"}, {SIGCHLD, "CHLD"},
- // {SIGCONT, "CONT"}, {SIGSTOP, "STOP"}, {SIGTSTP, "TSTP"}, {SIGTTIN, "TTIN"},
- // {SIGTTOU, "TTOU"}
- [0] = "EXIT",
- #ifdef SIGHUP
- [SIGHUP ] = "HUP",
- #endif
- #ifdef SIGINT
- [SIGINT ] = "INT",
- #endif
- #ifdef SIGQUIT
- [SIGQUIT ] = "QUIT",
- #endif
- #ifdef SIGILL
- [SIGILL ] = "ILL",
- #endif
- #ifdef SIGTRAP
- [SIGTRAP ] = "TRAP",
- #endif
- #ifdef SIGABRT
- [SIGABRT ] = "ABRT",
- #endif
- #ifdef SIGBUS
- [SIGBUS ] = "BUS",
- #endif
- #ifdef SIGFPE
- [SIGFPE ] = "FPE",
- #endif
- #ifdef SIGKILL
- [SIGKILL ] = "KILL",
- #endif
- #ifdef SIGUSR1
- [SIGUSR1 ] = "USR1",
- #endif
- #ifdef SIGSEGV
- [SIGSEGV ] = "SEGV",
- #endif
- #ifdef SIGUSR2
- [SIGUSR2 ] = "USR2",
- #endif
- #ifdef SIGPIPE
- [SIGPIPE ] = "PIPE",
- #endif
- #ifdef SIGALRM
- [SIGALRM ] = "ALRM",
- #endif
- #ifdef SIGTERM
- [SIGTERM ] = "TERM",
- #endif
- #ifdef SIGSTKFLT
- [SIGSTKFLT] = "STKFLT",
- #endif
- #ifdef SIGCHLD
- [SIGCHLD ] = "CHLD",
- #endif
- #ifdef SIGCONT
- [SIGCONT ] = "CONT",
- #endif
- #ifdef SIGSTOP
- [SIGSTOP ] = "STOP",
- #endif
- #ifdef SIGTSTP
- [SIGTSTP ] = "TSTP",
- #endif
- #ifdef SIGTTIN
- [SIGTTIN ] = "TTIN",
- #endif
- #ifdef SIGTTOU
- [SIGTTOU ] = "TTOU",
- #endif
- #ifdef SIGURG
- [SIGURG ] = "URG",
- #endif
- #ifdef SIGXCPU
- [SIGXCPU ] = "XCPU",
- #endif
- #ifdef SIGXFSZ
- [SIGXFSZ ] = "XFSZ",
- #endif
- #ifdef SIGVTALRM
- [SIGVTALRM] = "VTALRM",
- #endif
- #ifdef SIGPROF
- [SIGPROF ] = "PROF",
- #endif
- #ifdef SIGWINCH
- [SIGWINCH ] = "WINCH",
- #endif
- #ifdef SIGPOLL
- [SIGPOLL ] = "POLL",
- #endif
- #ifdef SIGPWR
- [SIGPWR ] = "PWR",
- #endif
- #ifdef SIGSYS
- [SIGSYS ] = "SYS",
- #endif
- };
- // Convert signal name to number.
- int get_signum(const char *name)
- {
- int i;
- i = bb_strtou(name, NULL, 10);
- if (!errno)
- return i;
- if (strncasecmp(name, "SIG", 3) == 0)
- name += 3;
- for (i = 0; i < ARRAY_SIZE(signals); i++)
- if (strcasecmp(name, signals[i]) == 0)
- return i;
- #if ENABLE_DESKTOP && (defined(SIGIOT) || defined(SIGIO))
- /* SIGIO[T] are aliased to other names,
- * thus cannot be stored in the signals[] array.
- * Need special code to recognize them */
- if ((name[0] | 0x20) == 'i' && (name[1] | 0x20) == 'o') {
- #ifdef SIGIO
- if (!name[2])
- return SIGIO;
- #endif
- #ifdef SIGIOT
- if ((name[2] | 0x20) == 't' && !name[3])
- return SIGIOT;
- #endif
- }
- #endif
- return -1;
- }
- // Convert signal number to name
- const char *get_signame(int number)
- {
- if ((unsigned)number < ARRAY_SIZE(signals)) {
- if (signals[number][0]) /* if it's not an empty str */
- return signals[number];
- }
- return itoa(number);
- }
- // Print the whole signal list
- void print_signames(void)
- {
- int signo;
- for (signo = 1; signo < ARRAY_SIZE(signals); signo++) {
- const char *name = signals[signo];
- if (name[0])
- puts(name);
- }
- }
|