From e1139e8c1376364ba486ff0d2ec347aadff4a068 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Fri, 24 May 2013 14:21:16 +0000 Subject: [PATCH] experiments --- ...nunet-daemon-experimentation_experiments.c | 102 +++++++++++++++--- 1 file changed, 85 insertions(+), 17 deletions(-) diff --git a/src/experimentation/gnunet-daemon-experimentation_experiments.c b/src/experimentation/gnunet-daemon-experimentation_experiments.c index 78d536059..eb8fae4f4 100644 --- a/src/experimentation/gnunet-daemon-experimentation_experiments.c +++ b/src/experimentation/gnunet-daemon-experimentation_experiments.c @@ -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 */ -- 2.25.1