Imported Upstream version 3.0
[debian/gnuradio] / gnuradio-core / src / lib / runtime / gr_local_sighandler.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2004 Free Software Foundation, Inc.
4  * 
5  * This file is part of GNU Radio
6  * 
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  * 
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include <gr_local_sighandler.h>
28 #include <stdexcept>
29 #include <stdio.h>
30
31
32 gr_local_sighandler::gr_local_sighandler (int signum,
33                                           void (*new_handler)(int))
34   : d_signum (signum)
35 {
36 #ifdef HAVE_SIGACTION
37   struct sigaction new_action;
38   memset (&new_action, 0, sizeof (new_action));
39
40   new_action.sa_handler = new_handler;
41   sigemptyset (&new_action.sa_mask);
42   new_action.sa_flags = 0;
43
44   if (sigaction (d_signum, &new_action, &d_old_action) < 0){
45     perror ("sigaction (install new)");
46     throw std::runtime_error ("sigaction");
47   }
48 #endif
49 }
50
51 gr_local_sighandler::~gr_local_sighandler ()
52 {
53 #ifdef HAVE_SIGACTION
54   if (sigaction (d_signum, &d_old_action, 0) < 0){
55     perror ("sigaction (restore old)");
56     throw std::runtime_error ("sigaction");
57   }
58 #endif
59 }
60
61 void
62 gr_local_sighandler::throw_signal (int signum)
63 {
64   throw gr_signal (signum);
65 }
66
67 /*
68  * Semi-hideous way to may a signal number into a signal name
69  */
70
71 #define SIGNAME(x) case x: return #x
72
73 std::string
74 gr_signal::name () const
75 {
76   char tmp[128];
77
78   switch (signal ()){
79 #ifdef SIGHUP
80     SIGNAME (SIGHUP);
81 #endif
82 #ifdef SIGINT
83     SIGNAME (SIGINT);
84 #endif
85 #ifdef SIGQUIT
86     SIGNAME (SIGQUIT);
87 #endif
88 #ifdef SIGILL
89     SIGNAME (SIGILL);
90 #endif
91 #ifdef SIGTRAP
92     SIGNAME (SIGTRAP);
93 #endif
94 #ifdef SIGABRT
95     SIGNAME (SIGABRT);
96 #endif
97 #ifdef SIGBUS
98     SIGNAME (SIGBUS);
99 #endif
100 #ifdef SIGFPE
101     SIGNAME (SIGFPE);
102 #endif
103 #ifdef SIGKILL
104     SIGNAME (SIGKILL);
105 #endif
106 #ifdef SIGUSR1
107     SIGNAME (SIGUSR1);
108 #endif
109 #ifdef SIGSEGV
110     SIGNAME (SIGSEGV);
111 #endif
112 #ifdef SIGUSR2
113     SIGNAME (SIGUSR2);
114 #endif
115 #ifdef SIGPIPE
116     SIGNAME (SIGPIPE);
117 #endif
118 #ifdef SIGALRM
119     SIGNAME (SIGALRM);
120 #endif
121 #ifdef SIGTERM
122     SIGNAME (SIGTERM);
123 #endif
124 #ifdef SIGSTKFLT
125     SIGNAME (SIGSTKFLT);
126 #endif
127 #ifdef SIGCHLD
128     SIGNAME (SIGCHLD);
129 #endif
130 #ifdef SIGCONT
131     SIGNAME (SIGCONT);
132 #endif
133 #ifdef SIGSTOP
134     SIGNAME (SIGSTOP);
135 #endif
136 #ifdef SIGTSTP
137     SIGNAME (SIGTSTP);
138 #endif
139 #ifdef SIGTTIN
140     SIGNAME (SIGTTIN);
141 #endif
142 #ifdef SIGTTOU
143     SIGNAME (SIGTTOU);
144 #endif
145 #ifdef SIGURG
146     SIGNAME (SIGURG);
147 #endif
148 #ifdef SIGXCPU
149     SIGNAME (SIGXCPU);
150 #endif
151 #ifdef SIGXFSZ
152     SIGNAME (SIGXFSZ);
153 #endif
154 #ifdef SIGVTALRM
155     SIGNAME (SIGVTALRM);
156 #endif
157 #ifdef SIGPROF
158     SIGNAME (SIGPROF);
159 #endif
160 #ifdef SIGWINCH
161     SIGNAME (SIGWINCH);
162 #endif
163 #ifdef SIGIO
164     SIGNAME (SIGIO);
165 #endif
166 #ifdef SIGPWR
167     SIGNAME (SIGPWR);
168 #endif
169 #ifdef SIGSYS
170     SIGNAME (SIGSYS);
171 #endif
172   default:
173 #if defined (HAVE_SNPRINTF)
174 #if defined (SIGRTMIN) && defined (SIGRTMAX) 
175     if (signal () >= SIGRTMIN && signal () <= SIGRTMAX){
176       snprintf (tmp, sizeof (tmp), "SIGRTMIN + %d", signal ());
177       return tmp;
178     }
179 #endif
180     snprintf (tmp, sizeof (tmp), "SIGNAL %d", signal ());
181     return tmp;
182 #else
183     return "Unknown signal";
184 #endif
185   }
186 }