aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2010-06-24 14:05:53 +0200
committerTobias Brunner <tobias@strongswan.org>2010-06-24 14:30:06 +0200
commite9e2a4fecfbfb34ed7e4fd0c165c4b179456274c (patch)
tree7593b6ffcfaa37470d8fa0e832e8a76e7b020223
parent7913a74c3679ead20e79819a9d3080ab0a19bc9b (diff)
downloadstrongswan-e9e2a4fecfbfb34ed7e4fd0c165c4b179456274c.tar.bz2
strongswan-e9e2a4fecfbfb34ed7e4fd0c165c4b179456274c.tar.xz
Terminate charon from the Android plugin if the tunnel goes down after it was initiated successfully.
-rw-r--r--src/libcharon/plugins/android/android_service.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/libcharon/plugins/android/android_service.c b/src/libcharon/plugins/android/android_service.c
index e6df39be5..bc2816af7 100644
--- a/src/libcharon/plugins/android/android_service.c
+++ b/src/libcharon/plugins/android/android_service.c
@@ -16,6 +16,7 @@
#include <unistd.h>
#include <cutils/sockets.h>
#include <cutils/properties.h>
+#include <signal.h>
#include "android_service.h"
@@ -107,6 +108,15 @@ METHOD(listener_t, child_state_change, bool,
return TRUE;
}
+/**
+ * Callback used to shutdown the daemon
+ */
+static job_requeue_t shutdown_callback(void *data)
+{
+ kill(0, SIGTERM);
+ return JOB_REQUEUE_NONE;
+}
+
METHOD(listener_t, child_updown, bool,
private_android_service_t *this, ike_sa_t *ike_sa, child_sa_t *child_sa,
bool up)
@@ -120,6 +130,20 @@ METHOD(listener_t, child_updown, bool,
this->public.listener.child_state_change = NULL;
property_set("vpn.status", "ok");
}
+ else
+ {
+ callback_job_t *job;
+ /* the control socket is closed as soon as vpn.status is set to "ok"
+ * and the daemon proxy then only checks for terminated daemons to
+ * detect lost connections, so... */
+ DBG1(DBG_CFG, "connection lost, raising delayed SIGTERM");
+ /* to avoid any conflicts we send the SIGTERM not directly from this
+ * callback, but from a different thread. we also delay it to avoid
+ * a race condition during a regular shutdown */
+ job = callback_job_create(shutdown_callback, NULL, NULL, NULL);
+ charon->scheduler->schedule_job(charon->scheduler, (job_t*)job, 1);
+ return FALSE;
+ }
}
return TRUE;
}