* @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"
-#define HOSTKEYFILESIZE 914
/**
* Final status code.
*/
static int ret;
-static unsigned int create_hostkey;
+static char *create_hostkey;
-static unsigned int create_cfg;
+static int create_cfg;
-static int create_no;
+static unsigned int create_no;
-static char * create_cfg_template;
+static char *create_cfg_template;
-static char * create_hostkey_file;
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;
}
-
- int cur = 0;
- char * cur_file;
- char *service_home = NULL;
- char *cur_service_home = NULL;
-
- struct GNUNET_CONFIGURATION_Handle *cfg_new = NULL;
- struct GNUNET_CONFIGURATION_Handle *cfg_tmpl = GNUNET_CONFIGURATION_create();
+ cfg_tmpl = GNUNET_CONFIGURATION_create();
/* 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;
}
/* load defaults */
- else
- GNUNET_CONFIGURATION_load(cfg_tmpl, NULL);
-
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string(cfg_tmpl, "PATHS", "SERVICEHOME", &service_home))
+ if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg_tmpl, NULL))
{
- GNUNET_asprintf(&service_home, "%s", "/tmp/testing");
- }
- else
- {
- int s = strlen (service_home);
- if (service_home[s-1] == DIR_SEPARATOR)
- service_home[s-1] = '\0';
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not load template `%s'\n", create_cfg_template);
+ GNUNET_CONFIGURATION_destroy (cfg_tmpl);
+ return 1;
}
- while (cur < no)
+ 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)
else
GNUNET_asprintf (&cur_file,"%04u%s",cur, ".conf");
-
- GNUNET_asprintf (&cur_service_home, "%s-%04u%c",service_home, cur, DIR_SEPARATOR);
- GNUNET_CONFIGURATION_set_value_string (cfg_tmpl,"PATHS","SERVICEHOME", cur_service_home);
- GNUNET_CONFIGURATION_set_value_string (cfg_tmpl,"PATHS","DEFAULTCONFIG", cur_file);
- GNUNET_free (cur_service_home);
-
- cfg_new = GNUNET_TESTING_create_cfg(cfg_tmpl, cur, &port, &upnum, NULL, &fdnum);
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Writing configuration no. %u to file `%s' \n", cur, cur_file);
+ 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);
- GNUNET_free (service_home);
- 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;
- int cur = 0;
- uint64_t fs;
- uint64_t total_hostkeys;
- char *hostkey_data;
- char *hostkey_src_file;
- char *hostkey_dest_file;
+ struct GNUNET_CRYPTO_EccPrivateKey *pk;
+ struct GNUNET_CRYPTO_EccPrivateKeyBinaryEncoded *pkb;
+ ssize_t ret;
- /* prepare hostkeys */
- if (create_hostkey_file == NULL)
- hostkey_src_file = "../../contrib/testing_hostkeys.dat";
- else
+ system = GNUNET_TESTING_system_create ("testing", NULL, NULL);
+ pk = GNUNET_TESTING_hostkey_get (system, create_no, &id);
+ if (NULL == pk)
{
- hostkey_src_file = create_hostkey_file;
- }
-
- if (GNUNET_YES != GNUNET_DISK_file_test (hostkey_src_file))
- {
- if (create_hostkey_file == NULL)
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Could not read hostkeys file, specify hostkey file with -H!\n"));
- else
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Specified hostkey file `%s' not found!\n"), create_hostkey_file);
+ fprintf (stderr, _("Could not extract hostkey %u (offset too large?)\n"), create_no);
+ GNUNET_TESTING_system_destroy (system, GNUNET_YES);
return 1;
}
- else
- {
- /* Check hostkey file size, read entire thing into memory */
- fd = GNUNET_DISK_file_open (hostkey_src_file, GNUNET_DISK_OPEN_READ,
- GNUNET_DISK_PERM_NONE);
- if (NULL == fd)
- {
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "open", hostkey_src_file);
- return 1;
- }
-
- if (GNUNET_YES != GNUNET_DISK_file_size (hostkey_src_file, &fs, GNUNET_YES))
- fs = 0;
-
- if (0 != (fs % HOSTKEYFILESIZE))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "File size %llu seems incorrect for hostkeys...\n", fs);
- }
- else
- {
- total_hostkeys = fs / HOSTKEYFILESIZE;
- hostkey_data = GNUNET_malloc_large (fs);
- GNUNET_assert (fs == GNUNET_DISK_file_read (fd, hostkey_data, fs));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Read %llu hostkeys from file\n", total_hostkeys);
- }
- GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fd));
- }
-
- while (cur < no)
- {
- GNUNET_asprintf (&hostkey_dest_file, "%04u-hostkey",cur);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_DISK_directory_create_for_file (hostkey_dest_file));
- fd = GNUNET_DISK_file_open (hostkey_dest_file,
- GNUNET_DISK_OPEN_READWRITE |
- GNUNET_DISK_OPEN_CREATE,
- GNUNET_DISK_PERM_USER_READ |
- GNUNET_DISK_PERM_USER_WRITE);
- GNUNET_assert (fd != NULL);
- GNUNET_assert (HOSTKEYFILESIZE ==
- GNUNET_DISK_file_write (fd, &hostkey_data[cur * HOSTKEYFILESIZE], HOSTKEYFILESIZE));
- GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fd));
- GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
- "Wrote hostkey to file: `%s' \n", hostkey_dest_file);
- GNUNET_free (hostkey_dest_file);
- cur ++;
- }
-
- GNUNET_free (hostkey_data);
-
+ (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)
+ if (GNUNET_YES == create_cfg)
{
if (create_no > 0)
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating %u configuration files based on template `%s'\n", create_no, create_cfg_template);
+ 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
ret = 1;
}
}
-
- if (create_hostkey == GNUNET_YES)
+ if (NULL != create_hostkey)
{
- if (create_no > 0)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating %u hostkeys \n", create_no);
- ret = create_hostkeys (create_no);
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Missing arguments! \n");
- 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);
}
static const struct GNUNET_GETOPT_CommandLineOption options[] = {
{'C', "cfg", NULL, gettext_noop ("create unique configuration files"),
GNUNET_NO, &GNUNET_GETOPT_set_one, &create_cfg},
- {'k', "key", NULL, gettext_noop ("create hostkey files from pre-computed hostkey list"),
- GNUNET_NO, &GNUNET_GETOPT_set_one, &create_hostkey},
- {'H', "hostkeys", NULL, gettext_noop ("host key file"),
- GNUNET_YES, &GNUNET_GETOPT_set_string, &create_hostkey_file},
- {'n', "number", NULL, gettext_noop ("number of unique configuration files or hostkeys to create"),
+ {'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", NULL, gettext_noop ("configuration template"),
+ {'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 */