summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/lib/local_sighandler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-runtime/lib/local_sighandler.cc')
-rw-r--r--gnuradio-runtime/lib/local_sighandler.cc189
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 */