experiments
authorMatthias Wachs <wachs@net.in.tum.de>
Fri, 24 May 2013 14:21:16 +0000 (14:21 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Fri, 24 May 2013 14:21:16 +0000 (14:21 +0000)
src/experimentation/gnunet-daemon-experimentation_experiments.c

index 78d53605910d39f9b4f9e315bb7390c7c117f715..eb8fae4f4ff5cbfabdaeace04c68ed4d61912bc5 100644 (file)
@@ -34,6 +34,7 @@
 struct Experiment
 {
        /* Header */
+       char *name;
 
        /* Experiment issuer */
        struct GNUNET_PeerIdentity issuer;
@@ -52,15 +53,59 @@ struct Experiment
        /* TBD */
 };
 
+struct Issuer
+{
+       struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded pubkey;
+};
+
 /**
  * Hashmap containing valid experiment issuer
  */
 static struct GNUNET_CONTAINER_MultiHashMap *valid_issuers;
 
-void
-GNUNET_EXPERIMENTATION_experiments_verify ()
+/**
+ * Hashmap containing valid experiments
+ */
+static struct GNUNET_CONTAINER_MultiHashMap *experiments;
+
+/**
+ * Verify experiment signature
+ *
+ * @param i issuer
+ * @param e experiment
+ * @return GNUNET_OK or GNUNET_SYSERR
+ */
+
+int
+experiment_verify (struct Issuer *i, struct Experiment *e)
 {
+       GNUNET_assert (NULL != i);
+       GNUNET_assert (NULL != e);
+
+       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Verification: to be implemented\n");
+       return GNUNET_OK;
+}
+
+int free_experiment (void *cls,
+                                                                                const struct GNUNET_HashCode * key,
+                                                                                void *value)
+{
+       struct Experiment *e = value;
+       GNUNET_CONTAINER_multihashmap_remove (experiments, key, value);
+       GNUNET_free_non_null (e->description);
+       GNUNET_free_non_null (e->name);
+       GNUNET_free (e);
+       return GNUNET_OK;
+}
 
+int free_issuer (void *cls,
+                                                                const struct GNUNET_HashCode * key,
+                                                                void *value)
+{
+       struct Issuer *i = value;
+       GNUNET_CONTAINER_multihashmap_remove (valid_issuers, key, value);
+       GNUNET_free (i);
+       return GNUNET_OK;
 }
 
 /**
@@ -77,6 +122,7 @@ GNUNET_EXPERIMENTATION_experiments_issuer_accepted (struct GNUNET_PeerIdentity *
                return GNUNET_NO;
 }
 
+
 void exp_file_iterator (void *cls,
                                                                                                const char *section)
 {
@@ -95,31 +141,30 @@ void exp_file_iterator (void *cls,
        /* Issuer */
        if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (exp, section, "ISSUER", &val))
        {
-                       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Section `%s': Issuer missing\n", section);
+                       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Experiment `%s': Issuer missing\n"), section);
                        GNUNET_free (e);
                        return;
        }
-       if (GNUNET_SYSERR == GNUNET_CRYPTO_hash_from_string (section, &e->issuer.hashPubKey))
+       if (GNUNET_SYSERR == GNUNET_CRYPTO_hash_from_string (val, &e->issuer.hashPubKey))
        {
-                       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Section `%s': Issuer invalid\n", section);
+                       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Experiment `%s': Issuer invalid\n"), section);
                        GNUNET_free (val);
                        GNUNET_free (e);
                        return;
        }
        if (NULL == (i = GNUNET_CONTAINER_multihashmap_get (valid_issuers, &e->issuer.hashPubKey)))
        {
-               GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Section `%s': Issuer not accepted!\n", section);
+               GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Experiment `%s': Issuer not accepted!\n"), section);
                GNUNET_free (val);
                GNUNET_free (e);
                return;
        }
-
        GNUNET_free (val);
 
        /* Version */
        if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (exp, section, "VERSION", &number))
        {
-                       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Section `%s': Version missing \n", section);
+                       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Experiment `%s': Version missing or invalid \n"), section);
                        GNUNET_free (e);
                        return;
        }
@@ -128,31 +173,39 @@ void exp_file_iterator (void *cls,
        /* Required capabilities */
        if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (exp, section, "CAPABILITIES", &number))
        {
-                       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Section `%s': Required capabilities missing \n", section);
+                       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Experiment `%s': Required capabilities missing \n"), section);
                        GNUNET_free (e);
                        return;
        }
        if (number > UINT32_MAX)
        {
-               GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Section `%s': Required capabilities invalid \n", section);
+               GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Experiment `%s': Required capabilities invalid \n"), section);
                GNUNET_free (e);
                return;
        }
        e->required_capabilities = number;
+       e->name = GNUNET_strdup (section);
 
-       /* Optional fields  */
-
+       /* Optional fields */
        /* Description */
        GNUNET_CONFIGURATION_get_value_string (exp, section, "DESCRIPTION", &e->description);
 
-
        /* verify experiment */
-
+       if (GNUNET_SYSERR == experiment_verify (i, e))
+       {
+                       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Experiment `%s': Experiment signature is invalid\n"), section);
+                       GNUNET_free (e);
+                       GNUNET_free_non_null (e->name);
+                       GNUNET_free_non_null (e->description);
+                       return;
+       }
+       GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Adding experiment `%s'\n"), e->name);
+       GNUNET_CONTAINER_multihashmap_put (experiments, &e->issuer.hashPubKey, e, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+  GNUNET_STATISTICS_set (GSE_stats, "# expeeriments", GNUNET_CONTAINER_multihashmap_size (experiments), GNUNET_NO);
 }
 
 /**
  * Load experiments from file
- * FIXME: Not yet sure how to store that on disk ...
  *
  * @param file source file
  */
@@ -182,6 +235,7 @@ load_file (const char * file)
 int
 GNUNET_EXPERIMENTATION_experiments_start ()
 {
+       struct Issuer *i;
        char *issuers;
        char *file;
        char *pos;
@@ -195,7 +249,6 @@ GNUNET_EXPERIMENTATION_experiments_start ()
        }
 
        valid_issuers = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
-
   for (pos = strtok (issuers, " "); pos != NULL; pos = strtok (NULL, " "))
   {
 
@@ -206,8 +259,9 @@ GNUNET_EXPERIMENTATION_experiments_start ()
                else
                {
                                GNUNET_log (GNUNET_ERROR_TYPE_INFO, "`%s' is a valid issuer \n", GNUNET_i2s (&issuer_ID));
+                               i = GNUNET_malloc (sizeof (struct Issuer));
                                GNUNET_CONTAINER_multihashmap_put (valid_issuers, &issuer_ID.hashPubKey,
-                                               NULL, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+                                               i, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
                }
   }
   GNUNET_free (issuers);
@@ -220,6 +274,7 @@ GNUNET_EXPERIMENTATION_experiments_start ()
   }
   GNUNET_STATISTICS_set (GSE_stats, "# issuer", GNUNET_CONTAINER_multihashmap_size (valid_issuers), GNUNET_NO);
 
+  experiments = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
   /* Load experiments from file */
        if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (GSE_cfg, "EXPERIMENTATION", "EXPERIMENTS", &file))
                return GNUNET_OK;
@@ -227,13 +282,17 @@ GNUNET_EXPERIMENTATION_experiments_start ()
        if (GNUNET_YES != GNUNET_DISK_file_test (file))
        {
                GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Cannot read experiments file `%s'\n"), file);
+               GNUNET_free (file);
                        return GNUNET_OK;
        }
        load_file (file);
+       GNUNET_free (file);
 
        return GNUNET_OK;
 }
 
+
+
 /**
  * Stop experiments management
  */
@@ -241,8 +300,17 @@ void
 GNUNET_EXPERIMENTATION_experiments_stop ()
 {
        if (NULL != valid_issuers)
+       {
+               GNUNET_CONTAINER_multihashmap_iterate (valid_issuers, &free_issuer, NULL);
                GNUNET_CONTAINER_multihashmap_destroy (valid_issuers);
+       }
        valid_issuers = NULL;
+       if (NULL != experiments)
+       {
+               GNUNET_CONTAINER_multihashmap_iterate (experiments, &free_experiment, NULL);
+               GNUNET_CONTAINER_multihashmap_destroy (experiments);
+       }
+       experiments = NULL;
 }
 
 /* end of gnunet-daemon-experimentation_experiments.c */