diff options
Diffstat (limited to 'gnuradio-runtime/lib/local_sighandler.cc')
-rw-r--r-- | gnuradio-runtime/lib/local_sighandler.cc | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/gnuradio-runtime/lib/local_sighandler.cc b/gnuradio-runtime/lib/local_sighandler.cc new file mode 100644 index 0000000000..ebd9bb1362 --- /dev/null +++ b/gnuradio-runtime/lib/local_sighandler.cc @@ -0,0 +1,189 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,2013 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "local_sighandler.h" +#include <stdexcept> +#include <stdio.h> +#include <string.h> + +namespace gr { + + local_sighandler::local_sighandler(int signum, + void (*new_handler)(int)) + : d_signum(signum) + { +#ifdef HAVE_SIGACTION + struct sigaction new_action; + memset(&new_action, 0, sizeof(new_action)); + + new_action.sa_handler = new_handler; + sigemptyset(&new_action.sa_mask); + new_action.sa_flags = 0; + + if(sigaction (d_signum, &new_action, &d_old_action) < 0) { + perror("sigaction (install new)"); + throw std::runtime_error("sigaction"); + } +#endif + } + + local_sighandler::~local_sighandler() + { +#ifdef HAVE_SIGACTION + if(sigaction (d_signum, &d_old_action, 0) < 0) { + perror("sigaction (restore old)"); + throw std::runtime_error("sigaction"); + } +#endif + } + + void + local_sighandler::throw_signal(int signum) + { + throw signal(signum); + } + + /* + * Semi-hideous way to may a signal number into a signal name + */ + #define SIGNAME(x) case x: return #x + + std::string + signal::name() const + { + char tmp[128]; + + switch(signum()) { +#ifdef SIGHUP + SIGNAME(SIGHUP); +#endif +#ifdef SIGINT + SIGNAME(SIGINT); +#endif +#ifdef SIGQUIT + SIGNAME(SIGQUIT); +#endif +#ifdef SIGILL + SIGNAME(SIGILL); +#endif +#ifdef SIGTRAP + SIGNAME(SIGTRAP); +#endif +#ifdef SIGABRT + SIGNAME(SIGABRT); +#endif +#ifdef SIGBUS + SIGNAME(SIGBUS); +#endif +#ifdef SIGFPE + SIGNAME(SIGFPE); +#endif +#ifdef SIGKILL + SIGNAME(SIGKILL); +#endif +#ifdef SIGUSR1 + SIGNAME(SIGUSR1); +#endif +#ifdef SIGSEGV + SIGNAME(SIGSEGV); +#endif +#ifdef SIGUSR2 + SIGNAME(SIGUSR2); +#endif +#ifdef SIGPIPE + SIGNAME(SIGPIPE); +#endif +#ifdef SIGALRM + SIGNAME(SIGALRM); +#endif +#ifdef SIGTERM + SIGNAME(SIGTERM); +#endif +#ifdef SIGSTKFLT + SIGNAME(SIGSTKFLT); +#endif +#ifdef SIGCHLD + SIGNAME(SIGCHLD); +#endif +#ifdef SIGCONT + SIGNAME(SIGCONT); +#endif +#ifdef SIGSTOP + SIGNAME(SIGSTOP); +#endif +#ifdef SIGTSTP + SIGNAME(SIGTSTP); +#endif +#ifdef SIGTTIN + SIGNAME(SIGTTIN); +#endif +#ifdef SIGTTOU + SIGNAME(SIGTTOU); +#endif +#ifdef SIGURG + SIGNAME(SIGURG); +#endif +#ifdef SIGXCPU + SIGNAME(SIGXCPU); +#endif +#ifdef SIGXFSZ + SIGNAME(SIGXFSZ); +#endif +#ifdef SIGVTALRM + SIGNAME(SIGVTALRM); +#endif +#ifdef SIGPROF + SIGNAME(SIGPROF); +#endif +#ifdef SIGWINCH + SIGNAME(SIGWINCH); +#endif +#ifdef SIGIO + SIGNAME(SIGIO); +#endif +#ifdef SIGPWR + SIGNAME(SIGPWR); +#endif +#ifdef SIGSYS + SIGNAME(SIGSYS); +#endif + default: +#if defined (HAVE_SNPRINTF) +#if defined (SIGRTMIN) && defined (SIGRTMAX) + if(signum() >= SIGRTMIN && signum() <= SIGRTMAX) { + snprintf(tmp, sizeof(tmp), "SIGRTMIN + %d", signum()); + return tmp; + } +#endif + snprintf(tmp, sizeof(tmp), "SIGNAL %d", signum()); + return tmp; +#else + return "Unknown signal"; +#endif + } + } + +} /* namespace gr */ |