*/
/**
- * @file template/gnunet-testing.c
+ * @file testing/gnunet-testing.c
* @brief tool to use testing functionality from cmd line
* @author Christian Grothoff
*/
#include "platform.h"
-#include "gnunet_getopt_lib.h"
-#include "gnunet_program_lib.h"
+#include "gnunet_util_lib.h"
#include "gnunet_testing_lib.h"
+
/**
* Final status code.
*/
static int ret;
-unsigned int create_cfg;
+static char *create_hostkey;
+
+static int create_cfg;
- int create_cfg_no;
+static unsigned int create_no;
-static char * create_cfg_template;
+static char *create_cfg_template;
static int
create_unique_cfgs (const char * template, const unsigned int no)
{
- int fail = GNUNET_NO;
-
- uint16_t port = 20000;
- uint32_t upnum = 1;
- uint32_t fdnum = 1;
+ struct GNUNET_TESTING_System *system;
+ int fail;
+ unsigned int cur;
+ char *cur_file;
+ struct GNUNET_CONFIGURATION_Handle *cfg_new;
+ struct GNUNET_CONFIGURATION_Handle *cfg_tmpl;
if (GNUNET_NO == GNUNET_DISK_file_test(template))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Configuration template `%s': file not found\n", create_cfg_template);
return 1;
}
+ cfg_tmpl = GNUNET_CONFIGURATION_create();
- int cur = 0;
- char * cur_file;
- struct GNUNET_CONFIGURATION_Handle *cfg_tmpl = GNUNET_CONFIGURATION_create();
- struct GNUNET_CONFIGURATION_Handle *cfg_new = NULL;
-
- if (GNUNET_OK != GNUNET_CONFIGURATION_load(cfg_tmpl, create_cfg_template))
+ /* load template */
+ if ((create_cfg_template != NULL) && (GNUNET_OK != GNUNET_CONFIGURATION_load(cfg_tmpl, create_cfg_template)))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not load template `%s'\n", create_cfg_template);
- GNUNET_CONFIGURATION_destroy(cfg_tmpl);
+ GNUNET_CONFIGURATION_destroy (cfg_tmpl);
return 1;
}
-
- while (cur < no)
+ /* load defaults */
+ if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg_tmpl, NULL))
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Creating configuration no. %u \n", cur);
- GNUNET_asprintf(&cur_file,"%04u-%s",cur, create_cfg_template);
- cfg_new = GNUNET_TESTING_create_cfg(cfg_tmpl, cur, &port, &upnum, NULL, &fdnum);
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not load template `%s'\n", create_cfg_template);
+ GNUNET_CONFIGURATION_destroy (cfg_tmpl);
+ return 1;
+ }
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Writing configuration no. %u to file `%s' \n", cur, cur_file);
+ fail = GNUNET_NO;
+ system = GNUNET_TESTING_system_create ("testing", NULL /* controller */, NULL);
+ for (cur = 0; cur < no; cur++)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating configuration no. %u \n", cur);
+ if (create_cfg_template != NULL)
+ GNUNET_asprintf (&cur_file,"%04u-%s",cur, create_cfg_template);
+ else
+ GNUNET_asprintf (&cur_file,"%04u%s",cur, ".conf");
+
+ cfg_new = GNUNET_CONFIGURATION_dup (cfg_tmpl);
+ if (GNUNET_OK !=
+ GNUNET_TESTING_configuration_create (system, cfg_new))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not create another configuration\n");
+ GNUNET_CONFIGURATION_destroy (cfg_new);
+ fail = GNUNET_YES;
+ break;
+ }
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Writing configuration no. %u to file `%s' \n", cur, cur_file);
if (GNUNET_OK != GNUNET_CONFIGURATION_write(cfg_new, cur_file))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to write configuration no. %u \n", cur);
fail = GNUNET_YES;
}
-
-
+ GNUNET_CONFIGURATION_destroy (cfg_new);
GNUNET_free (cur_file);
- if (fail == GNUNET_YES)
+ if (GNUNET_YES == fail)
break;
- cur ++;
}
-
GNUNET_CONFIGURATION_destroy(cfg_tmpl);
- if (fail == GNUNET_NO)
- return 0;
- else
+ GNUNET_TESTING_system_destroy (system, GNUNET_NO);
+ if (GNUNET_YES == fail)
+ return 1;
+ return 0;
+}
+
+
+static int
+create_hostkeys (const unsigned int no)
+{
+ static char pad[GNUNET_TESTING_HOSTKEYFILESIZE];
+ struct GNUNET_TESTING_System *system;
+ struct GNUNET_PeerIdentity id;
+ struct GNUNET_DISK_FileHandle *fd;
+ struct GNUNET_CRYPTO_EccPrivateKey *pk;
+ struct GNUNET_CRYPTO_EccPrivateKeyBinaryEncoded *pkb;
+ ssize_t ret;
+
+ system = GNUNET_TESTING_system_create ("testing", NULL, NULL);
+ pk = GNUNET_TESTING_hostkey_get (system, create_no, &id);
+ if (NULL == pk)
+ {
+ fprintf (stderr, _("Could not extract hostkey %u (offset too large?)\n"), create_no);
+ GNUNET_TESTING_system_destroy (system, GNUNET_YES);
return 1;
+ }
+ (void) GNUNET_DISK_directory_create_for_file (create_hostkey);
+ fd = GNUNET_DISK_file_open (create_hostkey,
+ GNUNET_DISK_OPEN_READWRITE |
+ GNUNET_DISK_OPEN_CREATE,
+ GNUNET_DISK_PERM_USER_READ |
+ GNUNET_DISK_PERM_USER_WRITE);
+ GNUNET_assert (fd != NULL);
+ pkb = GNUNET_CRYPTO_ecc_encode_key (pk);
+ ret = GNUNET_DISK_file_write (fd, pkb,
+ ntohs (pkb->size));
+ GNUNET_assert (ntohs (pkb->size) == ret);
+ GNUNET_assert (ntohs (pkb->size) < GNUNET_TESTING_HOSTKEYFILESIZE);
+ GNUNET_assert (GNUNET_TESTING_HOSTKEYFILESIZE - ret ==
+ GNUNET_DISK_file_write (fd, pad,
+ GNUNET_TESTING_HOSTKEYFILESIZE - ret));
+
+ GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fd));
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
+ "Wrote hostkey to file: `%s'\n", create_hostkey);
+ GNUNET_free (pkb);
+ GNUNET_CRYPTO_ecc_key_free (pk);
+ GNUNET_TESTING_system_destroy (system, GNUNET_YES);
+ return 0;
}
+
/**
* Main function that will be run by the scheduler.
*
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
/* main code here */
- if ((create_cfg == GNUNET_YES) &&
- (create_cfg_no > 0) &&
- (create_cfg_template != NULL))
+ if (GNUNET_YES == create_cfg)
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating %u configuration files based on template `%s'\n", create_cfg_no, create_cfg_template);
- ret = create_unique_cfgs (create_cfg_template, create_cfg_no);
+ if (create_no > 0)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Creating %u configuration files based on template `%s'\n", create_no, create_cfg_template);
+ ret = create_unique_cfgs (create_cfg_template, create_no);
+ }
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Missing arguments! \n");
+ ret = 1;
+ }
}
- else
+ if (NULL != create_hostkey)
{
- ret = 1;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Extracting hostkey %u\n", create_no);
+ ret = create_hostkeys (create_no);
}
GNUNET_free_non_null (create_cfg_template);
}
main (int argc, char *const *argv)
{
static const struct GNUNET_GETOPT_CommandLineOption options[] = {
- {'C', "create", NULL, gettext_noop ("create unique configuration files"),
+ {'C', "cfg", NULL, gettext_noop ("create unique configuration files"),
GNUNET_NO, &GNUNET_GETOPT_set_one, &create_cfg},
- {'n', "number", NULL, gettext_noop ("number of unique configuration files to create"),
- GNUNET_YES, &GNUNET_GETOPT_set_uint, &create_cfg_no},
- {'t', "template", NULL, gettext_noop ("configuration template"),
+ {'k', "key", "FILENAME", gettext_noop ("extract hostkey file from pre-computed hostkey list"),
+ GNUNET_YES, &GNUNET_GETOPT_set_string, &create_hostkey},
+ {'n', "number", "NUMBER", gettext_noop ("number of unique configuration files to create, or number of the hostkey to extract"),
+ GNUNET_YES, &GNUNET_GETOPT_set_uint, &create_no},
+ {'t', "template", "FILENAME", gettext_noop ("configuration template"),
GNUNET_YES, &GNUNET_GETOPT_set_string, &create_cfg_template},
GNUNET_GETOPT_OPTION_END
};
- return (GNUNET_OK ==
- GNUNET_PROGRAM_run (argc, argv, "gnunet-testing",
- gettext_noop ("Command line tool to access the testing library"), options, &run,
- NULL)) ? ret : 1;
+ if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+ return 2;
+
+ ret = (GNUNET_OK ==
+ GNUNET_PROGRAM_run (argc, argv, "gnunet-testing",
+ gettext_noop ("Command line tool to access the testing library"), options, &run,
+ NULL)) ? ret : 1;
+ GNUNET_free ((void*) argv);
+ return ret;
}
/* end of gnunet-testing.c */