summaryrefslogtreecommitdiff
path: root/die.c
diff options
context:
space:
mode:
authorVadim Kochan <vadim4j@gmail.com>2015-05-03 11:14:07 +0300
committerTobias Klauser <tklauser@distanz.ch>2015-05-04 09:45:09 +0200
commit47fb4f6219e6936fd99d28a1e43135544d10b4ff (patch)
treeb7fcee4cfd3c1e6f4bb1699fdb3a951959827523 /die.c
parentaa6b0e3ae806029e803709bfaf9938ae5b1b785f (diff)
trafgen: Delete rfmon mac80211 device on panic
Fixed case when rfmon mac80211 created device remains after trafgen failed (for ex. - incorrect cfg file), so just delete it when panic occured. Also made panic handlers invoking per process and only once. Signed-off-by: Vadim Kochan <vadim4j@gmail.com> Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Diffstat (limited to 'die.c')
-rw-r--r--die.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/die.c b/die.c
index 4c0014d..523107e 100644
--- a/die.c
+++ b/die.c
@@ -4,28 +4,37 @@
#include "xmalloc.h"
-struct panic_func {
+struct panic_handler {
void *arg;
+ pid_t pid;
+ bool is_enabled;
void (*on_panic)(void *arg);
- struct panic_func *next;
+ struct panic_handler *next;
};
-static struct panic_func *panic_funcs;
+static struct panic_handler *panic_handlers;
void panic_func_add(void (*on_panic)(void *arg), void *arg)
{
- struct panic_func *handler = xmallocz(sizeof(*handler));
+ struct panic_handler *handler = xmallocz(sizeof(*handler));
handler->arg = arg;
+ handler->pid = getpid();
+ handler->is_enabled = true;
handler->on_panic = on_panic;
- handler->next = panic_funcs;
- panic_funcs = handler;
+ handler->next = panic_handlers;
+ panic_handlers = handler;
};
void call_on_panic_funcs(void)
{
- struct panic_func *it;
+ struct panic_handler *it;
+ pid_t pid = getpid();
- for (it = panic_funcs; it; it = it->next)
- it->on_panic(it->arg);
+ for (it = panic_handlers; it; it = it->next) {
+ if (it->pid == pid && it->is_enabled) {
+ it->is_enabled = false;
+ it->on_panic(it->arg);
+ }
+ }
}