diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2011-02-17 00:00:55 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2011-02-17 19:34:28 +0100 |
commit | 5cd45e16ef243b8f22edf2ec4b6794a235817578 (patch) | |
tree | 25a9caf5355d2471c6662a39acddf280883f848d /src/bsc.c | |
parent | 2d4891ff8cbf3cf139a0e15db5b259930041f913 (diff) |
bsc: Move the signal handling code over to the bsc.c
Diffstat (limited to 'src/bsc.c')
-rw-r--r-- | src/bsc.c | 43 |
1 files changed, 43 insertions, 0 deletions
@@ -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); } |