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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
"Welcome to our mercurial repository"