If used the format specifier %M prints the number of passive, queued,
and active tasks in an IKE_SA plus the string representation of the
tasks in the particular list.
---
 src/libcharon/daemon.c          |    5 +++
 src/libcharon/sa/ike_sa.c       |   13 ++++++++
 src/libcharon/sa/ike_sa.h       |   12 +++++++
 src/libcharon/sa/task_manager.c |   65 +++++++++++++++++++++++++++++++++++++++
 src/libcharon/sa/task_manager.h |   11 ++++++
 5 files changed, 106 insertions(+), 0 deletions(-)

diff --git a/src/libcharon/daemon.c b/src/libcharon/daemon.c
index b338f6e..30a8bc7 100644
--- a/src/libcharon/daemon.c
+++ b/src/libcharon/daemon.c
@@ -437,6 +437,11 @@ bool libcharon_init()
                                                                  
proposal_printf_hook,
                                                                  
PRINTF_HOOK_ARGTYPE_POINTER,
                                                                  
PRINTF_HOOK_ARGTYPE_END);
+       lib->printf_hook->add_handler(lib->printf_hook, 'M',
+                                                                 
task_manager_printf_hook,
+                                                                 
PRINTF_HOOK_ARGTYPE_POINTER,
+                                                                 
PRINTF_HOOK_ARGTYPE_POINTER,
+                                                                 
PRINTF_HOOK_ARGTYPE_END);

        if (lib->integrity &&
                !lib->integrity->check(lib->integrity, "libcharon", 
libcharon_init))
diff --git a/src/libcharon/sa/ike_sa.c b/src/libcharon/sa/ike_sa.c
index 0b77f5f..8e31572 100644
--- a/src/libcharon/sa/ike_sa.c
+++ b/src/libcharon/sa/ike_sa.c
@@ -2022,6 +2022,19 @@ static status_t inherit(private_ike_sa_t *this, 
private_ike_sa_t *other)
 }

 /**
+ * Implementation of ike_sa_t.task_manager_printf_hook.
+ */
+int task_manager_printf_hook(char *dst, size_t len, printf_hook_spec_t *spec,
+                                                const void *const *args)
+{
+       private_ike_sa_t *this = *((private_ike_sa_t **)(args[0]));
+       const char *prefix = *((const char **)(args[1]));
+
+       return this->task_manager->print_task_queues(this->task_manager, dst, 
len,
+                       prefix ? prefix : "");
+}
+
+/**
  * Implementation of ike_sa_t.destroy.
  */
 static void destroy(private_ike_sa_t *this)
diff --git a/src/libcharon/sa/ike_sa.h b/src/libcharon/sa/ike_sa.h
index c61502e..a7671e6 100644
--- a/src/libcharon/sa/ike_sa.h
+++ b/src/libcharon/sa/ike_sa.h
@@ -911,6 +911,18 @@ struct ike_sa_t {
 };

 /**
+ * printf hook function for task_manager_t. This hook actually belongs
+ * into task_manager_t, but since the task_manager is a private member
+ * of the ike_sa it resides in here.
+ *
+ * arguments are:
+ *    ike_sa_t *ike_sa
+ *    const char *prefix
+ */
+int task_manager_printf_hook(char *dst, size_t len, printf_hook_spec_t *spec,
+               const void *const *args);
+
+/**
  * Creates an ike_sa_t object with a specific ID.
  *
  * @param ike_sa_id    ike_sa_id_t object to associate with new IKE_SA
diff --git a/src/libcharon/sa/task_manager.c b/src/libcharon/sa/task_manager.c
index 4c8f3be..ecf77ed 100644
--- a/src/libcharon/sa/task_manager.c
+++ b/src/libcharon/sa/task_manager.c
@@ -1029,6 +1029,70 @@ static void reset(private_task_manager_t *this,
        this->reset = TRUE;
 }

+static size_t print_task_queue(linked_list_t *queue, char **dst, size_t *len,
+               const char *prefix)
+{
+       task_t *task;
+       int printed = 0;
+       bool first = TRUE;
+       size_t written = 0;
+       enumerator_t *enumerator;
+
+       enumerator = queue->create_enumerator(queue);
+       while (enumerator->enumerate(enumerator, (void **)&task))
+       {
+               if (first)
+               {
+                       written += print_in_hook(*dst, *len, "%s    ", prefix);
+                       first = FALSE;
+               }
+               else
+               {
+                       written += print_in_hook(*dst, *len, ",");
+               }
+
+               if (printed == 3)
+               {
+                       written += print_in_hook(*dst, *len, "\n%s    ", 
prefix);
+                       printed = 0;
+               }
+
+               written += print_in_hook(*dst, *len, " %N", task_type_names,
+                               task->get_type(task));
+               ++printed;
+
+       }
+       enumerator->destroy(enumerator);
+       if (written)
+       {
+               written += print_in_hook(*dst, *len, "\n");
+       }
+
+       return written;
+}
+
+/**
+ * Implementation of task_manager_t.print_task_queues
+ */
+static size_t print_task_queues(private_task_manager_t *this, char *dst,
+               size_t len, const char *prefix)
+{
+       size_t written;
+
+       written =  print_in_hook(dst, len, "%s Task-Manager status:\n", prefix);
+       written += print_in_hook(dst, len, "%s   %d Passive Tasks:\n", prefix,
+                       this->passive_tasks->get_count(this->passive_tasks));
+       written += print_task_queue(this->passive_tasks, &dst, &len, prefix);
+       written += print_in_hook(dst, len, "%s   %d Queued Tasks:\n", prefix,
+                       this->queued_tasks->get_count(this->queued_tasks));
+       written += print_task_queue(this->queued_tasks, &dst, &len, prefix);
+       written += print_in_hook(dst, len, "%s   %d Active Tasks:\n", prefix,
+                       this->active_tasks->get_count(this->active_tasks));
+       written += print_task_queue(this->active_tasks, &dst, &len, prefix);
+
+       return written;
+}
+
 /**
  * Implementation of task_manager_t.destroy
  */
@@ -1059,6 +1123,7 @@ task_manager_t *task_manager_create(ike_sa_t *ike_sa)
        this->public.reset = 
(void(*)(task_manager_t*,u_int32_t,u_int32_t))reset;
        this->public.adopt_tasks = 
(void(*)(task_manager_t*,task_manager_t*))adopt_tasks;
        this->public.busy = (bool(*)(task_manager_t*))busy;
+       this->public.print_task_queues = 
(size_t(*)(task_manager_t*,char*,size_t,const char*))print_task_queues;
        this->public.destroy = (void(*)(task_manager_t*))destroy;

        this->ike_sa = ike_sa;
diff --git a/src/libcharon/sa/task_manager.h b/src/libcharon/sa/task_manager.h
index 731ed48..003ab7b 100644
--- a/src/libcharon/sa/task_manager.h
+++ b/src/libcharon/sa/task_manager.h
@@ -158,6 +158,17 @@ struct task_manager_t {
        bool (*busy) (task_manager_t *this);

        /**
+        * Print tasks queued to active, passive and queued task queue to buffer
+        * with the given length.
+        *
+        * @param dst                   buffer to write to
+        * @param len                   length of the buffer
+        * @param width                 string to prefix to output
+        * @return                              number of bytes written to dst
+        */
+       size_t (*print_task_queues)(task_manager_t *this, char *dst, size_t 
len, const char *prefix);
+
+       /**
         * Destroy the task_manager_t.
         */
        void (*destroy) (task_manager_t *this);
-- 1.5.6.5

_______________________________________________
Dev mailing list
[email protected]
https://lists.strongswan.org/mailman/listinfo/dev

Reply via email to