gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r21909 - gnunet/src/core


From: gnunet
Subject: [GNUnet-SVN] r21909 - gnunet/src/core
Date: Tue, 12 Jun 2012 13:24:39 +0200

Author: wachs
Date: 2012-06-12 13:24:39 +0200 (Tue, 12 Jun 2012)
New Revision: 21909

Modified:
   gnunet/src/core/gnunet-core.c
Log:
core monitor mode

Modified: gnunet/src/core/gnunet-core.c
===================================================================
--- gnunet/src/core/gnunet-core.c       2012-06-12 11:17:11 UTC (rev 21908)
+++ gnunet/src/core/gnunet-core.c       2012-06-12 11:24:39 UTC (rev 21909)
@@ -32,8 +32,38 @@
 #include "gnunet_core_service.h"
 #include "gnunet_program_lib.h"
 
+/**
+ * Option -m.
+ */
+static int monitor_connections;
 
 /**
+ * Current number of connections in monitor mode
+ */
+static int monitor_connections_counter;
+
+static struct GNUNET_CORE_Handle *ch;
+
+/**
+ * Task run in monitor mode when the user presses CTRL-C to abort.
+ * Stops monitoring activity.
+ *
+ * @param cls the 'struct GNUNET_TRANSPORT_PeerIterateContext *'
+ * @param tc scheduler context
+ */
+static void
+shutdown_task (void *cls,
+               const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  if (NULL != ch)
+  {
+    GNUNET_CORE_disconnect (ch);
+    ch = NULL;
+  }
+}
+
+
+/**
  * Callback for retrieving a list of connected peers.
  *
  * @param cls closure (unused)
@@ -56,6 +86,58 @@
 
 
 /**
+ * Function called to notify core users that another
+ * peer connected to us.
+ *
+ * @param cls closure
+ * @param peer the peer that connected
+ * @param ats performance data
+ * @param ats_count number of entries in ats (excluding 0-termination)
+ */
+static void
+monitor_notify_connect (void *cls, const struct GNUNET_PeerIdentity *peer,
+                const struct GNUNET_ATS_Information *ats, uint32_t ats_count)
+{
+  monitor_connections_counter ++;
+  struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get();
+  char *now_str = GNUNET_STRINGS_absolute_time_to_string (now);
+  FPRINTF (stdout, _("%24s: %-17s %4s   (%u connections in total)\n"),
+           now_str,
+           _("Connected to"),
+           GNUNET_i2s (peer),
+           monitor_connections_counter);
+
+  GNUNET_free (now_str);
+}
+
+
+/**
+ * Function called to notify core users that another
+ * peer disconnected from us.
+ *
+ * @param cls closure
+ * @param peer the peer that disconnected
+ */
+static void
+monitor_notify_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer)
+{
+  struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get();
+  char *now_str = GNUNET_STRINGS_absolute_time_to_string (now);
+
+  GNUNET_assert (monitor_connections_counter > 0);
+  monitor_connections_counter --;
+
+  FPRINTF (stdout, _("%24s: %-17s %4s   (%u connections in total)\n"),
+           now_str,
+           _("Disconnected from"),
+           GNUNET_i2s (peer),
+           monitor_connections_counter);
+  GNUNET_free (now_str);
+}
+
+
+
+/**
  * Main function that will be run by the scheduler.
  *
  * @param cls closure
@@ -72,7 +154,26 @@
     FPRINTF (stderr, _("Invalid command line argument `%s'\n"), args[0]);
     return;
   }
-  GNUNET_CORE_iterate_peers (cfg, &connected_peer_callback, NULL);
+  if (GNUNET_NO == monitor_connections)
+    GNUNET_CORE_iterate_peers (cfg, &connected_peer_callback, NULL);
+  else
+  {
+    const static struct GNUNET_CORE_MessageHandler handlers[] = {
+      {NULL, 0, 0}
+    };
+
+    ch = GNUNET_CORE_connect (cfg, NULL, NULL,
+                              monitor_notify_connect,
+                              monitor_notify_disconnect,
+                              NULL, GNUNET_NO,
+                              NULL, GNUNET_NO,
+                              handlers);
+
+    if (NULL == ch)
+      GNUNET_SCHEDULER_add_now (shutdown_task, NULL);
+    else
+      GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, 
shutdown_task, NULL);
+  }
 }
 
 
@@ -86,18 +187,29 @@
 int
 main (int argc, char *const *argv)
 {
+  int res;
   static const struct GNUNET_GETOPT_CommandLineOption options[] = {
+    {'m', "monitor", NULL,
+     gettext_noop ("provide information about all current connections 
(continuously)"),
+     0, &GNUNET_GETOPT_set_one, &monitor_connections},
     GNUNET_GETOPT_OPTION_END
   };
 
   if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
     return 2;
 
-  return (GNUNET_OK ==
-          GNUNET_PROGRAM_run (argc, argv, "gnunet-core",
-                              gettext_noop
-                              ("Print information about connected peers."),
-                              options, &run, NULL)) ? 0 : 1;
+
+  res = GNUNET_PROGRAM_run (argc, argv, "gnunet-core",
+                      gettext_noop
+                      ("Print information about connected peers."),
+                      options, &run, NULL);
+
+  GNUNET_free ((void *) argv);
+
+  if (GNUNET_OK == res)
+    return 0;
+  else
+    return 1;
 }
 
 /* end of gnunet-core.c */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]