stroke: Make down-nb actually non-blocking
authorTobias Brunner <tobias@strongswan.org>
Wed, 4 Nov 2015 15:44:17 +0000 (16:44 +0100)
committerTobias Brunner <tobias@strongswan.org>
Mon, 9 Nov 2015 09:55:46 +0000 (10:55 +0100)
Fixes #1191.

src/libcharon/plugins/stroke/stroke_control.c

index 0125d17..5a1a507 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 Tobias Brunner
+ * Copyright (C) 2013-2015 Tobias Brunner
  * Copyright (C) 2008 Martin Willi
  * Hochschule fuer Technik Rapperswil
  *
@@ -298,6 +298,41 @@ static void report_terminate_status(private_stroke_control_t *this,
        }
 }
 
+/**
+ * Call the charon controller to terminate a CHILD_SA
+ */
+static void charon_terminate(private_stroke_control_t *this, u_int32_t id,
+                                                        stroke_msg_t *msg, FILE *out, bool child)
+{
+       if (msg->output_verbosity >= 0)
+       {
+               stroke_log_info_t info = { msg->output_verbosity, out };
+               status_t status;
+
+               if (child)
+               {
+                       status = charon->controller->terminate_child(charon->controller, id,
+                                                       (controller_cb_t)stroke_log, &info, this->timeout);
+               }
+               else
+               {
+                       status = charon->controller->terminate_ike(charon->controller, id,
+                                                       (controller_cb_t)stroke_log, &info, this->timeout);
+               }
+               report_terminate_status(this, status, out, id, child);
+       }
+       else if (child)
+       {
+               charon->controller->terminate_child(charon->controller, id,
+                                                                                   NULL, NULL, 0);
+       }
+       else
+       {
+               charon->controller->terminate_ike(charon->controller, id,
+                                                                                 NULL, NULL, 0);
+       }
+}
+
 METHOD(stroke_control_t, terminate, void,
        private_stroke_control_t *this, stroke_msg_t *msg, FILE *out)
 {
@@ -307,9 +342,7 @@ METHOD(stroke_control_t, terminate, void,
        ike_sa_t *ike_sa;
        enumerator_t *enumerator;
        linked_list_t *ike_list, *child_list;
-       stroke_log_info_t info;
        uintptr_t del;
-       status_t status;
 
        if (!parse_specifier(msg->terminate.name, &id, &name, &child, &all))
        {
@@ -317,22 +350,9 @@ METHOD(stroke_control_t, terminate, void,
                return;
        }
 
-       info.out = out;
-       info.level = msg->output_verbosity;
-
        if (id)
        {
-               if (child)
-               {
-                       status = charon->controller->terminate_child(charon->controller, id,
-                                                       (controller_cb_t)stroke_log, &info, this->timeout);
-               }
-               else
-               {
-                       status = charon->controller->terminate_ike(charon->controller, id,
-                                                       (controller_cb_t)stroke_log, &info, this->timeout);
-               }
-               return report_terminate_status(this, status, out, id, child);
+               return charon_terminate(this, id, msg, out, child);
        }
 
        ike_list = linked_list_create();
@@ -380,18 +400,14 @@ METHOD(stroke_control_t, terminate, void,
        enumerator = child_list->create_enumerator(child_list);
        while (enumerator->enumerate(enumerator, &del))
        {
-               status = charon->controller->terminate_child(charon->controller, del,
-                                                       (controller_cb_t)stroke_log, &info, this->timeout);
-               report_terminate_status(this, status, out, del, TRUE);
+               charon_terminate(this, del, msg, out, TRUE);
        }
        enumerator->destroy(enumerator);
 
        enumerator = ike_list->create_enumerator(ike_list);
        while (enumerator->enumerate(enumerator, &del))
        {
-               status = charon->controller->terminate_ike(charon->controller, del,
-                                                       (controller_cb_t)stroke_log, &info, this->timeout);
-               report_terminate_status(this, status, out, del, FALSE);
+               charon_terminate(this, del, msg, out, FALSE);
        }
        enumerator->destroy(enumerator);
 
@@ -548,11 +564,6 @@ METHOD(stroke_control_t, purge_ike, void,
        child_sa_t *child_sa;
        linked_list_t *list;
        uintptr_t del;
-       stroke_log_info_t info;
-       status_t status;
-
-       info.out = out;
-       info.level = msg->output_verbosity;
 
        list = linked_list_create();
        enumerator = charon->controller->create_ike_sa_enumerator(
@@ -572,9 +583,7 @@ METHOD(stroke_control_t, purge_ike, void,
        enumerator = list->create_enumerator(list);
        while (enumerator->enumerate(enumerator, &del))
        {
-               status = charon->controller->terminate_ike(charon->controller, del,
-                                                       (controller_cb_t)stroke_log, &info, this->timeout);
-               report_terminate_status(this, status, out, del, TRUE);
+               charon_terminate(this, del, msg, out, FALSE);
        }
        enumerator->destroy(enumerator);
        list->destroy(list);