-doxygen, one more statistic
[oweals/gnunet.git] / src / hostlist / gnunet-daemon-hostlist.c
index bbc0d7e088ec2d8925aa7bf811dea6488c92cf10..62ecc5dfd18812b3e577c454a36a5caff9483d82 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      This file is part of GNUnet.
-     (C) 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
+     (C) 2007, 2008, 2009, 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
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
  * @brief code for bootstrapping via hostlist servers
  * @author Christian Grothoff
  */
  * @brief code for bootstrapping via hostlist servers
  * @author Christian Grothoff
  */
-
-#include <stdlib.h>
 #include "platform.h"
 #include "platform.h"
-#include "hostlist-client.h"
+#include "gnunet-daemon-hostlist_client.h"
 #include "gnunet_core_service.h"
 #include "gnunet_core_service.h"
-#include "gnunet_getopt_lib.h"
+#include "gnunet_util_lib.h"
 #include "gnunet_protocols.h"
 #include "gnunet_protocols.h"
-#include "gnunet_program_lib.h"
 #include "gnunet_statistics_service.h"
 #include "gnunet_statistics_service.h"
-#include "gnunet_strings_lib.h"
-#include "gnunet_time_lib.h"
-#include "gnunet_util_lib.h"
 
 #if HAVE_MHD
 
 
 #if HAVE_MHD
 
-#include "hostlist-server.h"
+#include "gnunet-daemon-hostlist_server.h"
 
 /**
  * Set if we are allowed to advertise our hostlist to others.
 
 /**
  * Set if we are allowed to advertise our hostlist to others.
@@ -53,12 +47,12 @@ static int provide_hostlist;
 /**
  * Handle to hostlist server's connect handler
  */
 /**
  * Handle to hostlist server's connect handler
  */
-static GNUNET_CORE_ConnectEventHandler server_ch = NULL;
+static GNUNET_CORE_ConnectEventHandler server_ch;
 
 /**
  * Handle to hostlist server's disconnect handler
  */
 
 /**
  * Handle to hostlist server's disconnect handler
  */
-static GNUNET_CORE_DisconnectEventHandler server_dh = NULL;
+static GNUNET_CORE_DisconnectEventHandler server_dh;
 
 #endif
 
 
 #endif
 
@@ -87,40 +81,19 @@ static struct GNUNET_CORE_Handle *core;
 /**
  * Handle to the hostlist client's advertisement handler
  */
 /**
  * Handle to the hostlist client's advertisement handler
  */
-static GNUNET_CORE_MessageCallback client_adv_handler = NULL;
+static GNUNET_CORE_MessageCallback client_adv_handler;
 
 /**
  * Handle to hostlist client's connect handler
  */
 
 /**
  * Handle to hostlist client's connect handler
  */
-static GNUNET_CORE_ConnectEventHandler client_ch = NULL;
+static GNUNET_CORE_ConnectEventHandler client_ch;
 
 /**
  * Handle to hostlist client's disconnect handler
  */
 
 /**
  * Handle to hostlist client's disconnect handler
  */
-static GNUNET_CORE_DisconnectEventHandler client_dh = NULL;
+static GNUNET_CORE_DisconnectEventHandler client_dh;
 
 
-/**
- * gnunet-daemon-hostlist command line options.
- */
-static struct GNUNET_GETOPT_CommandLineOption options[] = {
-#if HAVE_MHD
-  { 'a', "advertise", NULL, 
-    gettext_noop ("advertise our hostlist to other peers"),
-    GNUNET_NO, &GNUNET_GETOPT_set_one, &advertising },
-#endif
-  { 'b', "bootstrap", NULL, 
-    gettext_noop ("bootstrap using hostlists (it is highly recommended that you always use this option)"),
-    GNUNET_NO, &GNUNET_GETOPT_set_one, &bootstrapping },
-  { 'e', "enable-learning", NULL,
-    gettext_noop ("enable learning about hostlist servers from other peers"),
-    GNUNET_NO, &GNUNET_GETOPT_set_one, &learning},
-#if HAVE_MHD
-  { 'p', "provide-hostlist", NULL, 
-    gettext_noop ("provide a hostlist server"),
-    GNUNET_NO, &GNUNET_GETOPT_set_one, &provide_hostlist},
-#endif
-  GNUNET_GETOPT_OPTION_END
-};
+GNUNET_NETWORK_STRUCT_BEGIN
 
 /**
  * A HOSTLIST_ADV message is used to exchange information about
 
 /**
  * A HOSTLIST_ADV message is used to exchange information about
@@ -146,195 +119,191 @@ struct GNUNET_HOSTLIST_ADV_Message
    */
   uint32_t reserved GNUNET_PACKED;
 };
    */
   uint32_t reserved GNUNET_PACKED;
 };
+GNUNET_NETWORK_STRUCT_END
+
+
+/**
+ * Our own peer identity.
+ */
+static struct GNUNET_PeerIdentity me;
 
 
 
 
+/**
+ * Callback invoked once our connection to CORE service is up.
+ *
+ * @param cls NULL
+ * @param my_identity our peer's identity
+ */
 static void
 core_init (void *cls,
 static void
 core_init (void *cls,
-          struct GNUNET_CORE_Handle * server,
-          const struct GNUNET_PeerIdentity *
-          my_identity,
-          const struct
-          GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *
-          publicKey)
+           const struct GNUNET_PeerIdentity *my_identity)
 {
 {
- /* Nothing to do here */
+  me = *my_identity;
 }
 
 }
 
+
 /**
  * Core handler for p2p hostlist advertisements
 /**
  * Core handler for p2p hostlist advertisements
+ *
+ * @param cls closure
+ * @param peer identity of the sender
+ * @param message advertisement message we got
+ * @return #GNUNET_OK on success
  */
  */
-static int advertisement_handler (void *cls,
-                             const struct GNUNET_PeerIdentity * peer,
-                             const struct GNUNET_MessageHeader * message,
-                             struct GNUNET_TIME_Relative latency,
-                             uint32_t distance)
+static int
+advertisement_handler (void *cls,
+                       const struct GNUNET_PeerIdentity *peer,
+                       const struct GNUNET_MessageHeader *message)
 {
   GNUNET_assert (NULL != client_adv_handler);
 {
   GNUNET_assert (NULL != client_adv_handler);
-  return (*client_adv_handler) (cls, peer, message, latency, distance);
+  return (*client_adv_handler) (cls, peer, message);
 }
 
 
 /**
 }
 
 
 /**
- * Method called whenever a given peer connects.  Wrapper to call both client's and server's functions
+ * Method called whenever a given peer connects.  Wrapper to call both
+ * client's and server's functions
  *
  * @param cls closure
  * @param peer peer identity this notification is about
  *
  * @param cls closure
  * @param peer peer identity this notification is about
- * @param latency reported latency of the connection with 'other'
- * @param distance reported distance (DV) to 'other'
  */
 static void
  */
 static void
-connect_handler (void *cls,
-                 const struct
-                 GNUNET_PeerIdentity * peer,
-                 struct GNUNET_TIME_Relative latency,
-                 uint32_t distance)
+connect_handler (void *cls, const struct GNUNET_PeerIdentity *peer)
 {
 {
+  if (0 == memcmp (&me, peer, sizeof (struct GNUNET_PeerIdentity)))
+    return;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "A new peer connected, notifying client and server\n");
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "A new peer connected, notifying client and server\n");
-  if ( NULL != client_ch)
-    (*client_ch) (cls, peer, latency, distance);
+  if (NULL != client_ch)
+    (*client_ch) (cls, peer);
 #if HAVE_MHD
 #if HAVE_MHD
-  if ( NULL != server_ch)
-    (*server_ch) (cls, peer, latency, distance);
+  if (NULL != server_ch)
+    (*server_ch) (cls, peer);
 #endif
 }
 
 #endif
 }
 
+
 /**
 /**
- * Method called whenever a given peer disconnects. Wrapper to call both client's and server's functions
+ * Method called whenever a given peer disconnects. Wrapper to call
+ * both client's and server's functions
  *
  * @param cls closure
  * @param peer peer identity this notification is about
  */
 static void
 disconnect_handler (void *cls,
  *
  * @param cls closure
  * @param peer peer identity this notification is about
  */
 static void
 disconnect_handler (void *cls,
-                    const struct
-                    GNUNET_PeerIdentity * peer)
+                    const struct GNUNET_PeerIdentity *peer)
 {
 {
-
-  /* call hostlist client disconnect handler*/
-  if ( NULL != client_dh)
+  if (0 == memcmp (&me, peer, sizeof (struct GNUNET_PeerIdentity)))
+    return;
+  /* call hostlist client disconnect handler */
+  if (NULL != client_dh)
     (*client_dh) (cls, peer);
 #if HAVE_MHD
     (*client_dh) (cls, peer);
 #if HAVE_MHD
-  /* call hostlist server disconnect handler*/
-  if ( NULL != server_dh)
+  /* call hostlist server disconnect handler */
+  if (NULL != server_dh)
     (*server_dh) (cls, peer);
 #endif
 }
 
     (*server_dh) (cls, peer);
 #endif
 }
 
+
 /**
  * Last task run during shutdown.  Disconnects us from
  * the other services.
 /**
  * Last task run during shutdown.  Disconnects us from
  * the other services.
+ *
+ * @param cls NULL
+ * @param tc scheduler context
  */
 static void
  */
 static void
-cleaning_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+cleaning_task (void *cls,
+               const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
 {
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Hostlist daemon is shutting down\n");
-  if (core != NULL)
-    {
-      GNUNET_CORE_disconnect (core);
-      core = NULL;
-    }
+             "Hostlist daemon is shutting down\n");
+  if (NULL != core)
+  {
+    GNUNET_CORE_disconnect (core);
+    core = NULL;
+  }
   if (bootstrapping)
   if (bootstrapping)
-    {
-      GNUNET_HOSTLIST_client_stop ();
-    }
+  {
+    GNUNET_HOSTLIST_client_stop ();
+  }
 #if HAVE_MHD
   if (provide_hostlist)
 #if HAVE_MHD
   if (provide_hostlist)
-    {      
-      GNUNET_HOSTLIST_server_stop ();
-    }
+  {
+    GNUNET_HOSTLIST_server_stop ();
+  }
 #endif
 #endif
-  if (stats != NULL)
-    {
-      GNUNET_STATISTICS_destroy (stats,
-                                GNUNET_NO);
-      stats = NULL;
-    }
+  if (NULL != stats)
+  {
+    GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
+    stats = NULL;
+  }
 }
 
 }
 
-/**
- * List of handlers if we are learning.
- */
-static struct GNUNET_CORE_MessageHandler learn_handlers[] = {
-  { &advertisement_handler, GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT, 0},
-  { NULL, 0, 0 }
-};
-
-
-/**
- * List of handlers if we are not learning.
- */
-static struct GNUNET_CORE_MessageHandler no_learn_handlers[] = {
-    { NULL, 0, 0 }
-};
-
 
 /**
  * Main function that will be run.
  *
  * @param cls closure
 
 /**
  * Main function that will be run.
  *
  * @param cls closure
- * @param sched the scheduler to use
  * @param args remaining command-line arguments
  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
  * @param cfg configuration
  */
  * @param args remaining command-line arguments
  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
  * @param cfg configuration
  */
-static void 
+static void
 run (void *cls,
 run (void *cls,
-     struct GNUNET_SCHEDULER_Handle * sched,
      char *const *args,
      const char *cfgfile,
      char *const *args,
      const char *cfgfile,
-     const struct GNUNET_CONFIGURATION_Handle * cfg)
+     const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
 {
-  if ( (! bootstrapping) &&
-       (! learning) 
+  static const struct GNUNET_CORE_MessageHandler learn_handlers[] = {
+    {&advertisement_handler, GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT, 0},
+    {NULL, 0, 0}
+  };
+  static const struct GNUNET_CORE_MessageHandler no_learn_handlers[] = {
+    {NULL, 0, 0}
+  };
+  if ((! bootstrapping) && (! learning)
 #if HAVE_MHD
 #if HAVE_MHD
-       && (! provide_hostlist) 
+      && (! provide_hostlist)
 #endif
 #endif
-       )
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                 _("None of the functions for the hostlist daemon were enabled.  I have no reason to run!\n"));
-      return;
-    }
-
-
-
-  stats = GNUNET_STATISTICS_create (sched, "hostlist", cfg);
-
-  core = GNUNET_CORE_connect (sched, cfg,
-                             GNUNET_TIME_UNIT_FOREVER_REL,
-                             NULL,
-                             &core_init,
-                             &connect_handler, &disconnect_handler,
-                             NULL, GNUNET_NO,
-                             NULL, GNUNET_NO,
-                             learning? learn_handlers : no_learn_handlers);
-
+      )
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                _("None of the functions for the hostlist daemon were enabled.  I have no reason to run!\n"));
+    return;
+  }
+  stats = GNUNET_STATISTICS_create ("hostlist", cfg);
   if (bootstrapping)
   if (bootstrapping)
-    {
-      GNUNET_HOSTLIST_client_start (cfg, sched, stats,
-                                   &client_ch, &client_dh, &client_adv_handler, learning);
-    }
+    GNUNET_HOSTLIST_client_start (cfg, stats, &client_ch, &client_dh,
+                                  &client_adv_handler, learning);
+  core =
+    GNUNET_CORE_connect (cfg, NULL,
+                        &core_init,
+                        &connect_handler,
+                        &disconnect_handler, NULL,
+                        GNUNET_NO, NULL,
+                        GNUNET_NO,
+                        learning ? learn_handlers : no_learn_handlers);
 
 
-  #if HAVE_MHD
+
+#if HAVE_MHD
   if (provide_hostlist)
   if (provide_hostlist)
-    {      
-      GNUNET_HOSTLIST_server_start (cfg, sched, stats, core, &server_ch, &server_dh, advertising );
-    }
+    GNUNET_HOSTLIST_server_start (cfg, stats, core, &server_ch, &server_dh,
+                                  advertising);
 #endif
 #endif
-  GNUNET_SCHEDULER_add_delayed (sched,
-                                GNUNET_TIME_UNIT_FOREVER_REL,
-                                &cleaning_task, NULL);
+  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
+                               &cleaning_task,
+                                NULL);
 
   if (NULL == core)
 
   if (NULL == core)
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                 _("Failed to connect to `%s' service.\n"),
-                 "core");
-      GNUNET_SCHEDULER_shutdown (sched);
-      return;     
-    }
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _("Failed to connect to `%s' service.\n"), "core");
+    GNUNET_SCHEDULER_shutdown ();
+    return;
+  }
 }
 
 
 }
 
 
@@ -348,17 +317,40 @@ run (void *cls,
 int
 main (int argc, char *const *argv)
 {
 int
 main (int argc, char *const *argv)
 {
-  int ret;
-  GNUNET_log_setup ("hostlist","DEBUG",NULL);
+  static const struct GNUNET_GETOPT_CommandLineOption options[] = {
+#if HAVE_MHD
+    {'a', "advertise", NULL,
+     gettext_noop ("advertise our hostlist to other peers"),
+     GNUNET_NO, &GNUNET_GETOPT_set_one, &advertising},
+#endif
+    {'b', "bootstrap", NULL,
+     gettext_noop
+     ("bootstrap using hostlists (it is highly recommended that you always use this option)"),
+     GNUNET_NO, &GNUNET_GETOPT_set_one, &bootstrapping},
+    {'e', "enable-learning", NULL,
+     gettext_noop ("enable learning about hostlist servers from other peers"),
+     GNUNET_NO, &GNUNET_GETOPT_set_one, &learning},
+#if HAVE_MHD
+    {'p', "provide-hostlist", NULL,
+     gettext_noop ("provide a hostlist server"),
+     GNUNET_NO, &GNUNET_GETOPT_set_one, &provide_hostlist},
+#endif
+    GNUNET_GETOPT_OPTION_END
+  };
 
 
-  ret = (GNUNET_OK ==
-         GNUNET_PROGRAM_run (argc,
-                             argv,
-                             "hostlist", 
-                            _("GNUnet hostlist server and client"),
-                            options,
-                            &run, NULL)) ? 0 : 1;
+  int ret;
 
 
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
+  GNUNET_log_setup ("hostlist", "WARNING", NULL);
+  ret =
+      (GNUNET_OK ==
+       GNUNET_PROGRAM_run (argc, argv, "hostlist",
+                           _("GNUnet hostlist server and client"),
+                           options,
+                           &run, NULL)) ? 0 : 1;
+  GNUNET_free ((void*) argv);
   return ret;
 }
 
   return ret;
 }