summaryrefslogtreecommitdiff
path: root/src/auditor
diff options
context:
space:
mode:
Diffstat (limited to 'src/auditor')
-rw-r--r--src/auditor/report-lib.c69
-rw-r--r--src/auditor/report-lib.h11
2 files changed, 80 insertions, 0 deletions
diff --git a/src/auditor/report-lib.c b/src/auditor/report-lib.c
index 3074b579a..0956bcaee 100644
--- a/src/auditor/report-lib.c
+++ b/src/auditor/report-lib.c
@@ -72,6 +72,36 @@ struct GNUNET_TIME_Absolute start_time;
*/
static struct GNUNET_CONTAINER_MultiHashMap *denominations;
+/**
+ * Flag that is raised to 'true' if the user
+ * presses CTRL-C to abort the audit.
+ */
+static volatile bool abort_flag;
+
+/**
+ * Context for the SIG-INT (ctrl-C) handler.
+ */
+static struct GNUNET_SIGNAL_Context *sig_int;
+
+/**
+ * Context for the SIGTERM handler.
+ */
+static struct GNUNET_SIGNAL_Context *sig_term;
+
+
+/**
+ * Test if the audit should be aborted because the user
+ * pressed CTRL-C.
+ *
+ * @return false to continue the audit, true to terminate
+ * cleanly as soon as possible
+ */
+bool
+TALER_ARL_do_abort (void)
+{
+ return abort_flag;
+}
+
/**
* Convert absolute time to human-readable JSON string.
@@ -606,6 +636,16 @@ TALER_ARL_amount_subtract_neg_ (struct TALER_Amount *diff,
/**
+ * Signal handler called for signals that should cause us to shutdown.
+ */
+static void
+handle_sigint (void)
+{
+ abort_flag = true;
+}
+
+
+/**
* Setup global variables based on configuration.
*
* @param c configuration to use
@@ -672,11 +712,30 @@ TALER_ARL_init (const struct GNUNET_CONFIGURATION_Handle *c)
return GNUNET_SYSERR;
}
}
+ sig_int = GNUNET_SIGNAL_handler_install (SIGINT,
+ &handle_sigint);
+ if (NULL == sig_int)
+ {
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
+ "signal");
+ TALER_ARL_done (NULL);
+ return GNUNET_SYSERR;
+ }
+ sig_term = GNUNET_SIGNAL_handler_install (SIGTERM,
+ &handle_sigint);
+ if (NULL == sig_term)
+ {
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
+ "signal");
+ TALER_ARL_done (NULL);
+ return GNUNET_SYSERR;
+ }
if (NULL ==
(TALER_ARL_edb = TALER_EXCHANGEDB_plugin_load (TALER_ARL_cfg)))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Failed to initialize exchange database plugin.\n");
+ TALER_ARL_done (NULL);
return GNUNET_SYSERR;
}
if (NULL ==
@@ -727,6 +786,16 @@ TALER_ARL_done (json_t *report)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Audit complete\n");
+ if (NULL != sig_int)
+ {
+ GNUNET_SIGNAL_handler_uninstall (sig_int);
+ sig_int = NULL;
+ }
+ if (NULL != sig_term)
+ {
+ GNUNET_SIGNAL_handler_uninstall (sig_term);
+ sig_term = NULL;
+ }
if (NULL != TALER_ARL_adb)
{
TALER_AUDITORDB_plugin_unload (TALER_ARL_adb);
diff --git a/src/auditor/report-lib.h b/src/auditor/report-lib.h
index eeb36f0a3..7ae308259 100644
--- a/src/auditor/report-lib.h
+++ b/src/auditor/report-lib.h
@@ -302,6 +302,17 @@ TALER_ARL_setup_sessions_and_run (TALER_ARL_Analysis ana,
/**
+ * Test if the audit should be aborted because the user
+ * pressed CTRL-C.
+ *
+ * @return false to continue the audit, true to terminate
+ * cleanly as soon as possible
+ */
+bool
+TALER_ARL_do_abort (void);
+
+
+/**
* Setup global variables based on configuration.
*
* @param c configuration to use