GNUnet  0.10.x
signal.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2001, 2002, 2006 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
27 #include "platform.h"
28 #include "gnunet_util_lib.h"
29 
30 #define LOG(kind, ...) GNUNET_log_from(kind, "util-signal", __VA_ARGS__)
31 
32 
35 
37 
38  int sig;
39 
41 
42  struct sigaction oldsig;
43 };
44 
46 
48 
49 struct GNUNET_SIGNAL_Context *
51 {
52  struct GNUNET_SIGNAL_Context *ret;
53 
54  struct sigaction sig;
55 
56  ret = GNUNET_new(struct GNUNET_SIGNAL_Context);
57  ret->sig = signum;
58  ret->method = handler;
59 
60  memset(&sig, 0, sizeof(sig));
61  sig.sa_handler = (void *)handler;
62  sigemptyset(&sig.sa_mask);
63 #ifdef SA_INTERRUPT
64  sig.sa_flags = SA_INTERRUPT; /* SunOS */
65 #else
66  sig.sa_flags = SA_RESTART;
67 #endif
68  sigaction(signum, &sig, &ret->oldsig);
69 
70  GNUNET_CONTAINER_DLL_insert_tail(sc_head, sc_tail, ret);
71  return ret;
72 }
73 
74 void
76 {
77  struct sigaction sig;
78 
79  sigemptyset(&sig.sa_mask);
80  sigaction(ctx->sig, &ctx->oldsig, &sig);
81 
82  GNUNET_CONTAINER_DLL_remove(sc_head, sc_tail, ctx);
83  GNUNET_free(ctx);
84 }
85 
86 
94 void
96 {
97  struct GNUNET_SIGNAL_Context *ctx;
98 
99  for (ctx = sc_head; NULL != ctx; ctx = ctx->next)
100  {
101  if (sig != ctx->sig)
102  continue;
103  if (NULL == ctx->method)
104  continue;
105  ctx->method();
106  }
107 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
void GNUNET_SIGNAL_raise(const int sig)
Raise the given signal by calling the installed signal handlers.
Definition: signal.c:95
void GNUNET_SIGNAL_handler_uninstall(struct GNUNET_SIGNAL_Context *ctx)
Uninstall a previously installed signal hander.
Definition: signal.c:75
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static int ret
Final status code.
Definition: gnunet-arm.c:89
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
static struct GNUNET_SIGNAL_Context * sc_head
Definition: signal.c:45
struct GNUNET_SIGNAL_Context * GNUNET_SIGNAL_handler_install(int signum, GNUNET_SIGNAL_Handler handler)
Install a signal handler that will be run if the given signal is received.
Definition: signal.c:50
struct GNUNET_SIGNAL_Context * prev
Definition: signal.c:36
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
GNUNET_SIGNAL_Handler method
Definition: signal.c:40
struct GNUNET_SIGNAL_Context * next
Definition: signal.c:34
static struct GNUNET_SIGNAL_Context * sc_tail
Definition: signal.c:47
struct sigaction oldsig
Definition: signal.c:42
#define GNUNET_free(ptr)
Wrapper around free.
void(* GNUNET_SIGNAL_Handler)(void)
A signal handler.