/*
This file is part of GNUnet.
- (C) 2011, 2012 Christian Grothoff (and other contributing authors)
+ (C) 2011, 2012, 2014 Christian Grothoff (and other contributing authors)
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
* @author Nathan Evans
*/
#include "platform.h"
-#include "gnunet_crypto_lib.h"
-#include "gnunet_configuration_lib.h"
-#include "gnunet_getopt_lib.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_transport_service.h"
+#include "gnunet_util_lib.h"
#include "gnunet_core_service.h"
-#include "gnunet_program_lib.h"
/**
- * Callback for retrieving a list of connected peers.
+ * Option -m.
+ */
+static int monitor_connections;
+
+/**
+ * Current number of connections in monitor mode
+ */
+// static unsigned int monitor_connections_counter;
+
+/**
+ * Handle to the CORE monitor.
+ */
+static struct GNUNET_CORE_MonitorHandle *mh;
+
+
+/**
+ * Task run in monitor mode when the user presses CTRL-C to abort.
+ * Stops monitoring activity.
*
- * @param cls closure (unused)
- * @param peer peer identity this notification is about
- * @param atsi performance data for the connection
- * @param atsi_count number of records in 'atsi'
+ * @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 != mh)
+ {
+ GNUNET_CORE_monitor_stop (mh);
+ mh = NULL;
+ }
+}
+
+
+/**
+ * Function called to notify core users that another
+ * peer changed its state with us.
+ *
+ * @param cls closure
+ * @param peer the peer that changed state
+ * @param state new state of the peer
+ * @param timeout timeout for the new state
*/
static void
-connected_peer_callback (void *cls, const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_ATS_Information *atsi,
- unsigned int atsi_count)
+monitor_cb (void *cls,
+ const struct GNUNET_PeerIdentity *peer,
+ enum GNUNET_CORE_KxState state,
+ struct GNUNET_TIME_Absolute timeout)
{
- struct GNUNET_CRYPTO_HashAsciiEncoded enc;
+ struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get();
+ const char *now_str;
- if (NULL == peer)
+ if ( (NULL == peer) &&
+ (GNUNET_NO == monitor_connections) )
+ {
+ GNUNET_SCHEDULER_shutdown ();
+ return;
+ }
+ now_str = GNUNET_STRINGS_absolute_time_to_string (now);
+ FPRINTF (stdout,
+ _("%24s: %-17s %d %4s\n"),
+ now_str,
+ "FIXME",
+ state,
+ GNUNET_i2s (peer));
+}
+
+
+/**
+ * Function called with the result of the check if the CORE
+ * service is running.
+ *
+ * @param cls closure with our configuration
+ * @param result #GNUNET_YES if CORE is running
+ */
+static void
+testservice_task (void *cls,
+ int result)
+{
+ const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
+
+ if (GNUNET_OK != result)
+ {
+ FPRINTF (stderr, _("Service `%s' is not running\n"), "core");
+ return;
+ }
+
+ mh = GNUNET_CORE_monitor_start (cfg,
+ &monitor_cb,
+ NULL);
+ if (NULL == mh)
+ {
+ GNUNET_SCHEDULER_add_now (shutdown_task, NULL);
+ fprintf (stderr, ("Failed to connect to CORE service!\n"));
return;
- GNUNET_CRYPTO_hash_to_enc (&peer->hashPubKey, &enc);
- printf (_("Peer `%s'\n"), (const char *) &enc);
+ }
+ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
+ &shutdown_task, NULL);
}
run (void *cls, char *const *args, const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
- if (args[0] != NULL)
+ if (NULL != args[0])
{
- FPRINTF (stderr, _("Invalid command line argument `%s'\n"), args[0]);
+ FPRINTF (stderr,
+ _("Invalid command line argument `%s'\n"),
+ args[0]);
return;
}
- GNUNET_CORE_iterate_peers (cfg, &connected_peer_callback, NULL);
+ GNUNET_CLIENT_service_test ("core", cfg,
+ GNUNET_TIME_UNIT_SECONDS,
+ &testservice_task, (void *) cfg);
}
/**
- * The main function to obtain peer information.
+ * The main function to obtain peer information from CORE.
*
* @param argc number of arguments from the command line
* @param argv command line arguments
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
};
- return (GNUNET_OK ==
- GNUNET_PROGRAM_run (argc, argv, "gnunet-core",
- gettext_noop
- ("Print information about connected peers."),
- options, &run, NULL)) ? 0 : 1;
+
+ if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+ return 2;
+ 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;
+ return 1;
}
/* end of gnunet-core.c */