aboutsummaryrefslogtreecommitdiff
path: root/src/core/gnunet-service-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/gnunet-service-core.c')
-rw-r--r--src/core/gnunet-service-core.c86
1 files changed, 76 insertions, 10 deletions
diff --git a/src/core/gnunet-service-core.c b/src/core/gnunet-service-core.c
index 59d9383..095e124 100644
--- a/src/core/gnunet-service-core.c
+++ b/src/core/gnunet-service-core.c
@@ -48,21 +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
+ */
+static struct GNUNET_CRYPTO_RsaKeyGenerationContext *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)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Core service shutting down.\n");
+ if (NULL != keygen)
+ {
+ GNUNET_CRYPTO_rsa_key_create_stop (keygen);
+ 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;
@@ -71,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)
+{
+ 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.
*
@@ -82,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 ()))
+ keygen = GNUNET_CRYPTO_rsa_key_create_start (keyfile, &key_generation_cb, NULL);
+ GNUNET_free (keyfile);
+ if (NULL == 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.
*