aboutsummaryrefslogtreecommitdiffstats
path: root/src/bsc.c
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2011-02-17 00:00:55 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2011-02-17 19:34:28 +0100
commit5cd45e16ef243b8f22edf2ec4b6794a235817578 (patch)
tree25a9caf5355d2471c6662a39acddf280883f848d /src/bsc.c
parent2d4891ff8cbf3cf139a0e15db5b259930041f913 (diff)
bsc: Move the signal handling code over to the bsc.c
Diffstat (limited to 'src/bsc.c')
-rw-r--r--src/bsc.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/bsc.c b/src/bsc.c
index 090f17e..50745b0 100644
--- a/src/bsc.c
+++ b/src/bsc.c
@@ -21,6 +21,7 @@
#include <bsc_data.h>
#include <cellmgr_debug.h>
+#include <msc_connection.h>
#include <mtp_level3.h>
#include <mtp_pcap.h>
@@ -34,6 +35,8 @@
#include <string.h>
#include <assert.h>
#include <unistd.h>
+#include <signal.h>
+#include <pthread.h>
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
@@ -80,6 +83,42 @@ struct bsc_data *bsc_data_create()
return bsc;
}
+static void sigint()
+{
+ static pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER;
+ static int handled = 0;
+
+ struct mtp_link_set *set;
+
+ /* failed to lock */
+ if (pthread_mutex_trylock(&exit_mutex) != 0)
+ return;
+ if (handled)
+ goto out;
+
+ printf("Terminating.\n");
+ handled = 1;
+ if (bsc) {
+ llist_for_each_entry(set, &bsc->linksets, entry)
+ link_shutdown_all(set);
+ }
+
+ exit(0);
+
+out:
+ pthread_mutex_unlock(&exit_mutex);
+}
+
+static void sigusr2()
+{
+ struct msc_connection *msc;
+ printf("Closing the MSC connection on demand.\n");
+
+ llist_for_each_entry(msc, &bsc->mscs, entry)
+ msc_close_connection(msc);
+}
+
+
static void print_usage(const char *arg)
{
printf("Usage: %s\n", arg);
@@ -139,4 +178,8 @@ void handle_options(int argc, char **argv)
break;
}
}
+
+ signal(SIGPIPE, SIG_IGN);
+ signal(SIGINT, sigint);
+ signal(SIGUSR2, sigusr2);
}