diff freeDiameter/main.c @ 235:8773740401a5

Centralized signal handlers management in the library
author Sebastien Decugis <sdecugis@nict.go.jp>
date Fri, 05 Mar 2010 19:01:48 +0900
parents 113eb3d50ad9
children 60f34df3e025
line wrap: on
line diff
--- a/freeDiameter/main.c	Thu Mar 04 17:32:00 2010 +0900
+++ b/freeDiameter/main.c	Fri Mar 05 19:01:48 2010 +0900
@@ -41,7 +41,7 @@
 #include <gcrypt.h>
 
 /* forward declarations */
-static void * sig_hdl(void * arg);
+static void fd_shutdown(int signal);
 static int main_cmdline(int argc, char *argv[]);
 static void main_version(void);
 static void main_help( void );
@@ -57,17 +57,11 @@
 int main(int argc, char * argv[])
 {
 	int ret;
-	pthread_t sig_th;
-	sigset_t sig_all;
 	
 	memset(fd_g_config, 0, sizeof(struct fd_config));
 	
-	/* Block all signals */
-	sigfillset(&sig_all);
-	CHECK_POSIX(  pthread_sigmask(SIG_BLOCK, &sig_all, NULL)  );
-	
 	/* Initialize the library -- must come first since it initializes the debug facility */
-	CHECK_FCT( fd_lib_init() );
+	CHECK_FCT( fd_lib_init(1) );
 	TRACE_DEBUG(INFO, "libfreeDiameter initialized.");
 	
 	/* Name this thread */
@@ -90,8 +84,9 @@
 	/* Parse the command-line */
 	CHECK_FCT(  main_cmdline(argc, argv)  );
 	
-	/* Allow SIGINT and SIGTERM from this point */
-	CHECK_POSIX(  pthread_create(&sig_th, NULL, sig_hdl, NULL)  );
+	/* Allow SIGINT and SIGTERM from this point to terminate the application */
+	CHECK_FCT( fd_sig_register(SIGINT,  "freeDiameter.main", fd_shutdown) );
+	CHECK_FCT( fd_sig_register(SIGTERM, "freeDiameter.main", fd_shutdown) );
 	
 	/* Add definitions of the base protocol */
 	CHECK_FCT( fd_dict_base_protocol(fd_g_config->cnf_dict) );
@@ -109,6 +104,7 @@
 	CHECK_FCT(  fd_ext_load()  );
 	
 	fd_conf_dump();
+	fd_sig_dump(FULL, 1);
 	
 	/* Start the servers */
 	CHECK_FCT( fd_servers_start() );
@@ -169,11 +165,12 @@
 	CHECK_FCT_DO( fd_ext_fini(), /* Cleanup all extensions */ );
 	CHECK_FCT_DO( fd_rtdisp_cleanup(), /* destroy remaining handlers */ );
 	
-	CHECK_FCT_DO( fd_thr_term(&sig_th), /* reclaim resources of the signal thread */ );
-	
 	GNUTLS_TRACE( gnutls_global_deinit() );
 	
 	fd_log_debug(FD_PROJECT_BINARY " daemon is terminated.\n");
+	
+	fd_lib_fini();
+	
 	return ret;
 }
 
@@ -318,33 +315,14 @@
   		"  -q, --quiet            Decrease verbosity then remove debug messages\n");
 }
 
-#ifdef HAVE_SIGNALENT_H
-const char *const signalstr[] = {
-# include "signalent.h"
-};
-const int nsignalstr = sizeof signalstr / sizeof signalstr[0];
-# define SIGNALSTR(sig) (((sig) < nsignalstr) ? signalstr[(sig)] : "unknown")
-#else /* HAVE_SIGNALENT_H */
-# define SIGNALSTR(sig) ("")
-#endif /* HAVE_SIGNALENT_H */
-
-/* signal handler */
-static void * sig_hdl(void * arg)
+/* Terminate the application */
+static void fd_shutdown(int signal)
 {
-	sigset_t sig_main;
-	int sig = 0;
-	
-	TRACE_ENTRY();
-	fd_log_threadname("Main signal handler");
+	TRACE_ENTRY("%d", signal);
 	
-	sigemptyset(&sig_main);
-	sigaddset(&sig_main, SIGINT);
-	sigaddset(&sig_main, SIGTERM);
-	
-	CHECK_SYS_DO(  sigwait(&sig_main, &sig), TRACE_DEBUG(INFO, "Error in sigwait function") );
+	TRACE_DEBUG(INFO, "Received signal %s (%d), exiting", SIGNALSTR(signal), signal);
+
+	CHECK_FCT_DO( fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), exit(2) );
 	
-	TRACE_DEBUG(INFO, "Received signal %s (%d), exiting", SIGNALSTR(sig), sig);
-	CHECK_FCT_DO( fd_event_send(fd_g_config->cnf_main_ev, FDEV_TERMINATE, 0, NULL), exit(2) );
-	return NULL;
+	return;
 }
-	
"Welcome to our mercurial repository"