fix
[oweals/gnunet.git] / src / fs / fs_namespace.c
index e853ce813b1378bdfd744365951f2e542cafa5b1..10be6f45911aaa2d6ebb4c1aeafc99470b1fac6e 100644 (file)
@@ -78,6 +78,11 @@ struct AdvertisementContext
    */
   struct GNUNET_DATASTORE_Handle *dsh;
 
+  /**
+   * Our scheduler.
+   */
+  struct GNUNET_SCHEDULER_Handle *sched;
+
   /**
    * Our KSK URI.
    */ 
@@ -125,6 +130,23 @@ struct AdvertisementContext
 };
 
 
+/**
+ * Disconnect from the datastore.
+ * 
+ * @param cls datastore handle
+ * @param tc scheduler context
+ */
+static void
+do_disconnect (void *cls,
+              const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct GNUNET_DATASTORE_Handle *dsh = cls;
+
+  GNUNET_DATASTORE_disconnect (dsh, 
+                              GNUNET_NO);
+}
+
+
 /**
  * Continuation called to notify client about result of the
  * operation.
@@ -149,7 +171,10 @@ advertisement_cont (void *cls,
   if (GNUNET_OK != success)
     {
       /* error! */
-      GNUNET_DATASTORE_disconnect (ac->dsh, GNUNET_NO);
+      GNUNET_SCHEDULER_add_continuation (ac->sched,
+                                        &do_disconnect,
+                                        ac->dsh,
+                                        GNUNET_SCHEDULER_REASON_PREREQ_DONE);
       ac->cont (ac->cont_cls, NULL, msg);
       GNUNET_FS_uri_destroy (ac->ksk_uri);
       GNUNET_free (ac->pt);
@@ -161,7 +186,10 @@ advertisement_cont (void *cls,
   if (ac->pos == ac->ksk_uri->data.ksk.keywordCount)
     {
       /* done! */
-      GNUNET_DATASTORE_disconnect (ac->dsh, GNUNET_NO);
+      GNUNET_SCHEDULER_add_continuation (ac->sched,
+                                        &do_disconnect,
+                                        ac->dsh,
+                                        GNUNET_SCHEDULER_REASON_PREREQ_DONE);
       ac->cont (ac->cont_cls, ac->ksk_uri, NULL);
       GNUNET_FS_uri_destroy (ac->ksk_uri);
       GNUNET_free (ac->pt);
@@ -185,6 +213,7 @@ advertisement_cont (void *cls,
                                        &ac->nb->ns_purpose,
                                        &ac->nb->ns_signature));
   pk = GNUNET_CRYPTO_rsa_key_create_from_hash (&key);
+  GNUNET_assert (pk != NULL);
   GNUNET_CRYPTO_rsa_key_get_public (pk, &ac->nb->keyspace);
   GNUNET_CRYPTO_hash (&ac->nb->keyspace,
                      sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
@@ -203,6 +232,7 @@ advertisement_cont (void *cls,
                        ac->priority,
                        ac->anonymity,
                        ac->expiration,
+                       -2, 1,
                        GNUNET_CONSTANTS_SERVICE_TIMEOUT, 
                        &advertisement_cont,
                        ac);
@@ -295,6 +325,7 @@ GNUNET_FS_namespace_advertise (struct GNUNET_FS_Handle *h,
   ctx->cont = cont;
   ctx->cont_cls = cont_cls;
   ctx->dsh = dsh;
+  ctx->sched = h->sched;
   ctx->ksk_uri = GNUNET_FS_uri_dup (ksk_uri);
   ctx->nb = nb;
   ctx->pt = pt;