Mercurial > hg > freeDiameter
annotate libfreeDiameter/signal.c @ 236:60f34df3e025
Remove dependency on signalent.h
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Mon, 08 Mar 2010 14:10:30 +0900 |
parents | 8773740401a5 |
children | 5df55136361b |
rev | line source |
---|---|
235
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
1 /********************************************************************************************************* |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
2 * Software License Agreement (BSD License) * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@nict.go.jp> * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
4 * * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
5 * Copyright (c) 2009, WIDE Project and NICT * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
6 * All rights reserved. * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
7 * * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
8 * Redistribution and use of this software in source and binary forms, with or without modification, are * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
9 * permitted provided that the following conditions are met: * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
10 * * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
11 * * Redistributions of source code must retain the above * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
12 * copyright notice, this list of conditions and the * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
13 * following disclaimer. * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
14 * * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
15 * * Redistributions in binary form must reproduce the above * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
16 * copyright notice, this list of conditions and the * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
17 * following disclaimer in the documentation and/or other * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
18 * materials provided with the distribution. * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
19 * * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
20 * * Neither the name of the WIDE Project or NICT nor the * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
21 * names of its contributors may be used to endorse or * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
22 * promote products derived from this software without * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
23 * specific prior written permission of WIDE Project and * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
24 * NICT. * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
25 * * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
34 *********************************************************************************************************/ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
35 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
36 #include "libfD.h" |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
37 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
38 #include <signal.h> |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
39 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
40 /* A structure to hold the registered signal handlers */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
41 struct sig_hdl { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
42 struct fd_list chain; /* Link in the sig_hdl_list ordered by signal */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
43 int signal; /* The signal this handler is registered for */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
44 void (*sig_hdl)(int);/* The callback to call when the signal is caught */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
45 pthread_t sig_thr; /* The thread that receives the signal */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
46 char *modname; /* The name of the module who registered the signal (for debug) */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
47 }; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
48 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
49 /* The list of sig_hdl, and the mutex to protect it */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
50 static struct fd_list sig_hdl_list = FD_LIST_INITIALIZER(sig_hdl_list); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
51 static pthread_mutex_t sig_hdl_lock = PTHREAD_MUTEX_INITIALIZER; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
52 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
53 /* Detached thread attribute */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
54 static pthread_attr_t detached; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
55 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
56 /* Note if the module was initialized */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
57 static int sig_initialized = 0; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
58 |
236
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
59 /* signals short names list */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
60 static int abbrevs_init(void); |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
61 |
235
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
62 /* Initialize the support for signals */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
63 int fd_sig_init(void) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
64 { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
65 sigset_t sig_all; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
66 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
67 TRACE_ENTRY(""); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
68 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
69 if (sig_initialized) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
70 return 0; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
71 |
236
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
72 /* Initialize the list of abbreviations */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
73 CHECK_FCT(abbrevs_init()); |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
74 |
235
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
75 /* Block all signals from the current thread and all its future children, so that signals are delivered only to our sig_hdl->sig_thr */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
76 sigfillset(&sig_all); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
77 CHECK_POSIX( pthread_sigmask(SIG_BLOCK, &sig_all, NULL) ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
78 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
79 /* Initialize the detached attribute */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
80 CHECK_POSIX( pthread_attr_init(&detached) ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
81 CHECK_POSIX( pthread_attr_setdetachstate(&detached, PTHREAD_CREATE_DETACHED) ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
82 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
83 sig_initialized++; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
84 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
85 /* That's all we have to do here ... */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
86 return 0; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
87 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
88 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
89 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
90 /* This thread (created detached) does call the signal handler */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
91 static void * signal_caller(void * arg) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
92 { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
93 struct sig_hdl * me = arg; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
94 char buf[40]; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
95 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
96 /* Name this thread */ |
236
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
97 snprintf(buf, sizeof(buf), "cb %d:%s:%s", me->signal, fd_sig_abbrev(me->signal), me->modname); |
235
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
98 fd_log_threadname ( buf ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
99 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
100 TRACE_ENTRY("%p", me); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
101 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
102 /* Call the signal handler */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
103 (*me->sig_hdl)(me->signal); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
104 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
105 TRACE_DEBUG(CALL, "Callback completed"); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
106 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
107 /* Done! */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
108 return NULL; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
109 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
110 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
111 /* This thread "really" receives the signal and starts the signal_caller thread */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
112 static void * signal_catcher(void * arg) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
113 { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
114 struct sig_hdl * me = arg; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
115 sigset_t ss; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
116 char buf[40]; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
117 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
118 ASSERT(arg); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
119 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
120 /* Name this thread */ |
236
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
121 snprintf(buf, sizeof(buf), "catch %d:%s:%s", me->signal, fd_sig_abbrev(me->signal), me->modname); |
235
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
122 fd_log_threadname ( buf ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
123 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
124 TRACE_ENTRY("%p", me); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
125 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
126 sigemptyset(&ss); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
127 sigaddset(&ss, me->signal); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
128 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
129 /* Now loop on the reception of the signal */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
130 while (1) { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
131 int sig; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
132 pthread_t th; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
133 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
134 /* Wait to receive the next signal */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
135 CHECK_POSIX_DO( sigwait(&ss, &sig), break ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
136 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
137 TRACE_DEBUG(FULL, "Signal %d caught", sig); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
138 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
139 /* Create the thread that will call the handler */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
140 CHECK_POSIX_DO( pthread_create( &th, &detached, signal_caller, arg ), break ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
141 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
142 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
143 /* An error occurred... What should we do ? */ |
236
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
144 TRACE_DEBUG(INFO, "!!! ERROR !!! The signal catcher for %d:%s:%s is terminating!", me->signal, fd_sig_abbrev(me->signal), me->modname); |
235
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
145 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
146 /* Better way to handle this ? */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
147 ASSERT(0); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
148 return NULL; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
149 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
150 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
151 /* Register a new callback to be called on reception of a given signal (it receives the signal as parameter) */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
152 /* EALREADY will be returned if there is already a callback registered on this signal */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
153 /* NOTE: the signal handler will be called from a new detached thread */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
154 int fd_sig_register(int signal, char * modname, void (*handler)(int signal)) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
155 { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
156 struct sig_hdl * new; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
157 struct fd_list * next = NULL; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
158 int matched = 0; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
159 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
160 TRACE_ENTRY("%d %p %p", signal, modname, handler); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
161 CHECK_PARAMS( signal && modname && handler && sig_initialized ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
162 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
163 /* Alloc all memory before taking the lock */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
164 CHECK_MALLOC( new = malloc(sizeof(struct sig_hdl)) ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
165 memset(new, 0, sizeof(struct sig_hdl)); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
166 fd_list_init(&new->chain, new); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
167 new->signal = signal; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
168 new->sig_hdl = handler; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
169 CHECK_MALLOC_DO( new->modname = strdup(modname), { free(new); return ENOMEM; } ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
170 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
171 /* Search in the list if we already have a handler for this signal */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
172 CHECK_POSIX(pthread_mutex_lock(&sig_hdl_lock)); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
173 for (next = sig_hdl_list.next; next != &sig_hdl_list; next = next->next) { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
174 struct sig_hdl * nh = (struct sig_hdl *)next; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
175 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
176 if (nh->signal < signal) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
177 continue; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
178 if (nh->signal == signal) { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
179 matched = 1; |
236
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
180 TRACE_DEBUG(INFO, "Signal %d (%s) is already registered by module '%s'", signal, fd_sig_abbrev(signal), nh->modname); |
235
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
181 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
182 break; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
183 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
184 if (!matched) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
185 /* Insert the new element before the next handle */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
186 fd_list_insert_before(next, &new->chain); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
187 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
188 CHECK_POSIX(pthread_mutex_unlock(&sig_hdl_lock)); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
189 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
190 if (matched) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
191 return EALREADY; /* Already registered... */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
192 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
193 /* OK, now start the thread */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
194 CHECK_POSIX( pthread_create( &new->sig_thr, NULL, signal_catcher, new ) ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
195 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
196 /* All good */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
197 return 0; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
198 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
199 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
200 /* Dump list of handlers */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
201 void fd_sig_dump(int level, int indent) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
202 { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
203 struct fd_list * li = NULL; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
204 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
205 if (!TRACE_BOOL(level)) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
206 return; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
207 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
208 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
209 CHECK_POSIX_DO(pthread_mutex_lock(&sig_hdl_lock), /* continue */); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
210 if (!FD_IS_LIST_EMPTY(&sig_hdl_list)) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
211 fd_log_debug("%*sList of registered signal handlers:\n", indent, ""); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
212 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
213 for (li = sig_hdl_list.next; li != &sig_hdl_list; li = li->next) { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
214 struct sig_hdl * h = (struct sig_hdl *)li; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
215 |
236
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
216 fd_log_debug("%*s - sig %*d (%s) => %p in module %s\n", indent, "", 2, h->signal, fd_sig_abbrev(h->signal), h->sig_hdl, h->modname); |
235
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
217 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
218 CHECK_POSIX_DO(pthread_mutex_unlock(&sig_hdl_lock), /* continue */); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
219 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
220 return; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
221 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
222 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
223 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
224 /* Remove a callback */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
225 int fd_sig_unregister(int signal) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
226 { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
227 struct fd_list * li = NULL; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
228 struct sig_hdl * h = NULL; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
229 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
230 TRACE_ENTRY("%d", signal); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
231 CHECK_PARAMS( signal && sig_initialized ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
232 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
233 /* Search in the list if we already have a handler for this signal */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
234 CHECK_POSIX(pthread_mutex_lock(&sig_hdl_lock)); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
235 for (li = sig_hdl_list.next; li != &sig_hdl_list; li = li->next) { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
236 struct sig_hdl * nh = (struct sig_hdl *)li; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
237 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
238 if (nh->signal < signal) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
239 continue; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
240 if (nh->signal == signal) { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
241 h = nh; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
242 fd_list_unlink(&h->chain); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
243 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
244 break; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
245 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
246 CHECK_POSIX(pthread_mutex_unlock(&sig_hdl_lock)); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
247 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
248 if (!h) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
249 return ENOENT; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
250 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
251 /* Stop the catcher thread */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
252 CHECK_FCT( fd_thr_term(&h->sig_thr) ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
253 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
254 /* Free */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
255 free(h->modname); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
256 free(h); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
257 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
258 /* All good */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
259 return 0; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
260 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
261 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
262 /* Terminate the signal handler thread -- must be called if fd_sig_init was called */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
263 void fd_sig_fini(void) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
264 { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
265 if (!sig_initialized) |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
266 return; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
267 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
268 /* For each registered handler, stop the thread, free the associated memory */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
269 CHECK_POSIX_DO(pthread_mutex_lock(&sig_hdl_lock), /* continue */); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
270 while (!FD_IS_LIST_EMPTY(&sig_hdl_list)) { |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
271 struct sig_hdl * h = (struct sig_hdl *)sig_hdl_list.next; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
272 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
273 /* Unlink */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
274 fd_list_unlink(&h->chain); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
275 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
276 /* Stop the catcher thread */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
277 CHECK_FCT_DO( fd_thr_term(&h->sig_thr), /* continue */ ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
278 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
279 /* Free */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
280 free(h->modname); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
281 free(h); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
282 } |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
283 CHECK_POSIX_DO(pthread_mutex_unlock(&sig_hdl_lock), /* continue */); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
284 |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
285 /* Destroy the thread attribute */ |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
286 CHECK_POSIX_DO( pthread_attr_destroy(&detached), /* continue */ ); |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
287 return; |
8773740401a5
Centralized signal handlers management in the library
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
288 } |
236
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
289 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
290 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
291 /**************************************************************************************/ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
292 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
293 static char **abbrevs; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
294 static size_t abbrevs_nr = 0; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
295 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
296 /* Initialize the array of signals */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
297 static int abbrevs_init(void) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
298 { |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
299 int i; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
300 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
301 #define SIGNAL_MAX_LIMIT 100 /* Do not save signals with value > this */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
302 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
303 /* The raw list of signals in the system -- might be incomplete, add any signal you need */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
304 struct sig_abb_raw { |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
305 int sig; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
306 char *name; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
307 } abbrevs_raw[] = { |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
308 { 0, "[unknown signal]" } |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
309 #define RAW_SIGNAL( _sig ) ,{ _sig, #_sig } |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
310 #ifdef SIGBUS |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
311 RAW_SIGNAL( SIGBUS ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
312 #endif /* SIGBUS */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
313 #ifdef SIGTTIN |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
314 RAW_SIGNAL( SIGTTIN ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
315 #endif /* SIGTTIN */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
316 #ifdef SIGTTOU |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
317 RAW_SIGNAL( SIGTTOU ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
318 #endif /* SIGTTOU */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
319 #ifdef SIGPROF |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
320 RAW_SIGNAL( SIGPROF ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
321 #endif /* SIGPROF */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
322 #ifdef SIGALRM |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
323 RAW_SIGNAL( SIGALRM ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
324 #endif /* SIGALRM */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
325 #ifdef SIGFPE |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
326 RAW_SIGNAL( SIGFPE ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
327 #endif /* SIGFPE */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
328 #ifdef SIGSTKFLT |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
329 RAW_SIGNAL( SIGSTKFLT ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
330 #endif /* SIGSTKFLT */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
331 #ifdef SIGSTKSZ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
332 RAW_SIGNAL( SIGSTKSZ ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
333 #endif /* SIGSTKSZ */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
334 #ifdef SIGUSR1 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
335 RAW_SIGNAL( SIGUSR1 ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
336 #endif /* SIGUSR1 */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
337 #ifdef SIGURG |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
338 RAW_SIGNAL( SIGURG ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
339 #endif /* SIGURG */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
340 #ifdef SIGIO |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
341 RAW_SIGNAL( SIGIO ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
342 #endif /* SIGIO */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
343 #ifdef SIGQUIT |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
344 RAW_SIGNAL( SIGQUIT ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
345 #endif /* SIGQUIT */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
346 #ifdef SIGABRT |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
347 RAW_SIGNAL( SIGABRT ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
348 #endif /* SIGABRT */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
349 #ifdef SIGTRAP |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
350 RAW_SIGNAL( SIGTRAP ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
351 #endif /* SIGTRAP */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
352 #ifdef SIGVTALRM |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
353 RAW_SIGNAL( SIGVTALRM ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
354 #endif /* SIGVTALRM */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
355 #ifdef SIGSEGV |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
356 RAW_SIGNAL( SIGSEGV ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
357 #endif /* SIGSEGV */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
358 #ifdef SIGCONT |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
359 RAW_SIGNAL( SIGCONT ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
360 #endif /* SIGCONT */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
361 #ifdef SIGPIPE |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
362 RAW_SIGNAL( SIGPIPE ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
363 #endif /* SIGPIPE */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
364 #ifdef SIGWINCH |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
365 RAW_SIGNAL( SIGWINCH ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
366 #endif /* SIGWINCH */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
367 #ifdef SIGXFSZ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
368 RAW_SIGNAL( SIGXFSZ ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
369 #endif /* SIGXFSZ */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
370 #ifdef SIGHUP |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
371 RAW_SIGNAL( SIGHUP ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
372 #endif /* SIGHUP */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
373 #ifdef SIGCHLD |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
374 RAW_SIGNAL( SIGCHLD ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
375 #endif /* SIGCHLD */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
376 #ifdef SIGSYS |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
377 RAW_SIGNAL( SIGSYS ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
378 #endif /* SIGSYS */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
379 #ifdef SIGSTOP |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
380 RAW_SIGNAL( SIGSTOP ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
381 #endif /* SIGSTOP */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
382 #ifdef SIGUSR2 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
383 RAW_SIGNAL( SIGUSR2 ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
384 #endif /* SIGUSR2 */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
385 #ifdef SIGTSTP |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
386 RAW_SIGNAL( SIGTSTP ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
387 #endif /* SIGTSTP */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
388 #ifdef SIGKILL |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
389 RAW_SIGNAL( SIGKILL ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
390 #endif /* SIGKILL */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
391 #ifdef SIGXCPU |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
392 RAW_SIGNAL( SIGXCPU ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
393 #endif /* SIGXCPU */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
394 #ifdef SIGUNUSED |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
395 RAW_SIGNAL( SIGUNUSED ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
396 #endif /* SIGUNUSED */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
397 #ifdef SIGPWR |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
398 RAW_SIGNAL( SIGPWR ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
399 #endif /* SIGPWR */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
400 #ifdef SIGILL |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
401 RAW_SIGNAL( SIGILL ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
402 #endif /* SIGILL */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
403 #ifdef SIGINT |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
404 RAW_SIGNAL( SIGINT ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
405 #endif /* SIGINT */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
406 #ifdef SIGIOT |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
407 RAW_SIGNAL( SIGIOT ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
408 #endif /* SIGIOT */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
409 #ifdef SIGTERM |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
410 RAW_SIGNAL( SIGTERM ) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
411 #endif /* SIGTERM */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
412 }; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
413 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
414 TRACE_ENTRY(""); |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
415 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
416 /* First pass: find the highest signal number */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
417 for (i=0; i < sizeof(abbrevs_raw)/sizeof(abbrevs_raw[0]); i++) { |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
418 if (abbrevs_raw[i].sig > SIGNAL_MAX_LIMIT) { |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
419 TRACE_DEBUG(ANNOYING, "Ignoring signal %s (%d), increase SIGNAL_MAX_LIMIT if you want it included", abbrevs_raw[i].name, abbrevs_raw[i].sig); |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
420 continue; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
421 } |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
422 if (abbrevs_raw[i].sig > abbrevs_nr) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
423 abbrevs_nr = abbrevs_raw[i].sig; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
424 } |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
425 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
426 /* Now, alloc the array */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
427 abbrevs_nr++; /* 0-based */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
428 CHECK_MALLOC( abbrevs = calloc( abbrevs_nr, sizeof(char *) ) ); |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
429 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
430 /* Second pass: add all the signals in the array */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
431 for (i=0; i < sizeof(abbrevs_raw)/sizeof(abbrevs_raw[0]); i++) { |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
432 if (abbrevs_raw[i].sig > SIGNAL_MAX_LIMIT) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
433 continue; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
434 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
435 if (abbrevs[abbrevs_raw[i].sig] == NULL) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
436 abbrevs[abbrevs_raw[i].sig] = abbrevs_raw[i].name; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
437 } |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
438 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
439 /* Third pass: Set all missing signals to the undef value */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
440 for (i=0; i < abbrevs_nr; i++) { |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
441 if (abbrevs[i] == NULL) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
442 abbrevs[i] = abbrevs_raw[0].name; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
443 } |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
444 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
445 /* Done! */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
446 return 0; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
447 } |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
448 |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
449 /* Names of signals */ |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
450 const char * fd_sig_abbrev(int signal) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
451 { |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
452 if (signal < abbrevs_nr) |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
453 return abbrevs[signal]; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
454 return abbrevs[0]; |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
455 } |
60f34df3e025
Remove dependency on signalent.h
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
235
diff
changeset
|
456 |