installing all service, daemon and helper binaries to lib/gnunet/libexec/; updating...
[oweals/gnunet.git] / src / core / gnunet-service-core.c
index 2eb71c25715a335939199c86e2900e7afcca748e..f5d01cd27e41ab3b3dc2a1a4561af118860f5556 100644 (file)
@@ -48,23 +48,39 @@ const struct GNUNET_CONFIGURATION_Handle *GSC_cfg;
  */
 struct GNUNET_STATISTICS_Handle *GSC_stats;
 
+/**
+ * Handle to the server of the core service.
+ */
+static struct GNUNET_SERVER_Handle *GSC_server;
+
+/**
+ * Hostkey generation context
+ */
+struct GNUNET_CRYPTO_RsaKeyGenerationContext *GST_keygen;
+
 
 /**
  * Last task run during shutdown.  Disconnects us from
  * the transport.
+ * 
+ * @param cls NULL, unused
+ * @param tc scheduler context, unused
  */
 static void
-cleaning_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-#if DEBUG_CORE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Core service shutting down.\n");
-#endif
+  if (NULL != GST_keygen)
+  {
+    GNUNET_CRYPTO_rsa_key_create_stop (GST_keygen);
+    GST_keygen = NULL;
+  }
   GSC_CLIENTS_done ();
   GSC_NEIGHBOURS_done ();
   GSC_SESSIONS_done ();
   GSC_KX_done ();
   GSC_TYPEMAP_done ();
-  if (GSC_stats != NULL)
+  if (NULL != GSC_stats)
   {
     GNUNET_STATISTICS_destroy (GSC_stats, GNUNET_NO);
     GSC_stats = NULL;
@@ -73,6 +89,42 @@ cleaning_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 }
 
 
+
+/**
+ * Callback for hostkey read/generation
+ *
+ * @param cls NULL
+ * @param pk the private key
+ * @param emsg error message
+ */
+static void
+key_generation_cb (void *cls,
+                   struct GNUNET_CRYPTO_RsaPrivateKey *pk,
+                   const char *emsg)
+{
+  GST_keygen = NULL;
+  if (NULL == pk)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+               _("Failed to read hostkey: %s\n"),
+               emsg);
+    GNUNET_SCHEDULER_shutdown ();
+    return;
+  }
+  if ((GNUNET_OK != GSC_KX_init (pk)) || 
+      (GNUNET_OK != GSC_NEIGHBOURS_init ()))
+  {
+    GNUNET_SCHEDULER_shutdown ();
+    return;
+  }
+  GSC_SESSIONS_init ();
+  GSC_CLIENTS_init (GSC_server);
+  GNUNET_SERVER_resume (GSC_server);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Core service of `%4s' ready.\n"),
+              GNUNET_i2s (&GSC_my_identity));
+}
+
+
 /**
  * Initiate core service.
  *
@@ -84,24 +136,36 @@ static void
 run (void *cls, struct GNUNET_SERVER_Handle *server,
      const struct GNUNET_CONFIGURATION_Handle *c)
 {
+  char *keyfile;
+
   GSC_cfg = c;
+  GSC_server = server;
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_filename (GSC_cfg, "GNUNETD", "HOSTKEY",
+                                               &keyfile))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _
+                ("Core service is lacking HOSTKEY configuration setting.  Exiting.\n"));
+    GNUNET_SCHEDULER_shutdown ();
+    return;
+  }
   GSC_stats = GNUNET_STATISTICS_create ("core", GSC_cfg);
-  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleaning_task,
+  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
                                 NULL);
+  GNUNET_SERVER_suspend (server);
   GSC_TYPEMAP_init ();
-  if ((GNUNET_OK != GSC_KX_init ()) || (GNUNET_OK != GSC_NEIGHBOURS_init ()))
+  GST_keygen = GNUNET_CRYPTO_rsa_key_create_start (keyfile, &key_generation_cb, NULL);
+  GNUNET_free (keyfile);
+  if (NULL == GST_keygen)
   {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _("Transport service is unable to access hostkey. Exiting.\n"));
     GNUNET_SCHEDULER_shutdown ();
-    return;
   }
-  GSC_SESSIONS_init ();
-  GSC_CLIENTS_init (server);
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Core service of `%4s' ready.\n"),
-              GNUNET_i2s (&GSC_my_identity));
 }
 
 
-
 /**
  * The main function for the transport service.
  *