-simplify
[oweals/gnunet.git] / src / hostlist / gnunet-daemon-hostlist.c
index 9a12c98f1129b0da250a4c7f5d0e93aedf15d307..f5ea6bba768cce269ad4fd4133b639db91c82126 100644 (file)
@@ -4,7 +4,7 @@
 
      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
  * @file hostlist/gnunet-daemon-hostlist.c
  * @brief code for bootstrapping via hostlist servers
  * @author Christian Grothoff
  * @file hostlist/gnunet-daemon-hostlist.c
  * @brief code for bootstrapping via hostlist servers
  * @author Christian Grothoff
- *
- * TODO:
- * - implement -a and -e switches (send P2P messages about our hostlist URL,
- *   receive such messages and automatically update our hostlist URL config
- *   value).
  */
 
 #include <stdlib.h>
 #include "platform.h"
 #include "hostlist-client.h"
  */
 
 #include <stdlib.h>
 #include "platform.h"
 #include "hostlist-client.h"
-#include "hostlist-server.h"
 #include "gnunet_core_service.h"
 #include "gnunet_getopt_lib.h"
 #include "gnunet_protocols.h"
 #include "gnunet_core_service.h"
 #include "gnunet_getopt_lib.h"
 #include "gnunet_protocols.h"
 #include "gnunet_time_lib.h"
 #include "gnunet_util_lib.h"
 
 #include "gnunet_time_lib.h"
 #include "gnunet_util_lib.h"
 
+#if HAVE_MHD
+
+#include "hostlist-server.h"
+
 /**
  * Set if we are allowed to advertise our hostlist to others.
  */
 static int advertising;
 
 /**
  * Set if we are allowed to advertise our hostlist to others.
  */
 static int advertising;
 
+/**
+ * Set if the user wants us to run a hostlist server.
+ */
+static int provide_hostlist;
+
+/**
+ * Handle to hostlist server's connect handler
+ */
+static GNUNET_CORE_ConnectEventHandler server_ch;
+
+/**
+ * Handle to hostlist server's disconnect handler
+ */
+static GNUNET_CORE_DisconnectEventHandler server_dh;
+
+#endif
+
 /**
  * Set if we are allowed to learn about peers by accessing
  * hostlist servers.
 /**
  * Set if we are allowed to learn about peers by accessing
  * hostlist servers.
@@ -59,11 +74,6 @@ static int bootstrapping;
  */
 static int learning;
 
  */
 static int learning;
 
-/**
- * Set if the user wants us to run a hostlist server.
- */
-static int provide_hostlist;
-
 /**
  * Statistics handle.
  */
 /**
  * Statistics handle.
  */
@@ -77,46 +87,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;
-
-/**
- * Handle to hostlist server's connect handler
- */
-static GNUNET_CORE_ConnectEventHandler server_ch = NULL;
+static GNUNET_CORE_DisconnectEventHandler client_dh;
 
 
-/**
- * Handle to hostlist server's disconnect handler
- */
-static GNUNET_CORE_DisconnectEventHandler server_dh = NULL;
-
-/**
- * gnunet-daemon-hostlist command line options.
- */
-static struct GNUNET_GETOPT_CommandLineOption options[] = {
-  { 'a', "advertise", NULL, 
-    gettext_noop ("advertise our hostlist to other peers"),
-    GNUNET_NO, &GNUNET_GETOPT_set_one, &advertising },
-  { '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},
-  { 'p', "provide-hostlist", NULL, 
-    gettext_noop ("provide a hostlist server"),
-    GNUNET_NO, &GNUNET_GETOPT_set_one, &provide_hostlist},
-  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
@@ -142,68 +125,55 @@ struct GNUNET_HOSTLIST_ADV_Message
    */
   uint32_t reserved GNUNET_PACKED;
 };
    */
   uint32_t reserved GNUNET_PACKED;
 };
+GNUNET_NETWORK_STRUCT_END
 
 
+static struct GNUNET_PeerIdentity me;
 
 static void
 
 static void
-core_init (void *cls,
-          struct GNUNET_CORE_Handle * server,
-          const struct GNUNET_PeerIdentity *
-          my_identity,
-          const struct
-          GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *
-          publicKey)
+core_init (void *cls, struct GNUNET_CORE_Handle *server,
+           const struct GNUNET_PeerIdentity *my_identity)
 {
 {
-  if (advertising && (NULL != server))
-    {    
-      /* FIXME: provide "server" to 'hostlist' module */
-    }
+  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)
 {
 {
-  if ( !learning )
-    {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Recieved hostlist advertisement, but I am not learning!\n");
-    return GNUNET_NO;
-    }
-
-  if (learning && (NULL != client_adv_handler))
-    {
-        (*client_adv_handler) (cls, peer, message, latency, distance);
-        return GNUNET_YES;
-    }
-  return GNUNET_NO;
+  GNUNET_assert (NULL != client_adv_handler);
+  return (*client_adv_handler) (cls, peer, message);
 }
 
 }
 
+
 /**
  * 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
 /**
  * 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 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 != server_ch)
-    (*server_ch) (cls, peer, latency, distance);
+  if (NULL != client_ch)
+  {
+    (*client_ch) (cls, peer);
+  }
+#if HAVE_MHD
+  if (NULL != server_ch)
+    (*server_ch) (cls, peer);
+#endif
 }
 
 /**
 }
 
 /**
@@ -211,22 +181,20 @@ connect_handler (void *cls,
  *
  * @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
-disconnect_handler (void *cls,
-                    const struct
-                    GNUNET_PeerIdentity * peer)
+disconnect_handler (void *cls, 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);
     (*client_dh) (cls, peer);
-
-  /* call hostlist server disconnect handler*/
-  if ( NULL != server_dh)
+#if HAVE_MHD
+  /* call hostlist server disconnect handler */
+  if (NULL != server_dh)
     (*server_dh) (cls, peer);
     (*server_dh) (cls, peer);
+#endif
 }
 
 /**
 }
 
 /**
@@ -236,98 +204,94 @@ disconnect_handler (void *cls,
 static void
 cleaning_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
 static void
 cleaning_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-             "Hostlist daemon is shutting down\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Hostlist daemon is shutting down\n");
+  if (core != NULL)
+  {
+    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 (provide_hostlist)
-    {      
-      GNUNET_HOSTLIST_server_stop ();
-    }
-  if (core != NULL)
-    {
-      GNUNET_CORE_disconnect (core);
-      core = NULL;
-    }
+  {
+    GNUNET_HOSTLIST_server_stop ();
+  }
+#endif
   if (stats != NULL)
   if (stats != NULL)
-    {
-      GNUNET_STATISTICS_destroy (stats,
-                                GNUNET_NO);
-      stats = NULL;
-    }
+  {
+    GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
+    stats = NULL;
+  }
 }
 
 }
 
-/**
- * List of handlers for the messages understood by this
- * service.
- */
-static struct GNUNET_CORE_MessageHandler handlers[] = {
-    { &advertisement_handler, GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT, 0},
-    { 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 
-run (void *cls,
-     struct GNUNET_SCHEDULER_Handle * sched,
-     char *const *args,
-     const char *cfgfile,
-     const struct GNUNET_CONFIGURATION_Handle * cfg)
+static void
+run (void *cls, char *const *args, const char *cfgfile,
+     const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
 {
-  if ( (! bootstrapping) &&
-       (! learning) &&
-       (! provide_hostlist) )
-    {
-      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,
-                            NULL, &connect_handler, &disconnect_handler,
-                            NULL, GNUNET_NO,
-                            NULL, GNUNET_NO,
-                            handlers);
+  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
+      && (!provide_hostlist)
+#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 ("hostlist", cfg);
+
+  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 (bootstrapping)
 
   if (bootstrapping)
-    {
-      GNUNET_HOSTLIST_client_start (cfg, sched, stats,
-                                   &client_ch, &client_dh, &client_adv_handler);
-    }
-  if (provide_hostlist)
-    {      
-      GNUNET_HOSTLIST_server_start (cfg, sched, stats, core, &server_ch, &server_dh, advertising );
-    }
-  if (learning)
-    {
+  {
+    GNUNET_HOSTLIST_client_start (cfg, stats, &client_ch, &client_dh,
+                                  &client_adv_handler, learning);
+  }
 
 
-    }
+#if HAVE_MHD
+  if (provide_hostlist)
+  {
+    GNUNET_HOSTLIST_server_start (cfg, stats, core, &server_ch, &server_dh,
+                                  advertising);
+  }
+#endif
+  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleaning_task,
+                                NULL);
 
 
-  GNUNET_SCHEDULER_add_delayed (sched,
-                                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;
+  }
 }
 
 
 }
 
 
@@ -341,17 +305,39 @@ run (void *cls,
 int
 main (int argc, char *const *argv)
 {
 int
 main (int argc, char *const *argv)
 {
+  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
+  };
+
   int ret;
   int ret;
-  GNUNET_log_setup ("hostlist","DEBUG",NULL);
 
 
-  ret = (GNUNET_OK ==
-         GNUNET_PROGRAM_run (argc,
-                             argv,
-                             "hostlist", 
-                            _("GNUnet hostlist server and client"),
-                            options,
-                            &run, NULL)) ? 0 : 1;
+  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;
 }