/*
This file is part of GNUnet.
- (C) 2011, 2012 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2011, 2012, 2014 GNUnet e.V.
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
You should have received a copy of the GNU General Public License
along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
*/
/**
* @file core/gnunet-core.c
- * @brief Print information about other known _connected_ peers.
+ * @brief Print information about other peers known to CORE.
* @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"
+
/**
* Option -m.
static int monitor_connections;
/**
- * Current number of connections in monitor mode
+ * Handle to the CORE monitor.
*/
-static int monitor_connections_counter;
-
-static struct GNUNET_CORE_Handle *ch;
+static struct GNUNET_CORE_MonitorHandle *mh;
-static struct GNUNET_PeerIdentity my_id;
/**
* 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
+ * @param cls NULL
*/
static void
-shutdown_task (void *cls,
- const struct GNUNET_SCHEDULER_TaskContext *tc)
+shutdown_task (void *cls)
{
- if (NULL != ch)
+ if (NULL != mh)
{
- GNUNET_CORE_disconnect (ch);
- ch = NULL;
+ GNUNET_CORE_monitor_stop (mh);
+ mh = NULL;
}
}
-/**
- * Callback for retrieving a list of connected peers.
- *
- * @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'
- */
-static void
-connected_peer_callback (void *cls, const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_ATS_Information *atsi,
- unsigned int atsi_count)
-{
- struct GNUNET_CRYPTO_HashAsciiEncoded enc;
-
- if (NULL == peer)
- return;
- GNUNET_CRYPTO_hash_to_enc (&peer->hashPubKey, &enc);
- printf (_("Peer `%s'\n"), (const char *) &enc);
-}
-
-void
-monitor_notify_startup (void *cls,
- struct GNUNET_CORE_Handle * server,
- const struct GNUNET_PeerIdentity *
- my_identity)
-{
- my_id = (*my_identity);
-}
-
-
/**
* Function called to notify core users that another
- * peer connected to us.
+ * peer changed its state with 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)
+ * @param peer the peer that changed state
+ * @param state new state of the peer
+ * @param timeout timeout for the new state
*/
static void
-monitor_notify_connect (void *cls, const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_ATS_Information *ats, uint32_t ats_count)
+monitor_cb (void *cls,
+ const struct GNUNET_PeerIdentity *peer,
+ enum GNUNET_CORE_KxState state,
+ struct GNUNET_TIME_Absolute timeout)
{
struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get();
const char *now_str;
+ const char *state_str;
- if (0 != memcmp (&my_id, peer, sizeof (my_id)))
+ if ( ( (NULL == peer) ||
+ (GNUNET_CORE_KX_ITERATION_FINISHED == state) ) &&
+ (GNUNET_NO == monitor_connections) )
{
- monitor_connections_counter ++;
- 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_SCHEDULER_shutdown ();
+ return;
}
-}
-
-/**
- * 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();
- const char *now_str;
-
- if (0 != memcmp (&my_id, peer, sizeof (my_id)))
+ switch (state)
{
- 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);
+ case GNUNET_CORE_KX_STATE_DOWN:
+ /* should never happen, as we immediately send the key */
+ state_str = _("fresh connection");
+ break;
+ case GNUNET_CORE_KX_STATE_KEY_SENT:
+ state_str = _("key sent");
+ break;
+ case GNUNET_CORE_KX_STATE_KEY_RECEIVED:
+ state_str = _("key received");
+ break;
+ case GNUNET_CORE_KX_STATE_UP:
+ state_str = _("connection established");
+ break;
+ case GNUNET_CORE_KX_STATE_REKEY_SENT:
+ state_str = _("rekeying");
+ break;
+ case GNUNET_CORE_KX_PEER_DISCONNECT:
+ state_str = _("disconnected");
+ break;
+ case GNUNET_CORE_KX_ITERATION_FINISHED:
+ return;
+ case GNUNET_CORE_KX_CORE_DISCONNECT:
+ FPRINTF (stderr,
+ "%s\n",
+ _("Connection to CORE service lost (reconnecting)"));
+ return;
+ default:
+ state_str = _("unknown state");
+ break;
}
+ now_str = GNUNET_STRINGS_absolute_time_to_string (now);
+ FPRINTF (stdout,
+ _("%24s: %-30s %4s (timeout in %6s)\n"),
+ now_str,
+ state_str,
+ GNUNET_i2s (peer),
+ GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_remaining (timeout),
+ GNUNET_YES));
}
-
/**
* Main function that will be run by the scheduler.
*
run (void *cls, char *const *args, const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
- static const struct GNUNET_CORE_MessageHandler handlers[] = {
- {NULL, 0, 0}
- };
- 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;
}
- if (GNUNET_NO == monitor_connections)
- GNUNET_CORE_iterate_peers (cfg, &connected_peer_callback, NULL);
- else
+ mh = GNUNET_CORE_monitor_start (cfg,
+ &monitor_cb,
+ NULL);
+ if (NULL == mh)
{
- memset(&my_id, '\0', sizeof (my_id));
- ch = GNUNET_CORE_connect (cfg, NULL,
- monitor_notify_startup,
- 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);
+ FPRINTF (stderr,
+ "%s",
+ _("Failed to connect to CORE service!\n"));
+ return;
}
+ GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
}
/**
- * 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
* @return 0 ok, 1 on error
*/
int
-main (int argc, char *const *argv)
+main (int argc,
+ char *const *argv)
{
int res;
static const struct GNUNET_GETOPT_CommandLineOption options[] = {
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);
+ gettext_noop
+ ("Print information about connected peers."),
+ options, &run, NULL);
GNUNET_free ((void *) argv);
-
if (GNUNET_OK == res)
return 0;
- else
- return 1;
+ return 1;
}
/* end of gnunet-core.c */