X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftesting%2Ftesting.c;h=a4fdd38cabcf55eaef7107777a97f7672c3ba834;hb=cea95af17bb3bfaf65224d0ecd2db2308e333764;hp=ab85db4d5785320c516bc51114f46fb0368db280;hpb=1fb28e00ee7b770049328a9d880b00f553599e9a;p=oweals%2Fgnunet.git diff --git a/src/testing/testing.c b/src/testing/testing.c index ab85db4d5..a4fdd38ca 100644 --- a/src/testing/testing.c +++ b/src/testing/testing.c @@ -103,7 +103,8 @@ struct GNUNET_TESTING_System { /** * Prefix (i.e. "/tmp/gnunet-testing/") we prepend to each - * SERVICEHOME. */ + * GNUNET_HOME. + */ char *tmppath; /** @@ -132,26 +133,14 @@ struct GNUNET_TESTING_System unsigned int n_shared_services; /** - * Bitmap where each TCP port that has already been reserved for - * some GNUnet peer is recorded. Note that we additionally need to - * test if a port is already in use by non-GNUnet components before - * assigning it to a peer/service. If we detect that a port is - * already in use, we also mark it in this bitmap. So all the bits - * that are zero merely indicate ports that MIGHT be available for - * peers. - */ - uint32_t reserved_tcp_ports[65536 / 32]; - - /** - * Bitmap where each UDP port that has already been reserved for - * some GNUnet peer is recorded. Note that we additionally need to - * test if a port is already in use by non-GNUnet components before - * assigning it to a peer/service. If we detect that a port is - * already in use, we also mark it in this bitmap. So all the bits - * that are zero merely indicate ports that MIGHT be available for - * peers. + * Bitmap where each port that has already been reserved for some GNUnet peer + * is recorded. Note that we make no distinction between TCP and UDP ports + * and test if a port is already in use before assigning it to a peer/service. + * If we detect that a port is already in use, we also mark it in this bitmap. + * So all the bits that are zero merely indicate ports that MIGHT be available + * for peers. */ - uint32_t reserved_udp_ports[65536 / 32]; + uint32_t reserved_ports[65536 / 32]; /** * Counter we use to make service home paths unique on this system; @@ -161,7 +150,7 @@ struct GNUNET_TESTING_System * by one for each configured peer. Even if peers are destroyed, * we never re-use path counters. */ - uint32_t path_counter; + uint32_t path_counter; /** * The number of hostkeys @@ -197,13 +186,13 @@ struct GNUNET_TESTING_Peer /** * Binary to be executed during 'GNUNET_TESTING_peer_start'. - * Typically 'gnunet-service-arm' (but can be set to a + * Typically 'gnunet-service-arm' (but can be set to a * specific service by 'GNUNET_TESTING_service_run' if * necessary). - */ + */ char *main_binary; char *args; - + /** * Handle to the running binary of the service, NULL if the * peer/service is currently not running. @@ -227,14 +216,14 @@ struct GNUNET_TESTING_Peer /** * The callback to call asynchronously when a peer is stopped - */ + */ GNUNET_TESTING_PeerStopCallback cb; - + /** * The closure for the above callback */ void *cb_cls; - + /** * The cached identity of this peer. Will be populated on call to * GNUNET_TESTING_peer_get_identity() @@ -272,7 +261,7 @@ struct GNUNET_TESTING_Peer static int hostkeys_load (struct GNUNET_TESTING_System *system) { - uint64_t fs; + uint64_t fs; char *data_dir; char *filename; struct GNUNET_DISK_FileHandle *fd; @@ -280,7 +269,7 @@ hostkeys_load (struct GNUNET_TESTING_System *system) GNUNET_assert (NULL == system->hostkeys_data); data_dir = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_DATADIR); GNUNET_asprintf (&filename, "%s/testing_hostkeys.ecc", data_dir); - GNUNET_free (data_dir); + GNUNET_free (data_dir); if (GNUNET_YES != GNUNET_DISK_file_test (filename)) { @@ -290,7 +279,7 @@ hostkeys_load (struct GNUNET_TESTING_System *system) return GNUNET_SYSERR; } /* Check hostkey file size, read entire thing into memory */ - if (GNUNET_OK != + if (GNUNET_OK != GNUNET_DISK_file_size (filename, &fs, GNUNET_YES, GNUNET_YES)) fs = 0; if (0 == fs) @@ -367,7 +356,9 @@ cfg_copy_iterator (void *cls, const char *section, * * @param testdir only the directory name without any path. This is used for * all service homes; the directory will be created in a temporary - * location depending on the underlying OS + * location depending on the underlying OS. This variable will be + * overridden with the value of the environmental variable + * GNUNET_TESTING_PREFIX, if it exists. * @param trusted_ip the ip address which will be set as TRUSTED HOST in all * service configurations generated to allow control connections from * this ip. This can either be a single ip address or a network address @@ -396,8 +387,11 @@ GNUNET_TESTING_system_create_with_portrange (const char *testdir, unsigned int cnt; GNUNET_assert (NULL != testdir); - system = GNUNET_malloc (sizeof (struct GNUNET_TESTING_System)); - system->tmppath = GNUNET_DISK_mkdtemp (testdir); + system = GNUNET_new (struct GNUNET_TESTING_System); + if (NULL == (system->tmppath = getenv (GNUNET_TESTING_PREFIX))) + system->tmppath = GNUNET_DISK_mkdtemp (testdir); + else + system->tmppath = GNUNET_strdup (system->tmppath); system->lowport = lowport; system->highport = highport; if (NULL == system->tmppath) @@ -419,13 +413,15 @@ GNUNET_TESTING_system_create_with_portrange (const char *testdir, for (cnt = 0; NULL != shared_services[cnt].service; cnt++) { tss = shared_services[cnt]; - ss = GNUNET_malloc (sizeof (struct SharedService)); + ss = GNUNET_new (struct SharedService); ss->sname = GNUNET_strdup (tss.service); ss->cfg = GNUNET_CONFIGURATION_create (); GNUNET_CONFIGURATION_iterate_section_values (tss.cfg, ss->sname, &cfg_copy_iterator, ss->cfg); GNUNET_CONFIGURATION_iterate_section_values (tss.cfg, "TESTING", &cfg_copy_iterator, ss->cfg); + GNUNET_CONFIGURATION_iterate_section_values (tss.cfg, "PATHS", + &cfg_copy_iterator, ss->cfg); ss->share = tss.share; GNUNET_array_append (system->shared_services, system->n_shared_services, ss); @@ -441,7 +437,9 @@ GNUNET_TESTING_system_create_with_portrange (const char *testdir, * * @param testdir only the directory name without any path. This is used for all * service homes; the directory will be created in a temporary location - * depending on the underlying OS + * depending on the underlying OS. This variable will be + * overridden with the value of the environmental variable + * GNUNET_TESTING_PREFIX, if it exists. * @param trusted_ip the ip address which will be set as TRUSTED HOST in all * service configurations generated to allow control connections from * this ip. This can either be a single ip address or a network address @@ -495,7 +493,7 @@ start_shared_service_instance (struct SharedServiceInstance *i) GNUNET_free (binary); i->proc = GNUNET_OS_start_process (PIPE_CONTROL, GNUNET_OS_INHERIT_STD_OUT_AND_ERR, - NULL, NULL, + NULL, NULL, NULL, libexec_binary, libexec_binary, "-c", @@ -512,7 +510,7 @@ static void stop_shared_service_instance (struct SharedServiceInstance *i) { GNUNET_break (0 == i->n_refs); - if (0 != GNUNET_OS_process_kill (i->proc, SIGTERM)) + if (0 != GNUNET_OS_process_kill (i->proc, GNUNET_TERM_SIG)) LOG (GNUNET_ERROR_TYPE_WARNING, "Killing shared service instance (%s) failed\n", i->ss->sname); (void) GNUNET_OS_process_wait (i->proc); @@ -568,12 +566,10 @@ GNUNET_TESTING_system_destroy (struct GNUNET_TESTING_System *system, * Reserve a TCP or UDP port for a peer. * * @param system system to use for reservation tracking - * @param is_tcp GNUNET_YES for TCP ports, GNUNET_NO for UDP * @return 0 if no free port was available */ -uint16_t -GNUNET_TESTING_reserve_port (struct GNUNET_TESTING_System *system, - int is_tcp) +uint16_t +GNUNET_TESTING_reserve_port (struct GNUNET_TESTING_System *system) { struct GNUNET_NETWORK_Handle *socket; struct addrinfo hint; @@ -590,22 +586,21 @@ GNUNET_TESTING_reserve_port (struct GNUNET_TESTING_System *system, /* FIXME: Instead of using getaddrinfo we should try to determine the port status by the following heurestics. - + On systems which support both IPv4 and IPv6, only ports open on both address families are considered open. On system with either IPv4 or IPv6. A port is considered open if it's open in the respective address family */ hint.ai_family = AF_UNSPEC; /* IPv4 and IPv6 */ - hint.ai_socktype = (GNUNET_YES == is_tcp)? SOCK_STREAM : SOCK_DGRAM; + hint.ai_socktype = 0; hint.ai_protocol = 0; hint.ai_addrlen = 0; hint.ai_addr = NULL; hint.ai_canonname = NULL; hint.ai_next = NULL; hint.ai_flags = AI_PASSIVE | AI_NUMERICSERV; /* Wild card address */ - port_buckets = (GNUNET_YES == is_tcp) ? - system->reserved_tcp_ports : system->reserved_udp_ports; + port_buckets = system->reserved_ports; for (index = (system->lowport / 32) + 1; index < (system->highport / 32); index++) { xor_image = (UINT32_MAX ^ port_buckets[index]); @@ -629,16 +624,21 @@ GNUNET_TESTING_reserve_port (struct GNUNET_TESTING_System *system, bind_status = GNUNET_NO; for (ai = ret; NULL != ai; ai = ai->ai_next) { - socket = GNUNET_NETWORK_socket_create (ai->ai_family, - (GNUNET_YES == is_tcp) ? - SOCK_STREAM : SOCK_DGRAM, - 0); + socket = GNUNET_NETWORK_socket_create (ai->ai_family, SOCK_STREAM, 0); + if (NULL == socket) + continue; + bind_status = GNUNET_NETWORK_socket_bind (socket, + ai->ai_addr, + ai->ai_addrlen); + GNUNET_NETWORK_socket_close (socket); + if (GNUNET_OK != bind_status) + break; + socket = GNUNET_NETWORK_socket_create (ai->ai_family, SOCK_DGRAM, 0); if (NULL == socket) continue; bind_status = GNUNET_NETWORK_socket_bind (socket, ai->ai_addr, - ai->ai_addrlen, - 0); + ai->ai_addrlen); GNUNET_NETWORK_socket_close (socket); if (GNUNET_OK != bind_status) break; @@ -663,20 +663,17 @@ GNUNET_TESTING_reserve_port (struct GNUNET_TESTING_System *system, * (used during GNUNET_TESTING_peer_destroy). * * @param system system to use for reservation tracking - * @param is_tcp GNUNET_YES for TCP ports, GNUNET_NO for UDP * @param port reserved port to release */ void GNUNET_TESTING_release_port (struct GNUNET_TESTING_System *system, - int is_tcp, uint16_t port) { uint32_t *port_buckets; uint16_t bucket; uint16_t pos; - port_buckets = (GNUNET_YES == is_tcp) ? - system->reserved_tcp_ports : system->reserved_udp_ports; + port_buckets = system->reserved_ports; bucket = port / 32; pos = port % 32; LOG (GNUNET_ERROR_TYPE_DEBUG, "Releasing port %u\n", port); @@ -694,11 +691,11 @@ GNUNET_TESTING_release_port (struct GNUNET_TESTING_System *system, * faster peer startup. This function can be used to * access the n-th key of those pre-created hostkeys; note * that these keys are ONLY useful for testing and not - * secure as the private keys are part of the public + * secure as the private keys are part of the public * GNUnet source code. * * This is primarily a helper function used internally - * by 'GNUNET_TESTING_peer_configure'. + * by #GNUNET_TESTING_peer_configure. * * @param system the testing system handle * @param key_number desired pre-created hostkey to obtain @@ -706,14 +703,13 @@ GNUNET_TESTING_release_port (struct GNUNET_TESTING_System *system, * key; if NULL, GNUNET_SYSERR is returned immediately * @return NULL on error (not enough keys) */ -struct GNUNET_CRYPTO_EccPrivateKey * +struct GNUNET_CRYPTO_EddsaPrivateKey * GNUNET_TESTING_hostkey_get (const struct GNUNET_TESTING_System *system, uint32_t key_number, struct GNUNET_PeerIdentity *id) -{ - struct GNUNET_CRYPTO_EccPrivateKey *private_key; - struct GNUNET_CRYPTO_EccPublicKey public_key; - +{ + struct GNUNET_CRYPTO_EddsaPrivateKey *private_key; + if ((NULL == id) || (NULL == system->hostkeys_data)) return NULL; if (key_number >= system->total_hostkeys) @@ -721,22 +717,14 @@ GNUNET_TESTING_hostkey_get (const struct GNUNET_TESTING_System *system, LOG (GNUNET_ERROR_TYPE_ERROR, _("Key number %u does not exist\n"), key_number); return NULL; - } - private_key = GNUNET_new (struct GNUNET_CRYPTO_EccPrivateKey); + } + private_key = GNUNET_new (struct GNUNET_CRYPTO_EddsaPrivateKey); memcpy (private_key, system->hostkeys_data + (key_number * GNUNET_TESTING_HOSTKEYFILESIZE), GNUNET_TESTING_HOSTKEYFILESIZE); - if (NULL == private_key) - { - LOG (GNUNET_ERROR_TYPE_ERROR, - _("Error while decoding key %u\n"), key_number); - return NULL; - } - GNUNET_CRYPTO_ecc_key_get_public (private_key, &public_key); - GNUNET_CRYPTO_hash (&public_key, - sizeof (struct GNUNET_CRYPTO_EccPublicKey), - &(id->hashPubKey)); + GNUNET_CRYPTO_eddsa_key_get_public (private_key, + &id->public_key); return private_key; } @@ -751,7 +739,7 @@ struct UpdateContext * The system for which we are building configurations */ struct GNUNET_TESTING_System *system; - + /** * The configuration we are building */ @@ -760,7 +748,7 @@ struct UpdateContext /** * The customized service home path for this peer */ - char *service_home; + char *gnunet_home; /** * Array of ports currently allocated to this peer. These ports will be @@ -819,8 +807,7 @@ update_config (void *cls, const char *section, const char *option, GNUNET_CONFIGURATION_get_value_yesno (uc->cfg, "testing", single_variable))) { - /* FIXME: What about UDP? */ - new_port = GNUNET_TESTING_reserve_port (uc->system, GNUNET_YES); + new_port = GNUNET_TESTING_reserve_port (uc->system); if (0 == new_port) { uc->status = GNUNET_SYSERR; @@ -853,7 +840,7 @@ update_config (void *cls, const char *section, const char *option, single_variable)) { GNUNET_snprintf (uval, sizeof (uval), "%s/%s.sock", - uc->service_home, section); + uc->gnunet_home, section); value = uval; } else if ((GNUNET_YES == @@ -886,7 +873,7 @@ static void update_config_sections (void *cls, const char *section) { - struct UpdateContext *uc = cls; + struct UpdateContext *uc = cls; char **ikeys; char *val; char *ptr; @@ -895,7 +882,7 @@ update_config_sections (void *cls, char *ACCEPT_FROM_key; uint16_t ikeys_cnt; uint16_t key; - + ikeys_cnt = 0; val = NULL; /* Ignore certain options from sections. See @@ -903,8 +890,8 @@ update_config_sections (void *cls, if (GNUNET_YES == GNUNET_CONFIGURATION_have_value (uc->cfg, section, "TESTING_IGNORE_KEYS")) { - GNUNET_assert - (GNUNET_YES == + GNUNET_assert + (GNUNET_YES == GNUNET_CONFIGURATION_get_value_string (uc->cfg, section, "TESTING_IGNORE_KEYS", &val)); ptr = val; @@ -936,10 +923,10 @@ update_config_sections (void *cls, (GNUNET_YES == GNUNET_CONFIGURATION_have_value (uc->cfg, section, "ADVERTISED_PORT"))) { - if (GNUNET_OK == + if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (uc->cfg, section, "PORT", &ptr)) { - GNUNET_CONFIGURATION_set_value_string (uc->cfg, section, + GNUNET_CONFIGURATION_set_value_string (uc->cfg, section, "ADVERTISED_PORT", ptr); GNUNET_free (ptr); } @@ -956,11 +943,11 @@ update_config_sections (void *cls, GNUNET_free (ikeys); } GNUNET_free_non_null (val); - ACCEPT_FROM_key = "ACCEPT_FROM"; - if ((NULL != uc->system->trusted_ip) && + ACCEPT_FROM_key = "ACCEPT_FROM"; + if ((NULL != uc->system->trusted_ip) && (NULL != strstr (uc->system->trusted_ip, ":"))) /* IPv6 in use */ ACCEPT_FROM_key = "ACCEPT_FROM6"; - if (GNUNET_OK != + if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (uc->cfg, section, ACCEPT_FROM_key, &orig_allowed_hosts)) { @@ -974,7 +961,7 @@ update_config_sections (void *cls, GNUNET_free (orig_allowed_hosts); GNUNET_CONFIGURATION_set_value_string (uc->cfg, section, ACCEPT_FROM_key, allowed_hosts); - GNUNET_free (allowed_hosts); + GNUNET_free (allowed_hosts); } static struct SharedServiceInstance * @@ -984,34 +971,34 @@ associate_shared_service (struct GNUNET_TESTING_System *system, { struct SharedServiceInstance *i; struct GNUNET_CONFIGURATION_Handle *temp; - char *service_home; + char *gnunet_home; uint32_t port; ss->n_peers++; if ( ((0 == ss->share) && (NULL == ss->instances)) || - ( (0 != ss->share) + ( (0 != ss->share) && (ss->n_instances < ((ss->n_peers + ss->share - 1) / ss->share)) ) ) - { - i = GNUNET_malloc (sizeof (struct SharedServiceInstance)); + { + i = GNUNET_new (struct SharedServiceInstance); i->ss = ss; - (void) GNUNET_asprintf (&service_home, "%s/shared/%s/%u", + (void) GNUNET_asprintf (&gnunet_home, "%s/shared/%s/%u", system->tmppath, ss->sname, ss->n_instances); - (void) GNUNET_asprintf (&i->unix_sock, "%s/sock", service_home); - port = GNUNET_TESTING_reserve_port (system, GNUNET_YES); + (void) GNUNET_asprintf (&i->unix_sock, "%s/sock", gnunet_home); + port = GNUNET_TESTING_reserve_port (system); if (0 == port) { - GNUNET_free (service_home); + GNUNET_free (gnunet_home); cleanup_shared_service_instance (i); return NULL; } GNUNET_array_append (ss->instances, ss->n_instances, i); temp = GNUNET_CONFIGURATION_dup (ss->cfg); (void) GNUNET_asprintf (&i->port_str, "%u", port); - (void) GNUNET_asprintf (&i->cfg_fn, "%s/config", service_home); - GNUNET_CONFIGURATION_set_value_string (temp, "PATHS", "SERVICEHOME", - service_home); - GNUNET_free (service_home); + (void) GNUNET_asprintf (&i->cfg_fn, "%s/config", gnunet_home); + GNUNET_CONFIGURATION_set_value_string (temp, "PATHS", "GNUNET_HOME", + gnunet_home); + GNUNET_free (gnunet_home); GNUNET_CONFIGURATION_set_value_string (temp, ss->sname, "UNIXPATH", i->unix_sock); GNUNET_CONFIGURATION_set_value_string (temp, ss->sname, "PORT", @@ -1030,7 +1017,7 @@ associate_shared_service (struct GNUNET_TESTING_System *system, GNUNET_assert (0 < ss->n_instances); i = ss->instances[ss->n_instances - 1]; } - GNUNET_CONFIGURATION_iterate_section_values(ss->cfg, ss->sname, + GNUNET_CONFIGURATION_iterate_section_values(ss->cfg, ss->sname, &cfg_copy_iterator, cfg); GNUNET_CONFIGURATION_set_value_string (cfg, ss->sname, "UNIXPATH", i->unix_sock); @@ -1043,9 +1030,9 @@ associate_shared_service (struct GNUNET_TESTING_System *system, * Create a new configuration using the given configuration as a template; * ports and paths will be modified to select available ports on the local * system. The default configuration will be available in PATHS section under - * the option DEFAULTCONFIG after the call. SERVICE_HOME is also set in PATHS + * the option DEFAULTCONFIG after the call. GNUNET_HOME is also set in PATHS * section to the temporary directory specific to this configuration. If we run - * out of "*port" numbers, return SYSERR. + * out of "*port" numbers, return #GNUNET_SYSERR. * * This is primarily a helper function used internally * by 'GNUNET_TESTING_peer_configure'. @@ -1055,7 +1042,7 @@ associate_shared_service (struct GNUNET_TESTING_System *system, * @param ports array with port numbers used in the created configuration. * Will be updated upon successful return. Can be NULL * @param nports the size of the `ports' array. Will be updated. - * @return GNUNET_OK on success, GNUNET_SYSERR on error - the configuration will + * @return #GNUNET_OK on success, #GNUNET_SYSERR on error - the configuration will * be incomplete and should not be used there upon */ static int @@ -1065,32 +1052,32 @@ GNUNET_TESTING_configuration_create_ (struct GNUNET_TESTING_System *system, unsigned int *nports) { struct UpdateContext uc; - char *default_config; + char *default_config; uc.system = system; uc.cfg = cfg; uc.status = GNUNET_OK; uc.ports = NULL; uc.nports = 0; - GNUNET_asprintf (&uc.service_home, "%s/%u", system->tmppath, + GNUNET_asprintf (&uc.gnunet_home, "%s/%u", system->tmppath, system->path_counter++); - GNUNET_asprintf (&default_config, "%s/config", uc.service_home); + GNUNET_asprintf (&default_config, "%s/config", uc.gnunet_home); GNUNET_CONFIGURATION_set_value_string (cfg, "PATHS", "DEFAULTCONFIG", default_config); GNUNET_CONFIGURATION_set_value_string (cfg, "arm", "CONFIG", default_config); GNUNET_free (default_config); - GNUNET_CONFIGURATION_set_value_string (cfg, "PATHS", "SERVICEHOME", - uc.service_home); + GNUNET_CONFIGURATION_set_value_string (cfg, "PATHS", "GNUNET_HOME", + uc.gnunet_home); /* make PORTs and UNIXPATHs unique */ GNUNET_CONFIGURATION_iterate (cfg, &update_config, &uc); /* allow connections to services from system trusted_ip host */ GNUNET_CONFIGURATION_iterate_sections (cfg, &update_config_sections, &uc); /* enable loopback-based connections between peers */ - GNUNET_CONFIGURATION_set_value_string (cfg, + GNUNET_CONFIGURATION_set_value_string (cfg, "nat", "USE_LOCALADDR", "YES"); - GNUNET_free (uc.service_home); + GNUNET_free (uc.gnunet_home); if ((NULL != ports) && (NULL != nports)) { *ports = uc.ports; @@ -1106,7 +1093,7 @@ GNUNET_TESTING_configuration_create_ (struct GNUNET_TESTING_System *system, * Create a new configuration using the given configuration as a template; * ports and paths will be modified to select available ports on the local * system. The default configuration will be available in PATHS section under - * the option DEFAULTCONFIG after the call. SERVICE_HOME is also set in PATHS + * the option DEFAULTCONFIG after the call. GNUNET_HOME is also set in PATHS * section to the temporary directory specific to this configuration. If we run * out of "*port" numbers, return SYSERR. * @@ -1128,14 +1115,14 @@ GNUNET_TESTING_configuration_create (struct GNUNET_TESTING_System *system, /** * Configure a GNUnet peer. GNUnet must be installed on the local - * system and available in the PATH. + * system and available in the PATH. * * @param system system to use to coordinate resource usage * @param cfg configuration to use; will be UPDATED (to reflect needed * changes in port numbers and paths) * @param key_number number of the hostkey to use for the peer * @param id identifier for the daemon, will be set, can be NULL - * @param emsg set to freshly allocated error message (set to NULL on success), + * @param emsg set to freshly allocated error message (set to NULL on success), * can be NULL * @return handle to the peer, NULL on error */ @@ -1152,37 +1139,23 @@ GNUNET_TESTING_peer_configure (struct GNUNET_TESTING_System *system, char *config_filename; char *libexec_binary; char *emsg_; - struct GNUNET_CRYPTO_EccPrivateKey *pk; + struct GNUNET_CRYPTO_EddsaPrivateKey *pk; uint16_t *ports; struct SharedService *ss; struct SharedServiceInstance **ss_instances; unsigned int cnt; - unsigned int nports; + unsigned int nports; ports = NULL; nports = 0; ss_instances = NULL; if (NULL != emsg) *emsg = NULL; - /* Remove sections for shared services */ - for (cnt = 0; cnt < system->n_shared_services; cnt++) - { - ss = system->shared_services[cnt]; - GNUNET_CONFIGURATION_remove_section (cfg, ss->sname); - } - if (GNUNET_OK != GNUNET_TESTING_configuration_create_ (system, cfg, - &ports, &nports)) - { - GNUNET_asprintf (&emsg_, - _("Failed to create configuration for peer " - "(not enough free ports?)\n")); - goto err_ret; - } if (key_number >= system->total_hostkeys) { GNUNET_asprintf (&emsg_, _("You attempted to create a testbed with more than %u hosts. Please precompute more hostkeys first.\n"), - (unsigned int) system->total_hostkeys); + (unsigned int) system->total_hostkeys); goto err_ret; } pk = NULL; @@ -1195,23 +1168,46 @@ GNUNET_TESTING_peer_configure (struct GNUNET_TESTING_System *system, goto err_ret; } if (NULL != pk) - GNUNET_CRYPTO_ecc_key_free (pk); - GNUNET_assert (GNUNET_OK == + GNUNET_free (pk); + if (GNUNET_NO == + GNUNET_CONFIGURATION_have_value (cfg, "PEER", "PRIVATE_KEY")) + { + GNUNET_asprintf (&emsg_, + _("PRIVATE_KEY option in PEER section missing in configuration\n")); + goto err_ret; + } + /* Remove sections for shared services */ + for (cnt = 0; cnt < system->n_shared_services; cnt++) + { + ss = system->shared_services[cnt]; + GNUNET_CONFIGURATION_remove_section (cfg, ss->sname); + } + if (GNUNET_OK != GNUNET_TESTING_configuration_create_ (system, cfg, + &ports, &nports)) + { + GNUNET_asprintf (&emsg_, + _("Failed to create configuration for peer " + "(not enough free ports?)\n")); + goto err_ret; + } + GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_get_value_filename (cfg, "PEER", "PRIVATE_KEY", &hostkey_filename)); fd = GNUNET_DISK_file_open (hostkey_filename, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, - GNUNET_DISK_PERM_USER_READ + GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE); if (NULL == fd) { - GNUNET_asprintf (&emsg_, _("Cannot open hostkey file: %s\n"), - STRERROR (errno)); + GNUNET_asprintf (&emsg_, _("Cannot open hostkey file `%s': %s\n"), + hostkey_filename, STRERROR (errno)); + GNUNET_free (hostkey_filename); goto err_ret; } + GNUNET_free (hostkey_filename); if (GNUNET_TESTING_HOSTKEYFILESIZE != - GNUNET_DISK_file_write (fd, system->hostkeys_data + GNUNET_DISK_file_write (fd, system->hostkeys_data + (key_number * GNUNET_TESTING_HOSTKEYFILESIZE), GNUNET_TESTING_HOSTKEYFILESIZE)) { @@ -1230,22 +1226,25 @@ GNUNET_TESTING_peer_configure (struct GNUNET_TESTING_System *system, ss = system->shared_services[cnt]; ss_instances[cnt] = associate_shared_service (system, ss, cfg); if (NULL == ss_instances[cnt]) + { + emsg_ = GNUNET_strdup ("FIXME"); goto err_ret; - } + } + } GNUNET_assert (GNUNET_OK == - GNUNET_CONFIGURATION_get_value_string - (cfg, "PATHS", "DEFAULTCONFIG", &config_filename)); + GNUNET_CONFIGURATION_get_value_filename + (cfg, "PATHS", "DEFAULTCONFIG", &config_filename)); if (GNUNET_OK != GNUNET_CONFIGURATION_write (cfg, config_filename)) { GNUNET_asprintf (&emsg_, _("Failed to write configuration file `%s' for peer %u: %s\n"), config_filename, (unsigned int) key_number, - STRERROR (errno)); + STRERROR (errno)); GNUNET_free (config_filename); goto err_ret; } - peer = GNUNET_malloc (sizeof (struct GNUNET_TESTING_Peer)); + peer = GNUNET_new (struct GNUNET_TESTING_Peer); peer->ss_instances = ss_instances; peer->cfgfile = config_filename; /* Free in peer_destroy */ peer->cfg = GNUNET_CONFIGURATION_dup (cfg); @@ -1257,7 +1256,9 @@ GNUNET_TESTING_peer_configure (struct GNUNET_TESTING_System *system, peer->args = strdup (""); } else + { peer->args = strdup (libexec_binary); + } peer->system = system; peer->key_number = key_number; GNUNET_free (libexec_binary); @@ -1292,8 +1293,8 @@ GNUNET_TESTING_peer_get_identity (struct GNUNET_TESTING_Peer *peer, memcpy (id, peer->id, sizeof (struct GNUNET_PeerIdentity)); return; } - peer->id = GNUNET_malloc (sizeof (struct GNUNET_PeerIdentity)); - GNUNET_CRYPTO_ecc_key_free (GNUNET_TESTING_hostkey_get (peer->system, + peer->id = GNUNET_new (struct GNUNET_PeerIdentity); + GNUNET_free (GNUNET_TESTING_hostkey_get (peer->system, peer->key_number, peer->id)); memcpy (id, peer->id, sizeof (struct GNUNET_PeerIdentity)); @@ -1301,7 +1302,7 @@ GNUNET_TESTING_peer_get_identity (struct GNUNET_TESTING_Peer *peer, /** - * Start the peer. + * Start the peer. * * @param peer peer to start * @return GNUNET_OK on success, GNUNET_SYSERR on error (i.e. peer already running) @@ -1316,7 +1317,7 @@ GNUNET_TESTING_peer_start (struct GNUNET_TESTING_Peer *peer) { GNUNET_break (0); return GNUNET_SYSERR; - } + } GNUNET_assert (NULL != peer->cfgfile); for (cnt = 0; cnt < peer->system->n_shared_services; cnt++) { @@ -1326,15 +1327,15 @@ GNUNET_TESTING_peer_start (struct GNUNET_TESTING_Peer *peer) return GNUNET_SYSERR; i->n_refs++; } - peer->main_process = GNUNET_OS_start_process (PIPE_CONTROL, - GNUNET_OS_INHERIT_STD_OUT_AND_ERR, - NULL, NULL, - peer->main_binary, - peer->main_binary, - peer->args, - "-c", - peer->cfgfile, - NULL); + peer->main_binary = GNUNET_CONFIGURATION_expand_dollar (peer->cfg, peer->main_binary); + peer->main_process = GNUNET_OS_start_process_s (PIPE_CONTROL, + GNUNET_OS_INHERIT_STD_OUT_AND_ERR, + NULL, + peer->main_binary, + peer->args, + "-c", + peer->cfgfile, + NULL); if (NULL == peer->main_process) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -1389,7 +1390,7 @@ GNUNET_TESTING_peer_service_start (struct GNUNET_TESTING_Peer *peer, * @return GNUNET_OK upon successfully queuing the service stop request; * GNUNET_SYSERR upon error */ -int +int GNUNET_TESTING_peer_service_stop (struct GNUNET_TESTING_Peer *peer, const char *service_name, struct GNUNET_TIME_Relative timeout, @@ -1398,13 +1399,13 @@ GNUNET_TESTING_peer_service_stop (struct GNUNET_TESTING_Peer *peer, { if (NULL == peer->ah) return GNUNET_SYSERR; - GNUNET_ARM_request_service_stop (peer->ah, + GNUNET_ARM_request_service_stop (peer->ah, service_name, timeout, cont, cont_cls); return GNUNET_OK; } - + /** * Sends SIGTERM to the peer's main process @@ -1424,7 +1425,7 @@ GNUNET_TESTING_peer_kill (struct GNUNET_TESTING_Peer *peer) GNUNET_break (0); return GNUNET_SYSERR; } - if (0 != GNUNET_OS_process_kill (peer->main_process, SIGTERM)) + if (0 != GNUNET_OS_process_kill (peer->main_process, GNUNET_TERM_SIG)) return GNUNET_SYSERR; for (cnt = 0; cnt < peer->system->n_shared_services; cnt++) { @@ -1463,7 +1464,7 @@ GNUNET_TESTING_peer_wait (struct GNUNET_TESTING_Peer *peer) /** - * Stop the peer. + * Stop the peer. * * @param peer peer to stop * @return GNUNET_OK on success, GNUNET_SYSERR on error @@ -1487,7 +1488,7 @@ GNUNET_TESTING_peer_stop (struct GNUNET_TESTING_Peer *peer) * GNUNET_SYSERR on error. */ static void -disconn_status (void *cls, +disconn_status (void *cls, int connected) { struct GNUNET_TESTING_Peer *peer = cls; @@ -1526,7 +1527,7 @@ GNUNET_TESTING_peer_stop_async (struct GNUNET_TESTING_Peer *peer, void *cb_cls) { if (NULL == peer->main_process) - return GNUNET_SYSERR; + return GNUNET_SYSERR; peer->ah = GNUNET_ARM_connect (peer->cfg, &disconn_status, peer); if (NULL == peer->ah) return GNUNET_SYSERR; @@ -1547,7 +1548,7 @@ GNUNET_TESTING_peer_stop_async (struct GNUNET_TESTING_Peer *peer, */ void GNUNET_TESTING_peer_stop_async_cancel (struct GNUNET_TESTING_Peer *peer) -{ +{ GNUNET_assert (NULL != peer->ah); GNUNET_ARM_disconnect_and_free (peer->ah); peer->ah = NULL; @@ -1582,9 +1583,7 @@ GNUNET_TESTING_peer_destroy (struct GNUNET_TESTING_Peer *peer) if (NULL != peer->ports) { for (cnt = 0; cnt < peer->nports; cnt++) - GNUNET_TESTING_release_port (peer->system, - GNUNET_YES, - peer->ports[cnt]); + GNUNET_TESTING_release_port (peer->system, peer->ports[cnt]); GNUNET_free (peer->ports); } GNUNET_free (peer); @@ -1632,7 +1631,7 @@ struct ServiceContext * Callback to signal service startup */ GNUNET_TESTING_TestMain tm; - + /** * The peer in which the service is run. */ @@ -1733,7 +1732,7 @@ GNUNET_TESTING_service_run (const char *testdir, GNUNET_free (libexec_binary); GNUNET_free (binary); if (GNUNET_OK != GNUNET_TESTING_peer_start (peer)) - { + { GNUNET_TESTING_peer_destroy (peer); GNUNET_CONFIGURATION_destroy (cfg); GNUNET_TESTING_system_destroy (system, GNUNET_YES); @@ -1763,14 +1762,14 @@ GNUNET_TESTING_service_run (const char *testdir, * Sometimes we use the binary name to determine which specific * test to run. In those cases, the string after the last "_" * in 'argv[0]' specifies a string that determines the configuration - * file or plugin to use. + * file or plugin to use. * * This function returns the respective substring, taking care * of issues such as binaries ending in '.exe' on W32. * * @param argv0 the name of the binary * @return string between the last '_' and the '.exe' (or the end of the string), - * NULL if argv0 has no '_' + * NULL if argv0 has no '_' */ char * GNUNET_TESTING_get_testname_from_underscore (const char *argv0)