mirror of https://gerrit.osmocom.org/libusrp
192 lines
3.8 KiB
C++
192 lines
3.8 KiB
C++
/* -*- c++ -*- */
|
|
/*
|
|
* Copyright 2004,2009 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.
|
|
*/
|
|
|
|
/*
|
|
* This is actually the same as gr_local_signhandler, but with a different name.
|
|
* We don't have a common library to put this in, so...
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <usrp/usrp_local_sighandler.h>
|
|
#include <stdexcept>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
usrp_local_sighandler::usrp_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
|
|
}
|
|
|
|
usrp_local_sighandler::~usrp_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
|
|
usrp_local_sighandler::throw_signal(int signum) throw(usrp_signal)
|
|
{
|
|
throw usrp_signal (signum);
|
|
}
|
|
|
|
/*
|
|
* Semi-hideous way to may a signal number into a signal name
|
|
*/
|
|
|
|
#define SIGNAME(x) case x: return #x
|
|
|
|
std::string
|
|
usrp_signal::name () const
|
|
{
|
|
char tmp[128];
|
|
|
|
switch (signal ()){
|
|
#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 (signal () >= SIGRTMIN && signal () <= SIGRTMAX){
|
|
snprintf (tmp, sizeof (tmp), "SIGRTMIN + %d", signal ());
|
|
return tmp;
|
|
}
|
|
#endif
|
|
snprintf (tmp, sizeof (tmp), "SIGNAL %d", signal ());
|
|
return tmp;
|
|
#else
|
|
return "Unknown signal";
|
|
#endif
|
|
}
|
|
}
|