Imported Upstream version 3.2.2
[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 3, 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 #include <string.h>
31
32
33 gr_local_sighandler::gr_local_sighandler (int signum,
34                                           void (*new_handler)(int))
35   : d_signum (signum)
36 {
37 #ifdef HAVE_SIGACTION
38   struct sigaction new_action;
39   memset (&new_action, 0, sizeof (new_action));
40
41   new_action.sa_handler = new_handler;
42   sigemptyset (&new_action.sa_mask);
43   new_action.sa_flags = 0;
44
45   if (sigaction (d_signum, &new_action, &d_old_action) < 0){
46     perror ("sigaction (install new)");
47     throw std::runtime_error ("sigaction");
48   }
49 #endif
50 }
51
52 gr_local_sighandler::~gr_local_sighandler ()
53 {
54 #ifdef HAVE_SIGACTION
55   if (sigaction (d_signum, &d_old_action, 0) < 0){
56     perror ("sigaction (restore old)");
57     throw std::runtime_error ("sigaction");
58   }
59 #endif
60 }
61
62 void
63 gr_local_sighandler::throw_signal (int signum)
64 {
65   throw gr_signal (signum);
66 }
67
68 /*
69  * Semi-hideous way to may a signal number into a signal name
70  */
71
72 #define SIGNAME(x) case x: return #x
73
74 std::string
75 gr_signal::name () const
76 {
77   char tmp[128];
78
79   switch (signal ()){
80 #ifdef SIGHUP
81     SIGNAME (SIGHUP);
82 #endif
83 #ifdef SIGINT
84     SIGNAME (SIGINT);
85 #endif
86 #ifdef SIGQUIT
87     SIGNAME (SIGQUIT);
88 #endif
89 #ifdef SIGILL
90     SIGNAME (SIGILL);
91 #endif
92 #ifdef SIGTRAP
93     SIGNAME (SIGTRAP);
94 #endif
95 #ifdef SIGABRT
96     SIGNAME (SIGABRT);
97 #endif
98 #ifdef SIGBUS
99     SIGNAME (SIGBUS);
100 #endif
101 #ifdef SIGFPE
102     SIGNAME (SIGFPE);
103 #endif
104 #ifdef SIGKILL
105     SIGNAME (SIGKILL);
106 #endif
107 #ifdef SIGUSR1
108     SIGNAME (SIGUSR1);
109 #endif
110 #ifdef SIGSEGV
111     SIGNAME (SIGSEGV);
112 #endif
113 #ifdef SIGUSR2
114     SIGNAME (SIGUSR2);
115 #endif
116 #ifdef SIGPIPE
117     SIGNAME (SIGPIPE);
118 #endif
119 #ifdef SIGALRM
120     SIGNAME (SIGALRM);
121 #endif
122 #ifdef SIGTERM
123     SIGNAME (SIGTERM);
124 #endif
125 #ifdef SIGSTKFLT
126     SIGNAME (SIGSTKFLT);
127 #endif
128 #ifdef SIGCHLD
129     SIGNAME (SIGCHLD);
130 #endif
131 #ifdef SIGCONT
132     SIGNAME (SIGCONT);
133 #endif
134 #ifdef SIGSTOP
135     SIGNAME (SIGSTOP);
136 #endif
137 #ifdef SIGTSTP
138     SIGNAME (SIGTSTP);
139 #endif
140 #ifdef SIGTTIN
141     SIGNAME (SIGTTIN);
142 #endif
143 #ifdef SIGTTOU
144     SIGNAME (SIGTTOU);
145 #endif
146 #ifdef SIGURG
147     SIGNAME (SIGURG);
148 #endif
149 #ifdef SIGXCPU
150     SIGNAME (SIGXCPU);
151 #endif
152 #ifdef SIGXFSZ
153     SIGNAME (SIGXFSZ);
154 #endif
155 #ifdef SIGVTALRM
156     SIGNAME (SIGVTALRM);
157 #endif
158 #ifdef SIGPROF
159     SIGNAME (SIGPROF);
160 #endif
161 #ifdef SIGWINCH
162     SIGNAME (SIGWINCH);
163 #endif
164 #ifdef SIGIO
165     SIGNAME (SIGIO);
166 #endif
167 #ifdef SIGPWR
168     SIGNAME (SIGPWR);
169 #endif
170 #ifdef SIGSYS
171     SIGNAME (SIGSYS);
172 #endif
173   default:
174 #if defined (HAVE_SNPRINTF)
175 #if defined (SIGRTMIN) && defined (SIGRTMAX) 
176     if (signal () >= SIGRTMIN && signal () <= SIGRTMAX){
177       snprintf (tmp, sizeof (tmp), "SIGRTMIN + %d", signal ());
178       return tmp;
179     }
180 #endif
181     snprintf (tmp, sizeof (tmp), "SIGNAL %d", signal ());
182     return tmp;
183 #else
184     return "Unknown signal";
185 #endif
186   }
187 }