X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftesting%2Ftesting.c;h=31bea068cfe84836f6d643a87237cf0cf3ab2fba;hb=0c0e1876f6fbd88b15ab5bad49ab6ce22706d03c;hp=c211667757f2fdd32ee0216627bb4e9ff7e4fe6c;hpb=502af2167f7c218366666ca4944bd7cc54b5b19a;p=oweals%2Fgnunet.git diff --git a/src/testing/testing.c b/src/testing/testing.c index c21166775..31bea068c 100644 --- a/src/testing/testing.c +++ b/src/testing/testing.c @@ -37,12 +37,6 @@ #include "gnunet_transport_service.h" #include "gnunet_hello_lib.h" -#define DEBUG_TESTING GNUNET_NO - -#define DEBUG_TESTING_RECONNECT GNUNET_NO - -#define WAIT_FOR_HELLO GNUNET_NO - /** * Hack to deal with initial HELLO's being often devoid of addresses. * This hack causes 'process_hello' to ignore HELLOs without addresses. @@ -67,10 +61,8 @@ static struct GNUNET_CORE_MessageHandler no_handlers[] = { {NULL, 0, 0} }; #if EMPTY_HACK static int -test_address (void *cls, - const char *tname, - struct GNUNET_TIME_Absolute expiration, - const void *addr, uint16_t addrlen) +test_address (void *cls, const struct GNUNET_HELLO_Address *address, + struct GNUNET_TIME_Absolute expiration) { int *empty = cls; @@ -83,7 +75,7 @@ test_address (void *cls, * Receive the HELLO from one peer, give it to the other * and ask them to connect. * - * @param cls "struct ConnectContext" + * @param cls Closure (daemon whose hello is this). * @param message HELLO message of peer */ static void @@ -92,9 +84,6 @@ process_hello (void *cls, const struct GNUNET_MessageHeader *message) struct GNUNET_TESTING_Daemon *daemon = cls; int msize; -#if WAIT_FOR_HELLO - GNUNET_TESTING_NotifyDaemonRunning cb; -#endif #if EMPTY_HACK int empty; @@ -104,31 +93,23 @@ process_hello (void *cls, const struct GNUNET_MessageHeader *message) GNUNET_NO, &test_address, &empty); if (GNUNET_YES == empty) { -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Skipping empty HELLO address\n"); -#endif + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Skipping empty HELLO address of peer %s\n", + GNUNET_i2s (&daemon->id)); return; } #endif - if (daemon == NULL) - return; - GNUNET_assert (daemon->phase == SP_GET_HELLO || daemon->phase == SP_START_DONE); -#if WAIT_FOR_HELLO - cb = daemon->cb; -#endif - daemon->cb = NULL; + daemon->cb = NULL; // FIXME: why??? (see fsm:SP_START_CORE, notify_daemon_started) if (daemon->task != GNUNET_SCHEDULER_NO_TASK) /* Assertion here instead? */ GNUNET_SCHEDULER_cancel (daemon->task); if (daemon->server != NULL) { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' from transport service of `%4s', disconnecting core!\n", "HELLO", GNUNET_i2s (&daemon->id)); -#endif GNUNET_CORE_disconnect (daemon->server); daemon->server = NULL; } @@ -136,18 +117,19 @@ process_hello (void *cls, const struct GNUNET_MessageHeader *message) msize = ntohs (message->size); if (msize < 1) { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "HELLO message of peer %s is of size 0\n", + GNUNET_i2s (&daemon->id)); return; } - if (daemon->th != NULL) + if (daemon->ghh != NULL) { - GNUNET_TRANSPORT_get_hello_cancel (daemon->th, &process_hello, daemon); + GNUNET_TRANSPORT_get_hello_cancel (daemon->ghh); + daemon->ghh = NULL; } -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received `%s' from transport service of `%4s'\n", - "HELLO", GNUNET_i2s (&daemon->id)); -#endif - + "Received `%s' from transport service of `%4s'\n", "HELLO", + GNUNET_i2s (&daemon->id)); GNUNET_free_non_null (daemon->hello); daemon->hello = GNUNET_malloc (msize); memcpy (daemon->hello, message, msize); @@ -158,111 +140,14 @@ process_hello (void *cls, const struct GNUNET_MessageHeader *message) daemon->th = NULL; } daemon->phase = SP_START_DONE; - -#if WAIT_FOR_HELLO - if (NULL != cb) /* FIXME: what happens when this callback calls GNUNET_TESTING_daemon_stop? */ - cb (daemon->cb_cls, &daemon->id, daemon->cfg, daemon, NULL); -#endif } -static void -start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc); -#if WAIT_FOR_HELLO -/** - * Function called after GNUNET_CORE_connect has succeeded - * (or failed for good). Note that the private key of the - * peer is intentionally not exposed here; if you need it, - * your process should try to read the private key file - * directly (which should work if you are authorized...). - * - * @param cls closure - * @param server handle to the server, NULL if we failed - * @param my_identity ID of this peer, NULL if we failed - * @param publicKey public key of this peer, NULL if we failed - */ -static void -testing_init (void *cls, - struct GNUNET_CORE_Handle *server, - const struct GNUNET_PeerIdentity *my_identity, - const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *publicKey) -{ - struct GNUNET_TESTING_Daemon *d = cls; - - GNUNET_assert (d->phase == SP_START_CORE); - d->phase = SP_GET_HELLO; - - if (server == NULL) - { - d->server = NULL; - if (GNUNET_YES == d->dead) - GNUNET_TESTING_daemon_stop (d, - GNUNET_TIME_absolute_get_remaining - (d->max_timeout), d->dead_cb, - d->dead_cb_cls, GNUNET_YES, GNUNET_NO); - else if (NULL != d->cb) - d->cb (d->cb_cls, NULL, d->cfg, d, - _("Failed to connect to core service\n")); - return; - } -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Successfully started peer `%4s'.\n", GNUNET_i2s (my_identity)); -#endif - d->id = *my_identity; /* FIXME: shouldn't we already have this from reading the hostkey file? */ - if (d->shortname == NULL) - d->shortname = strdup (GNUNET_i2s (my_identity)); - d->server = server; - d->running = GNUNET_YES; - - if (GNUNET_NO == d->running) - { -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Peer is dead (d->running == GNUNET_NO)\n"); -#endif - return; - } -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Successfully started peer `%4s', connecting to transport service.\n", - GNUNET_i2s (my_identity)); -#endif - - d->th = GNUNET_TRANSPORT_connect (d->cfg, &d->id, d, NULL, NULL, NULL); - if (d->th == NULL) - { - if (GNUNET_YES == d->dead) - GNUNET_TESTING_daemon_stop (d, - GNUNET_TIME_absolute_get_remaining - (d->max_timeout), d->dead_cb, - d->dead_cb_cls, GNUNET_YES, GNUNET_NO); - else if (NULL != d->cb) - d->cb (d->cb_cls, &d->id, d->cfg, d, - _("Failed to connect to transport service!\n")); - return; - } -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Connected to transport service `%s', getting HELLO\n", - GNUNET_i2s (my_identity)); -#endif - - GNUNET_TRANSPORT_get_hello (d->th, &process_hello, d); - /* wait some more */ - if (d->task != GNUNET_SCHEDULER_NO_TASK) - GNUNET_SCHEDULER_cancel (d->task); - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); -} -#endif - -#if !WAIT_FOR_HELLO /** * Notify of a peer being up and running. Scheduled as a task * so that variables which may need to be set are set before * the connect callback can set up new operations. + * FIXME: what variables?????? where from???? * * @param cls the testing daemon * @param tc task scheduler context @@ -278,7 +163,7 @@ notify_daemon_started (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if (NULL != cb) cb (d->cb_cls, &d->id, d->cfg, d, NULL); } -#endif + /** * Finite-state machine for starting GNUnet. @@ -296,33 +181,29 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) char *dst; int bytes_read; -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer FSM is in phase %u.\n", d->phase); -#endif - + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer %s FSM is in phase %u.\n", + GNUNET_i2s (&d->id), d->phase); d->task = GNUNET_SCHEDULER_NO_TASK; switch (d->phase) { case SP_COPYING: /* confirm copying complete */ - if (GNUNET_OK != GNUNET_OS_process_status (d->proc, &type, &code)) + if (GNUNET_OK != GNUNET_OS_process_status (d->proc_arm_copying, &type, &code)) { if (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value == 0) { cb = d->cb; d->cb = NULL; if (NULL != cb) - cb (d->cb_cls, - NULL, - d->cfg, d, + cb (d->cb_cls, NULL, d->cfg, d, _ ("`scp' does not seem to terminate (timeout copying config).\n")); return; } /* wait some more */ - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); + d->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, + d); return; } if ((type != GNUNET_OS_PROCESS_EXITED) || (code != 0)) @@ -333,44 +214,40 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) cb (d->cb_cls, NULL, d->cfg, d, _("`scp' did not complete cleanly.\n")); return; } - GNUNET_OS_process_close (d->proc); -#if DEBUG_TESTING + GNUNET_OS_process_destroy (d->proc_arm_copying); + d->proc_arm_copying = NULL; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Successfully copied configuration file.\n"); -#endif d->phase = SP_COPIED; /* fall-through */ case SP_COPIED: /* Start create hostkey process if we don't already know the peer identity! */ if (GNUNET_NO == d->have_hostkey) { - d->pipe_stdout = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO, GNUNET_YES); + GNUNET_assert (NULL == d->proc_arm_peerinfo); + d->pipe_stdout = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO, GNUNET_NO, GNUNET_YES); if (d->pipe_stdout == NULL) { cb = d->cb; d->cb = NULL; if (NULL != cb) - cb (d->cb_cls, - NULL, - d->cfg, - d, - (NULL == d->hostname) - ? _("Failed to create pipe for `gnunet-peerinfo' process.\n") - : _("Failed to create pipe for `ssh' process.\n")); + cb (d->cb_cls, NULL, d->cfg, d, + (NULL == + d->hostname) ? + _("Failed to create pipe for `gnunet-peerinfo' process.\n") : + _("Failed to create pipe for `ssh' process.\n")); return; } if (NULL == d->hostname) { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting `%s', with command `%s %s %s %s'.\n", "gnunet-peerinfo", "gnunet-peerinfo", "-c", d->cfgfile, "-sq"); -#endif - d->proc = - GNUNET_OS_start_process (NULL, d->pipe_stdout, "gnunet-peerinfo", - "gnunet-peerinfo", "-c", d->cfgfile, - "-sq", NULL); + d->proc_arm_peerinfo = + GNUNET_OS_start_process (GNUNET_YES, NULL, d->pipe_stdout, "gnunet-peerinfo", + "gnunet-peerinfo", "-c", d->cfgfile, "-sq", + NULL); GNUNET_DISK_pipe_close_end (d->pipe_stdout, GNUNET_DISK_PIPE_END_WRITE); } else @@ -380,37 +257,30 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) else dst = GNUNET_strdup (d->hostname); -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting `%s', with command `%s %s %s %s %s %s'.\n", "gnunet-peerinfo", "ssh", dst, "gnunet-peerinfo", "-c", d->cfgfile, "-sq"); -#endif if (d->ssh_port_str == NULL) { - d->proc = GNUNET_OS_start_process (NULL, d->pipe_stdout, "ssh", "ssh", -#if !DEBUG_TESTING + d->proc_arm_peerinfo = GNUNET_OS_start_process (GNUNET_NO, NULL, d->pipe_stdout, "ssh", "ssh", "-q", -#endif - dst, - "gnunet-peerinfo", - "-c", d->cfgfile, "-sq", NULL); + dst, "gnunet-peerinfo", "-c", + d->cfgfile, "-sq", NULL); } else { - d->proc = GNUNET_OS_start_process (NULL, d->pipe_stdout, "ssh", - "ssh", "-p", d->ssh_port_str, -#if !DEBUG_TESTING - "-q", -#endif - dst, - "gnunet-peerinfo", - "-c", d->cfgfile, "-sq", NULL); + d->proc_arm_peerinfo = + GNUNET_OS_start_process (GNUNET_NO, NULL, d->pipe_stdout, "ssh", "ssh", "-p", + d->ssh_port_str, + "-q", + dst, "gnunet-peerinfo", "-c", d->cfgfile, + "-sq", NULL); } GNUNET_DISK_pipe_close_end (d->pipe_stdout, GNUNET_DISK_PIPE_END_WRITE); GNUNET_free (dst); } - if (NULL == d->proc) + if (NULL == d->proc_arm_peerinfo) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Could not start `%s' process to create hostkey.\n"), @@ -418,23 +288,17 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) cb = d->cb; d->cb = NULL; if (NULL != cb) - cb (d->cb_cls, - NULL, - d->cfg, - d, - (NULL == d->hostname) - ? _("Failed to start `gnunet-peerinfo' process.\n") + cb (d->cb_cls, NULL, d->cfg, d, + (NULL == + d->hostname) ? _("Failed to start `gnunet-peerinfo' process.\n") : _("Failed to start `ssh' process.\n")); GNUNET_DISK_pipe_close (d->pipe_stdout); return; } -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Started `%s', waiting for hostkey.\n", "gnunet-peerinfo"); -#endif d->phase = SP_HOSTKEY_CREATE; - d->task - = + d->task = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_absolute_get_remaining (d->max_timeout), GNUNET_DISK_pipe_handle @@ -469,8 +333,7 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if ((d->hostkeybufpos < 104) && (bytes_read > 0)) { /* keep reading */ - d->task - = + d->task = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_absolute_get_remaining (d->max_timeout), GNUNET_DISK_pipe_handle @@ -482,8 +345,8 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) d->hostkeybuf[103] = '\0'; if ((bytes_read < 0) || - (GNUNET_OK != GNUNET_CRYPTO_hash_from_string (d->hostkeybuf, - &d->id.hashPubKey))) + (GNUNET_OK != + GNUNET_CRYPTO_hash_from_string (d->hostkeybuf, &d->id.hashPubKey))) { /* error */ if (bytes_read < 0) @@ -497,21 +360,21 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) d->cb = NULL; GNUNET_DISK_pipe_close (d->pipe_stdout); d->pipe_stdout = NULL; - (void) GNUNET_OS_process_kill (d->proc, SIGKILL); - GNUNET_break (GNUNET_OK == GNUNET_OS_process_wait (d->proc)); - GNUNET_OS_process_close (d->proc); - d->proc = NULL; + (void) GNUNET_OS_process_kill (d->proc_arm_peerinfo, SIGKILL); + GNUNET_break (GNUNET_OK == GNUNET_OS_process_wait (d->proc_arm_peerinfo)); + GNUNET_OS_process_destroy (d->proc_arm_peerinfo); + d->proc_arm_peerinfo = NULL; if (NULL != cb) - cb (d->cb_cls, NULL, d->cfg, d, _("`Failed to get hostkey!\n")); + cb (d->cb_cls, NULL, d->cfg, d, _("Failed to get hostkey!\n")); return; } d->shortname = GNUNET_strdup (GNUNET_i2s (&d->id)); GNUNET_DISK_pipe_close (d->pipe_stdout); d->pipe_stdout = NULL; - (void) GNUNET_OS_process_kill (d->proc, SIGKILL); - GNUNET_break (GNUNET_OK == GNUNET_OS_process_wait (d->proc)); - GNUNET_OS_process_close (d->proc); - d->proc = NULL; + (void) GNUNET_OS_process_kill (d->proc_arm_peerinfo, SIGKILL); + GNUNET_break (GNUNET_OK == GNUNET_OS_process_wait (d->proc_arm_peerinfo)); + GNUNET_OS_process_destroy (d->proc_arm_peerinfo); + d->proc_arm_peerinfo = NULL; d->have_hostkey = GNUNET_YES; if (d->hostkey_callback != NULL) { @@ -523,46 +386,40 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { d->phase = SP_TOPOLOGY_SETUP; } -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Successfully got hostkey!\n"); -#endif /* Fall through */ case SP_HOSTKEY_CREATED: /* wait for topology finished */ - if ((GNUNET_YES == d->dead) - || (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value == 0)) + if ((GNUNET_YES == d->dead) || + (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value == 0)) { cb = d->cb; d->cb = NULL; if (NULL != cb) - cb (d->cb_cls, - NULL, d->cfg, d, _("`Failed while waiting for topology setup!\n")); + cb (d->cb_cls, NULL, d->cfg, d, + _("`Failed while waiting for topology setup!\n")); return; } - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); + d->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, + d); break; case SP_TOPOLOGY_SETUP: /* Indicates topology setup has completed! */ /* start GNUnet on remote host */ if (NULL == d->hostname) { -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Starting `%s', with command `%s %s %s %s %s %s'.\n", - "gnunet-arm", "gnunet-arm", "-c", d->cfgfile, - "-L", "DEBUG", "-s"); -#endif - d->proc = GNUNET_OS_start_process (NULL, NULL, "gnunet-arm", - "gnunet-arm", "-c", d->cfgfile, -#if DEBUG_TESTING - "-L", "DEBUG", -#endif - "-s", "-q", "-T", - GNUNET_TIME_relative_to_string - (GNUNET_TIME_absolute_get_remaining - (d->max_timeout)), NULL); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Starting `%s', with command `%s %s %s %s'.\n", + "gnunet-arm", "gnunet-arm", "-c", d->cfgfile, + "-s"); + d->proc_arm_start = + GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-arm", "gnunet-arm", "-c", + d->cfgfile, + "-s", "-q", "-T", + GNUNET_TIME_relative_to_string + (GNUNET_TIME_absolute_get_remaining + (d->max_timeout)), NULL); } else { @@ -571,24 +428,16 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) else dst = GNUNET_strdup (d->hostname); -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Starting `%s', with command `%s %s %s %s %s %s %s %s'.\n", - "gnunet-arm", "ssh", dst, "gnunet-arm", "-c", - d->cfgfile, "-L", "DEBUG", "-s", "-q"); -#endif + "Starting `%s', with command `%s %s %s %s %s %s %s'.\n", + "gnunet-arm", "ssh", dst, "gnunet-arm", "-c", d->cfgfile, + "-s", "-q"); if (d->ssh_port_str == NULL) { - d->proc = GNUNET_OS_start_process (NULL, NULL, "ssh", "ssh", -#if !DEBUG_TESTING + d->proc_arm_start = GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "ssh", "ssh", "-q", -#endif dst, "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif - "-c", d->cfgfile, "-s", "-q", - "-T", + "-c", d->cfgfile, "-s", "-q", "-T", GNUNET_TIME_relative_to_string (GNUNET_TIME_absolute_get_remaining (d->max_timeout)), NULL); @@ -596,24 +445,19 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) else { - d->proc = GNUNET_OS_start_process (NULL, NULL, "ssh", - "ssh", "-p", d->ssh_port_str, -#if !DEBUG_TESTING - "-q", -#endif - dst, "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif - "-c", d->cfgfile, "-s", "-q", - "-T", - GNUNET_TIME_relative_to_string - (GNUNET_TIME_absolute_get_remaining - (d->max_timeout)), NULL); + d->proc_arm_start = + GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "ssh", "ssh", "-p", + d->ssh_port_str, + "-q", + dst, "gnunet-arm", + "-c", d->cfgfile, "-s", "-q", "-T", + GNUNET_TIME_relative_to_string + (GNUNET_TIME_absolute_get_remaining + (d->max_timeout)), NULL); } GNUNET_free (dst); } - if (NULL == d->proc) + if (NULL == d->proc_arm_start) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Could not start `%s' process to start GNUnet.\n"), @@ -621,96 +465,72 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) cb = d->cb; d->cb = NULL; if (NULL != cb) - cb (d->cb_cls, - NULL, - d->cfg, - d, - (NULL == d->hostname) - ? _("Failed to start `gnunet-arm' process.\n") - : _("Failed to start `ssh' process.\n")); + cb (d->cb_cls, NULL, d->cfg, d, + (NULL == + d->hostname) ? _("Failed to start `gnunet-arm' process.\n") : + _("Failed to start `ssh' process.\n")); return; } -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Started `%s', waiting for `%s' to be up.\n", - "gnunet-arm", "gnunet-service-core"); -#endif + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Started `%s', waiting for `%s' to be up.\n", "gnunet-arm", + "gnunet-service-core"); d->phase = SP_START_ARMING; - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); + d->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, + d); + // FIXME: busy wait? break; case SP_START_ARMING: - if (GNUNET_OK != GNUNET_OS_process_status (d->proc, &type, &code)) + if (GNUNET_OK != GNUNET_OS_process_status (d->proc_arm_start, &type, &code)) { if (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value == 0) { cb = d->cb; d->cb = NULL; if (NULL != cb) - cb (d->cb_cls, - NULL, - d->cfg, - d, - (NULL == d->hostname) - ? _("`gnunet-arm' does not seem to terminate.\n") - : _("`ssh' does not seem to terminate.\n")); - GNUNET_CONFIGURATION_destroy (d->cfg); - GNUNET_free (d->cfgfile); + cb (d->cb_cls, NULL, d->cfg, d, + (NULL == + d->hostname) ? _("`gnunet-arm' does not seem to terminate.\n") : + _("`ssh' does not seem to terminate.\n")); + if (d->cfg != NULL) + { + GNUNET_CONFIGURATION_destroy (d->cfg); + d->cfg = NULL; + } + if (d->cfgfile != NULL) + { + GNUNET_free (d->cfgfile); + d->cfgfile = NULL; + } GNUNET_free_non_null (d->hostname); GNUNET_free_non_null (d->username); - GNUNET_free (d->proc); - GNUNET_free (d); + GNUNET_OS_process_destroy (d->proc_arm_start); + d->proc_arm_start = NULL; + d->username = NULL; + d->hostname = NULL; // Quick hack to avoid crashing (testing need to be + d->cfg = NULL; // overhauled anyway, and the error managing is + // GNUNET_free (d); // FIXME (could this leak) + // pretty broken anyway. return; } /* wait some more */ - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); + d->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, + d); + // FIXME: busy wait? return; } -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Successfully started `%s'.\n", "gnunet-arm"); -#endif - GNUNET_free (d->proc); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Successfully started `%s'.\n", + "gnunet-arm"); + GNUNET_OS_process_destroy (d->proc_arm_start); + d->proc_arm_start = NULL; d->phase = SP_START_CORE; -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Calling CORE_connect\n"); -#endif + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Calling CORE_connect\n"); /* Fall through */ case SP_START_CORE: if (d->server != NULL) GNUNET_CORE_disconnect (d->server); -#if WAIT_FOR_HELLO - if (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value == 0) - { - cb = d->cb; - d->cb = NULL; - if (NULL != cb) - cb (d->cb_cls, - NULL, - d->cfg, d, _("Unable to connect to CORE service for peer!\n")); - GNUNET_CONFIGURATION_destroy (d->cfg); - GNUNET_free (d->cfgfile); - GNUNET_free_non_null (d->hostname); - GNUNET_free_non_null (d->username); - GNUNET_free (d); - return; - } - d->server = GNUNET_CORE_connect (d->cfg, 1, - d, - &testing_init, - NULL, NULL, NULL, - NULL, GNUNET_NO, - NULL, GNUNET_NO, no_handlers); - d->task - = - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply - (GNUNET_CONSTANTS_SERVICE_RETRY, 2), - &start_fsm, d); -#else d->th = GNUNET_TRANSPORT_connect (d->cfg, &d->id, d, NULL, NULL, NULL); if (d->th == NULL) { @@ -724,13 +544,11 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) _("Failed to connect to transport service!\n")); return; } -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connected to transport service `%s', getting HELLO\n", GNUNET_i2s (&d->id)); -#endif - - GNUNET_TRANSPORT_get_hello (d->th, &process_hello, d); + d->ghh = GNUNET_TRANSPORT_get_hello (d->th, &process_hello, d); + /* FIXME: store task ID somewhere! */ GNUNET_SCHEDULER_add_now (¬ify_daemon_started, d); /*cb = d->cb; * d->cb = NULL; @@ -738,7 +556,6 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) * cb (d->cb_cls, &d->id, d->cfg, d, NULL); */ d->running = GNUNET_YES; d->phase = SP_GET_HELLO; -#endif break; case SP_GET_HELLO: if (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value == 0) @@ -761,8 +578,7 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if (d->hello != NULL) return; GNUNET_assert (d->task == GNUNET_SCHEDULER_NO_TASK); - d->task - = + d->task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_CONSTANTS_SERVICE_RETRY, 2), &start_fsm, d); @@ -772,26 +588,23 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) break; case SP_SERVICE_START: /* confirm gnunet-arm exited */ - if (GNUNET_OK != GNUNET_OS_process_status (d->proc, &type, &code)) + if (GNUNET_OK != GNUNET_OS_process_status (d->proc_arm_srv_start, &type, &code)) { if (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value == 0) { cb = d->cb; d->cb = NULL; if (NULL != cb) - cb (d->cb_cls, - NULL, - d->cfg, - d, - (NULL == d->hostname) - ? _("`gnunet-arm' does not seem to terminate.\n") - : _("`ssh' does not seem to terminate.\n")); + cb (d->cb_cls, NULL, d->cfg, d, + (NULL == + d->hostname) ? _("`gnunet-arm' does not seem to terminate.\n") : + _("`ssh' does not seem to terminate.\n")); return; } /* wait some more */ - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); + d->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, + d); return; } #if EXTRA_CHECKS @@ -800,30 +613,27 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) cb = d->cb; d->cb = NULL; if (NULL != cb) - cb (d->cb_cls, - NULL, - d->cfg, - d, - (NULL == d->hostname) - ? + cb (d->cb_cls, NULL, d->cfg, d, + (NULL == + d->hostname) ? _ ("`gnunet-arm' terminated with non-zero exit status (or timed out)!\n") : _("`ssh' does not seem to terminate.\n")); return; } #endif -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Service startup complete!\n"); -#endif cb = d->cb; d->cb = NULL; d->phase = SP_START_DONE; if (NULL != cb) cb (d->cb_cls, &d->id, d->cfg, d, NULL); + GNUNET_OS_process_destroy (d->proc_arm_srv_start); + d->proc_arm_srv_start = NULL; break; case SP_SERVICE_SHUTDOWN_START: /* confirm copying complete */ - if (GNUNET_OK != GNUNET_OS_process_status (d->proc, &type, &code)) + if (GNUNET_OK != GNUNET_OS_process_status (d->proc_arm_srv_stop, &type, &code)) { if (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value == 0) { @@ -834,9 +644,9 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) return; } /* wait some more */ - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); + d->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, + d); return; } #if EXTRA_CHECKS @@ -849,15 +659,13 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) return; } #endif -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Service shutdown complete.\n"); -#endif if (NULL != d->dead_cb) d->dead_cb (d->dead_cb_cls, NULL); break; case SP_SHUTDOWN_START: - /* confirm copying complete */ - if (GNUNET_OK != GNUNET_OS_process_status (d->proc, &type, &code)) + /* confirm copying complete !??? */ + if (GNUNET_OK != GNUNET_OS_process_status (d->proc_arm_stop, &type, &code)) { if (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value == 0) { @@ -867,25 +675,34 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) ("either `gnunet-arm' or `ssh' does not seem to terminate.\n")); if (d->th != NULL) { - GNUNET_TRANSPORT_get_hello_cancel (d->th, &process_hello, d); + GNUNET_TRANSPORT_get_hello_cancel (d->ghh); + d->ghh = NULL; GNUNET_TRANSPORT_disconnect (d->th); d->th = NULL; } - GNUNET_CONFIGURATION_destroy (d->cfg); - GNUNET_free (d->cfgfile); + if (d->cfg != NULL) + { + GNUNET_CONFIGURATION_destroy (d->cfg); + d->cfg = NULL; + } + if (d->cfgfile != NULL) + { + GNUNET_free (d->cfgfile); + d->cfgfile = NULL; + } GNUNET_free_non_null (d->hello); GNUNET_free_non_null (d->hostname); GNUNET_free_non_null (d->username); GNUNET_free_non_null (d->shortname); - GNUNET_free_non_null (d->proc); - d->proc = NULL; + GNUNET_OS_process_destroy (d->proc_arm_stop); + d->proc_arm_stop = NULL; GNUNET_free (d); return; } /* wait some more */ - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); + d->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, + d); return; } if ((type != GNUNET_OS_PROCESS_EXITED) || (code != 0)) @@ -896,7 +713,8 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) ("shutdown (either `gnunet-arm' or `ssh') did not complete cleanly.\n")); if (d->th != NULL) { - GNUNET_TRANSPORT_get_hello_cancel (d->th, &process_hello, d); + GNUNET_TRANSPORT_get_hello_cancel (d->ghh); + d->ghh = NULL; GNUNET_TRANSPORT_disconnect (d->th); d->th = NULL; } @@ -906,19 +724,18 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) d->server = NULL; } GNUNET_CONFIGURATION_destroy (d->cfg); + d->cfg = NULL; GNUNET_free (d->cfgfile); GNUNET_free_non_null (d->hello); GNUNET_free_non_null (d->hostname); GNUNET_free_non_null (d->username); GNUNET_free_non_null (d->shortname); - GNUNET_free_non_null (d->proc); - d->proc = NULL; + GNUNET_OS_process_destroy (d->proc_arm_stop); + d->proc_arm_stop = NULL; GNUNET_free (d); return; } -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer shutdown complete.\n"); -#endif if (d->server != NULL) { GNUNET_CORE_disconnect (d->server); @@ -927,7 +744,8 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if (d->th != NULL) { - GNUNET_TRANSPORT_get_hello_cancel (d->th, &process_hello, d); + GNUNET_TRANSPORT_get_hello_cancel (d->ghh); + d->ghh = NULL; GNUNET_TRANSPORT_disconnect (d->th); d->th = NULL; } @@ -939,6 +757,7 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if (d->churn == GNUNET_NO) { GNUNET_CONFIGURATION_destroy (d->cfg); + d->cfg = NULL; GNUNET_free (d->cfgfile); GNUNET_free_non_null (d->hostname); GNUNET_free_non_null (d->username); @@ -947,8 +766,8 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_free_non_null (d->hello); d->hello = NULL; GNUNET_free_non_null (d->shortname); - GNUNET_free_non_null (d->proc); - d->proc = NULL; + GNUNET_OS_process_destroy (d->proc_arm_stop); + d->proc_arm_stop = NULL; d->shortname = NULL; if (d->churn == GNUNET_NO) GNUNET_free (d); @@ -956,21 +775,21 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) break; case SP_CONFIG_UPDATE: /* confirm copying complete */ - if (GNUNET_OK != GNUNET_OS_process_status (d->proc, &type, &code)) + if (GNUNET_OK != GNUNET_OS_process_status (d->proc_arm_copying, &type, &code)) { if (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value == 0) /* FIXME: config update should take timeout parameter! */ { cb = d->cb; d->cb = NULL; if (NULL != cb) - cb (d->cb_cls, - NULL, d->cfg, d, _("`scp' does not seem to terminate.\n")); + cb (d->cb_cls, NULL, d->cfg, d, + _("`scp' does not seem to terminate.\n")); return; } /* wait some more */ - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); + d->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, + d); return; } if ((type != GNUNET_OS_PROCESS_EXITED) || (code != 0)) @@ -979,10 +798,8 @@ start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) d->update_cb (d->update_cb_cls, _("`scp' did not complete cleanly.\n")); return; } -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Successfully copied configuration file.\n"); -#endif if (NULL != d->update_cb) d->update_cb (d->update_cb_cls, NULL); d->phase = SP_START_DONE; @@ -1013,7 +830,7 @@ GNUNET_TESTING_daemon_continue_startup (struct GNUNET_TESTING_Daemon *daemon) * daemon is down, GNUNET_SYSERR on error. */ int -GNUNET_TESTING_daemon_running (struct GNUNET_TESTING_Daemon *daemon) +GNUNET_TESTING_test_daemon_running (struct GNUNET_TESTING_Daemon *daemon) { if (daemon == NULL) return GNUNET_SYSERR; @@ -1067,25 +884,17 @@ GNUNET_TESTING_daemon_start_stopped_service (struct GNUNET_TESTING_Daemon *d, /* Check if this is a local or remote process */ if (NULL != d->hostname) { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting gnunet-arm with config `%s' on host `%s'.\n", d->cfgfile, d->hostname); -#endif - if (d->username != NULL) GNUNET_asprintf (&arg, "%s@%s", d->username, d->hostname); else arg = GNUNET_strdup (d->hostname); - d->proc = GNUNET_OS_start_process (NULL, NULL, "ssh", "ssh", -#if !DEBUG_TESTING + d->proc_arm_srv_start = GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "ssh", "ssh", "-q", -#endif arg, "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif "-c", d->cfgfile, "-i", service, "-q", "-T", GNUNET_TIME_relative_to_string (timeout), @@ -1097,14 +906,9 @@ GNUNET_TESTING_daemon_start_stopped_service (struct GNUNET_TESTING_Daemon *d, } else { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting gnunet-arm with config `%s' locally.\n", d->cfgfile); -#endif - d->proc = GNUNET_OS_start_process (NULL, NULL, "gnunet-arm", "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif + d->proc_arm_srv_start = GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-arm", "gnunet-arm", "-c", d->cfgfile, "-i", service, "-q", "-T", GNUNET_TIME_relative_to_string (timeout), @@ -1126,7 +930,7 @@ GNUNET_TESTING_daemon_start_stopped_service (struct GNUNET_TESTING_Daemon *d, */ void GNUNET_TESTING_daemon_start_service (struct GNUNET_TESTING_Daemon *d, - char *service, + const char *service, struct GNUNET_TIME_Relative timeout, GNUNET_TESTING_NotifyDaemonRunning cb, void *cb_cls) @@ -1140,36 +944,25 @@ GNUNET_TESTING_daemon_start_service (struct GNUNET_TESTING_Daemon *d, GNUNET_assert (d->running == GNUNET_YES); GNUNET_assert (d->phase == SP_START_DONE); -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Starting service %s for peer `%4s'\n"), service, GNUNET_i2s (&d->id)); -#endif - d->phase = SP_SERVICE_START; d->max_timeout = GNUNET_TIME_relative_to_absolute (timeout); /* Check if this is a local or remote process */ if (NULL != d->hostname) { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting gnunet-arm with config `%s' on host `%s'.\n", d->cfgfile, d->hostname); -#endif - if (d->username != NULL) GNUNET_asprintf (&arg, "%s@%s", d->username, d->hostname); else arg = GNUNET_strdup (d->hostname); - d->proc = GNUNET_OS_start_process (NULL, NULL, "ssh", "ssh", -#if !DEBUG_TESTING + d->proc_arm_srv_start = GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "ssh", "ssh", "-q", -#endif arg, "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif "-c", d->cfgfile, "-i", service, "-q", "-T", GNUNET_TIME_relative_to_string (timeout), @@ -1182,14 +975,9 @@ GNUNET_TESTING_daemon_start_service (struct GNUNET_TESTING_Daemon *d, } else { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting gnunet-arm with config `%s' locally.\n", d->cfgfile); -#endif - d->proc = GNUNET_OS_start_process (NULL, NULL, "gnunet-arm", "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif + d->proc_arm_srv_start = GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-arm", "gnunet-arm", "-c", d->cfgfile, "-i", service, "-q", "-T", GNUNET_TIME_relative_to_string (timeout), @@ -1230,9 +1018,8 @@ GNUNET_TESTING_daemon_start_stopped (struct GNUNET_TESTING_Daemon *daemon, daemon->cb_cls = cb_cls; daemon->phase = SP_TOPOLOGY_SETUP; daemon->max_timeout = GNUNET_TIME_relative_to_absolute (timeout); - - GNUNET_SCHEDULER_add_continuation (&start_fsm, - daemon, + /* FIXME: why add_continuation? */ + GNUNET_SCHEDULER_add_continuation (&start_fsm, daemon, GNUNET_SCHEDULER_REASON_PREREQ_DONE); } @@ -1261,12 +1048,9 @@ GNUNET_TESTING_daemon_start_stopped (struct GNUNET_TESTING_Daemon *daemon, */ struct GNUNET_TESTING_Daemon * GNUNET_TESTING_daemon_start (const struct GNUNET_CONFIGURATION_Handle *cfg, - struct GNUNET_TIME_Relative timeout, - int pretend, - const char *hostname, - const char *ssh_username, - uint16_t sshport, - const char *hostkey, + struct GNUNET_TIME_Relative timeout, int pretend, + const char *hostname, const char *ssh_username, + uint16_t sshport, const char *hostkey, GNUNET_TESTING_NotifyHostkeyCreated hostkey_callback, void *hostkey_cls, GNUNET_TESTING_NotifyDaemonRunning cb, @@ -1295,8 +1079,7 @@ GNUNET_TESTING_daemon_start (const struct GNUNET_CONFIGURATION_Handle *cfg, /* Find service home and base service home directories, create it if it doesn't exist */ GNUNET_assert (GNUNET_OK == - GNUNET_CONFIGURATION_get_value_string (cfg, - "PATHS", + GNUNET_CONFIGURATION_get_value_string (cfg, "PATHS", "SERVICEHOME", &servicehome)); @@ -1304,10 +1087,8 @@ GNUNET_TESTING_daemon_start (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_asprintf (&temp_file_name, "%s/gnunet-testing-config", servicehome); ret->cfgfile = GNUNET_DISK_mktemp (temp_file_name); GNUNET_free (temp_file_name); -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Setting up peer with configuration file `%s'.\n", ret->cfgfile); -#endif if (NULL == ret->cfgfile) { GNUNET_free_non_null (ret->ssh_port_str); @@ -1321,9 +1102,8 @@ GNUNET_TESTING_daemon_start (const struct GNUNET_CONFIGURATION_Handle *cfg, ret->cb_cls = cb_cls; ret->max_timeout = GNUNET_TIME_relative_to_absolute (timeout); ret->cfg = GNUNET_CONFIGURATION_dup (cfg); - GNUNET_CONFIGURATION_set_value_string (ret->cfg, - "PATHS", - "DEFAULTCONFIG", ret->cfgfile); + GNUNET_CONFIGURATION_set_value_string (ret->cfg, "PATHS", "DEFAULTCONFIG", + ret->cfgfile); if (hostkey != NULL) /* Get the peer identity from the hostkey */ { @@ -1344,8 +1124,8 @@ GNUNET_TESTING_daemon_start (const struct GNUNET_CONFIGURATION_Handle *cfg, { GNUNET_asprintf (&hostkeyfile, "%s/.hostkey", servicehome); fn = GNUNET_DISK_file_open (hostkeyfile, - GNUNET_DISK_OPEN_READWRITE - | GNUNET_DISK_OPEN_CREATE, + GNUNET_DISK_OPEN_READWRITE | + GNUNET_DISK_OPEN_CREATE, GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE); GNUNET_assert (fn != NULL); @@ -1358,8 +1138,8 @@ GNUNET_TESTING_daemon_start (const struct GNUNET_CONFIGURATION_Handle *cfg, if (GNUNET_OK != GNUNET_CONFIGURATION_write (ret->cfg, ret->cfgfile)) { if (0 != UNLINK (ret->cfgfile)) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, - "unlink", ret->cfgfile); + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", + ret->cfgfile); GNUNET_CONFIGURATION_destroy (ret->cfg); GNUNET_free_non_null (ret->hostname); GNUNET_free (ret->cfgfile); @@ -1368,11 +1148,10 @@ GNUNET_TESTING_daemon_start (const struct GNUNET_CONFIGURATION_Handle *cfg, } if (ssh_username != NULL) username = GNUNET_strdup (ssh_username); - if ((ssh_username == NULL) && (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_string (cfg, - "TESTING", - "USERNAME", - &username))) + if ((ssh_username == NULL) && + (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (cfg, "TESTING", "USERNAME", + &username))) { if (NULL != getenv ("USER")) username = GNUNET_strdup (getenv ("USER")); @@ -1386,10 +1165,8 @@ GNUNET_TESTING_daemon_start (const struct GNUNET_CONFIGURATION_Handle *cfg, /* copy directory to remote host */ if (NULL != hostname) { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Copying configuration directory to host `%s'.\n", hostname); -#endif baseservicehome = GNUNET_strdup (servicehome); /* Remove trailing /'s */ while (baseservicehome[strlen (baseservicehome) - 1] == '/') @@ -1407,65 +1184,57 @@ GNUNET_TESTING_daemon_start (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_free (baseservicehome); if (ret->ssh_port_str == NULL) { - ret->proc = GNUNET_OS_start_process (NULL, NULL, "scp", "scp", "-r", -#if !DEBUG_TESTING + ret->proc_arm_copying = GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "scp", "scp", "-r", "-q", -#endif servicehome, arg, NULL); -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "copying directory with command scp -r %s %s\n", servicehome, arg); -#endif } else { - ret->proc = GNUNET_OS_start_process (NULL, NULL, "scp", - "scp", "-r", "-P", - ret->ssh_port_str, -#if !DEBUG_TESTING - "-q", -#endif - servicehome, arg, NULL); + ret->proc_arm_copying = + GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "scp", "scp", "-r", "-P", + ret->ssh_port_str, + "-q", + servicehome, arg, NULL); } GNUNET_free (arg); - if (NULL == ret->proc) + if (NULL == ret->proc_arm_copying) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _ ("Could not start `%s' process to copy configuration directory.\n"), "scp"); if (0 != UNLINK (ret->cfgfile)) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, - "unlink", ret->cfgfile); + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", + ret->cfgfile); GNUNET_CONFIGURATION_destroy (ret->cfg); GNUNET_free_non_null (ret->hostname); GNUNET_free_non_null (ret->username); GNUNET_free (ret->cfgfile); GNUNET_free (ret); if ((hostkey != NULL) && (0 != UNLINK (hostkeyfile))) - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, - "unlink", hostkeyfile); + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", + hostkeyfile); GNUNET_free_non_null (hostkeyfile); GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (servicehome)); GNUNET_free (servicehome); return NULL; } - ret->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, ret); + ret->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, + ret); GNUNET_free_non_null (hostkeyfile); GNUNET_free (servicehome); return ret; } -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No need to copy configuration file since we are running locally.\n"); -#endif ret->phase = SP_COPIED; - GNUNET_SCHEDULER_add_continuation (&start_fsm, - ret, + /* FIXME: why add_cont? */ + GNUNET_SCHEDULER_add_continuation (&start_fsm, ret, GNUNET_SCHEDULER_REASON_PREREQ_DONE); } GNUNET_free_non_null (hostkeyfile); @@ -1512,42 +1281,32 @@ GNUNET_TESTING_daemon_restart (struct GNUNET_TESTING_Daemon *d, if (d->th != NULL) { - GNUNET_TRANSPORT_get_hello_cancel (d->th, &process_hello, d); + GNUNET_TRANSPORT_get_hello_cancel (d->ghh); + d->ghh = NULL; GNUNET_TRANSPORT_disconnect (d->th); d->th = NULL; } /* state clean up and notifications */ GNUNET_free_non_null (d->hello); -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - _("Terminating peer `%4s'\n"), GNUNET_i2s (&d->id)); -#endif - + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Terminating peer `%4s'\n"), + GNUNET_i2s (&d->id)); d->phase = SP_START_ARMING; /* Check if this is a local or remote process */ if (NULL != d->hostname) { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping gnunet-arm with config `%s' on host `%s'.\n", d->cfgfile, d->hostname); -#endif - if (d->username != NULL) GNUNET_asprintf (&arg, "%s@%s", d->username, d->hostname); else arg = GNUNET_strdup (d->hostname); - d->proc = GNUNET_OS_start_process (NULL, NULL, "ssh", "ssh", -#if !DEBUG_TESTING + d->proc_arm_stop = GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "ssh", "ssh", "-q", -#endif arg, "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif "-c", d->cfgfile, "-e", "-r", NULL); /* Use -r to restart arm and all services */ @@ -1555,21 +1314,15 @@ GNUNET_TESTING_daemon_restart (struct GNUNET_TESTING_Daemon *d, } else { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping gnunet-arm with config `%s' locally.\n", d->cfgfile); -#endif - d->proc = GNUNET_OS_start_process (NULL, NULL, "gnunet-arm", "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif + d->proc_arm_stop = GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-arm", "gnunet-arm", "-c", d->cfgfile, "-e", "-r", NULL); } GNUNET_free_non_null (del_arg); - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); + d->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, d); } @@ -1582,14 +1335,10 @@ GNUNET_TESTING_daemon_restart (struct GNUNET_TESTING_Daemon *d, * @param timeout how long to wait for process for shutdown to complete * @param cb function called once the daemon was stopped * @param cb_cls closure for cb - * @param delete_files GNUNET_YES to remove files, GNUNET_NO - * to leave them - * @param allow_restart GNUNET_YES to restart peer later (using this API) - * GNUNET_NO to kill off and clean up for good */ void GNUNET_TESTING_daemon_stop_service (struct GNUNET_TESTING_Daemon *d, - char *service, + const char *service, struct GNUNET_TIME_Relative timeout, GNUNET_TESTING_NotifyCompletion cb, void *cb_cls) @@ -1607,10 +1356,8 @@ GNUNET_TESTING_daemon_stop_service (struct GNUNET_TESTING_Daemon *d, d->phase = SP_START_DONE; } -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - _("Terminating peer `%4s'\n"), GNUNET_i2s (&d->id)); -#endif + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Terminating peer `%4s'\n"), + GNUNET_i2s (&d->id)); if (d->churned_services != NULL) { d->dead_cb (d->dead_cb_cls, "A service has already been turned off!!"); @@ -1622,25 +1369,17 @@ GNUNET_TESTING_daemon_stop_service (struct GNUNET_TESTING_Daemon *d, /* Check if this is a local or remote process */ if (NULL != d->hostname) { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping gnunet-arm with config `%s' on host `%s'.\n", d->cfgfile, d->hostname); -#endif - if (d->username != NULL) GNUNET_asprintf (&arg, "%s@%s", d->username, d->hostname); else arg = GNUNET_strdup (d->hostname); - - d->proc = GNUNET_OS_start_process (NULL, NULL, "ssh", "ssh", -#if !DEBUG_TESTING + + d->proc_arm_srv_stop = GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "ssh", "ssh", "-q", -#endif arg, "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif "-c", d->cfgfile, "-k", service, "-q", "-T", GNUNET_TIME_relative_to_string (timeout), @@ -1652,14 +1391,9 @@ GNUNET_TESTING_daemon_stop_service (struct GNUNET_TESTING_Daemon *d, } else { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping gnunet-arm with config `%s' locally.\n", d->cfgfile); -#endif - d->proc = GNUNET_OS_start_process (NULL, NULL, "gnunet-arm", "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif + d->proc_arm_srv_stop = GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-arm", "gnunet-arm", "-c", d->cfgfile, "-k", service, "-q", "-T", GNUNET_TIME_relative_to_string (timeout), @@ -1671,6 +1405,20 @@ GNUNET_TESTING_daemon_stop_service (struct GNUNET_TESTING_Daemon *d, } +/** + * Forcefully terminate a process and clean up the child. + * + * @param proc handle to process to kill + */ +static void +kill_and_close_process (struct GNUNET_OS_Process *proc) +{ + (void) GNUNET_OS_process_kill (proc, SIGKILL); + GNUNET_break (GNUNET_OK == GNUNET_OS_process_wait (proc)); + GNUNET_OS_process_destroy (proc); +} + + /** * Stops a GNUnet daemon. * @@ -1697,17 +1445,40 @@ GNUNET_TESTING_daemon_stop (struct GNUNET_TESTING_Daemon *d, if (NULL != d->cb) { -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - _("Setting d->dead on peer `%4s'\n"), GNUNET_i2s (&d->id)); -#endif + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Setting d->dead on peer `%4s'\n"), + GNUNET_i2s (&d->id)); d->dead = GNUNET_YES; return; } - - if ((d->running == GNUNET_NO) && (d->churn == GNUNET_YES)) /* Peer has already been stopped in churn context! */ + if (NULL != d->proc_arm_start) { - /* Free what was left from churning! */ + kill_and_close_process (d->proc_arm_start); + d->proc_arm_start = NULL; + } + if (NULL != d->proc_arm_srv_start) + { + kill_and_close_process (d->proc_arm_srv_start); + d->proc_arm_srv_start = NULL; + } + if (NULL != d->proc_arm_srv_stop) + { + kill_and_close_process (d->proc_arm_srv_stop); + d->proc_arm_srv_stop = NULL; + } + if (NULL != d->proc_arm_copying) + { + kill_and_close_process (d->proc_arm_copying); + d->proc_arm_copying = NULL; + } + if (NULL != d->proc_arm_peerinfo) + { + kill_and_close_process (d->proc_arm_peerinfo); + d->proc_arm_peerinfo = NULL; + } + if ((d->running == GNUNET_NO) && (d->churn == GNUNET_YES)) + { + /* Peer has already been stopped in churn context! + * Free what was left from churning! */ GNUNET_assert (d->cfg != NULL); GNUNET_CONFIGURATION_destroy (d->cfg); if (delete_files == GNUNET_YES) @@ -1722,6 +1493,10 @@ GNUNET_TESTING_daemon_stop (struct GNUNET_TESTING_Daemon *d, GNUNET_free_non_null (d->username); if (NULL != d->dead_cb) d->dead_cb (d->dead_cb_cls, NULL); + /* FIXME: this should be an assert and the test below + should not be required, but testing is broken... */ + GNUNET_break (NULL == d->proc_arm_stop); + if (NULL == d->proc_arm_stop) GNUNET_free (d); return; } @@ -1745,44 +1520,36 @@ GNUNET_TESTING_daemon_stop (struct GNUNET_TESTING_Daemon *d, } */ /* shutdown ARM process (will terminate others) */ -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - _("Terminating peer `%4s'\n"), GNUNET_i2s (&d->id)); -#endif + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Terminating peer `%4s'\n" , + GNUNET_i2s (&d->id)); d->phase = SP_SHUTDOWN_START; d->running = GNUNET_NO; if (allow_restart == GNUNET_YES) d->churn = GNUNET_YES; if (d->th != NULL) { - GNUNET_TRANSPORT_get_hello_cancel (d->th, &process_hello, d); + GNUNET_TRANSPORT_get_hello_cancel (d->ghh); + d->ghh = NULL; GNUNET_TRANSPORT_disconnect (d->th); d->th = NULL; } /* Check if this is a local or remote process */ + + if (NULL != d->hostname) { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping gnunet-arm with config `%s' on host `%s'.\n", d->cfgfile, d->hostname); -#endif - if (d->username != NULL) GNUNET_asprintf (&arg, "%s@%s", d->username, d->hostname); else arg = GNUNET_strdup (d->hostname); - d->proc = GNUNET_OS_start_process (NULL, NULL, "ssh", "ssh", -#if !DEBUG_TESTING + d->proc_arm_stop = GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "ssh", "ssh", "-q", -#endif arg, "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif - "-c", d->cfgfile, "-e", "-q", - "-T", + "-c", d->cfgfile, "-e", "-q", "-T", GNUNET_TIME_relative_to_string (timeout), del_arg, NULL); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -1793,22 +1560,19 @@ GNUNET_TESTING_daemon_stop (struct GNUNET_TESTING_Daemon *d, } else { -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping gnunet-arm with config `%s' locally.\n", d->cfgfile); -#endif - d->proc = GNUNET_OS_start_process (NULL, NULL, "gnunet-arm", "gnunet-arm", -#if DEBUG_TESTING - "-L", "DEBUG", -#endif - "-c", d->cfgfile, "-e", "-q", - "-T", + d->proc_arm_stop = GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "gnunet-arm", "gnunet-arm", + "-c", d->cfgfile, "-e", "-q", "-T", GNUNET_TIME_relative_to_string (timeout), del_arg, NULL); + GNUNET_assert (NULL != d->proc_arm_stop); } GNUNET_free_non_null (del_arg); d->max_timeout = GNUNET_TIME_relative_to_absolute (timeout); + if (GNUNET_SCHEDULER_NO_TASK != d->task) + GNUNET_SCHEDULER_cancel(d->task); d->task = GNUNET_SCHEDULER_add_now (&start_fsm, d); } @@ -1854,27 +1618,22 @@ GNUNET_TESTING_daemon_reconfigure (struct GNUNET_TESTING_Daemon *d, cb (cb_cls, NULL); return; } -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Copying updated configuration file to remote host `%s'.\n", d->hostname); -#endif d->phase = SP_CONFIG_UPDATE; if (NULL != d->username) GNUNET_asprintf (&arg, "%s@%s:%s", d->username, d->hostname, d->cfgfile); else GNUNET_asprintf (&arg, "%s:%s", d->hostname, d->cfgfile); - d->proc = GNUNET_OS_start_process (NULL, NULL, "scp", "scp", -#if !DEBUG_TESTING + d->proc_arm_copying = GNUNET_OS_start_process (GNUNET_NO, NULL, NULL, "scp", "scp", "-q", -#endif d->cfgfile, arg, NULL); GNUNET_free (arg); - if (NULL == d->proc) + if (NULL == d->proc_arm_copying) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ - ("Could not start `%s' process to copy configuration file.\n"), + _("Could not start `%s' process to copy configuration file.\n"), "scp"); if (NULL != cb) cb (cb_cls, _("Failed to copy new configuration to remote machine.")); @@ -1883,9 +1642,8 @@ GNUNET_TESTING_daemon_reconfigure (struct GNUNET_TESTING_Daemon *d, } d->update_cb = cb; d->update_cb_cls = cb_cls; - d->task - = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, - &start_fsm, d); + d->task = + GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT, &start_fsm, d); } @@ -1893,7 +1651,7 @@ GNUNET_TESTING_daemon_reconfigure (struct GNUNET_TESTING_Daemon *d, * Data kept for each pair of peers that we try * to connect. */ -struct ConnectContext +struct GNUNET_TESTING_ConnectContext { /** * Testing handle to the first daemon. @@ -1915,11 +1673,6 @@ struct ConnectContext */ struct GNUNET_TESTING_Daemon *d2; - /** - * Handler for the request to core to connect to this peer. - */ - struct GNUNET_CORE_PeerRequestHandle *connect_request_handle; - /** * Transport handle to the first daemon (to offer the HELLO of the second daemon to). */ @@ -1990,13 +1743,13 @@ reattempt_daemons_connect (void *cls, * Notify callback about success or failure of the attempt * to connect the two peers * - * @param cls our "struct ConnectContext" (freed) + * @param cls our "struct GNUNET_TESTING_ConnectContext" (freed) * @param tc reason tells us if we succeeded or failed */ static void notify_connect_result (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { - struct ConnectContext *ctx = cls; + struct GNUNET_TESTING_ConnectContext *ctx = cls; ctx->timeout_task = GNUNET_SCHEDULER_NO_TASK; if (ctx->hello_send_task != GNUNET_SCHEDULER_NO_TASK) @@ -2005,29 +1758,6 @@ notify_connect_result (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) ctx->hello_send_task = GNUNET_SCHEDULER_NO_TASK; } - if (ctx->connect_request_handle != NULL) - { - GNUNET_CORE_peer_request_connect_cancel (ctx->connect_request_handle); - ctx->connect_request_handle = NULL; - } - - if ((tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0) - { - if (ctx->d1th != NULL) - GNUNET_TRANSPORT_disconnect (ctx->d1th); - ctx->d1th = NULL; - if (ctx->d1core != NULL) - GNUNET_CORE_disconnect (ctx->d1core); -#if CONNECT_CORE2 - if (ctx->d2core != NULL) - GNUNET_CORE_disconnect (ctx->d2core); - ctx->d2core = NULL; -#endif - ctx->d1core = NULL; - GNUNET_free (ctx); - return; - } - if (ctx->d1th != NULL) GNUNET_TRANSPORT_disconnect (ctx->d1th); ctx->d1th = NULL; @@ -2035,28 +1765,25 @@ notify_connect_result (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_CORE_disconnect (ctx->d1core); ctx->d1core = NULL; + if ((tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0) + { + GNUNET_free (ctx); + return; + } + if (ctx->connected == GNUNET_YES) { if (ctx->cb != NULL) { - ctx->cb (ctx->cb_cls, - &ctx->d1->id, - &ctx->d2->id, - ctx->distance, + ctx->cb (ctx->cb_cls, &ctx->d1->id, &ctx->d2->id, ctx->distance, ctx->d1->cfg, ctx->d2->cfg, ctx->d1, ctx->d2, NULL); } } else if (ctx->connect_attempts > 0) { ctx->d1core_ready = GNUNET_NO; -#if CONNECT_CORE2 - if (ctx->d2core != NULL) - { - GNUNET_CORE_disconnect (ctx->d2core); - ctx->d2core = NULL; - } -#endif - GNUNET_SCHEDULER_add_now (&reattempt_daemons_connect, ctx); + ctx->timeout_task = + GNUNET_SCHEDULER_add_now (&reattempt_daemons_connect, ctx); return; } else @@ -2067,7 +1794,6 @@ notify_connect_result (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) ctx->d2->cfg, ctx->d1, ctx->d2, _("Peers failed to connect")); } } - GNUNET_free (ctx); } @@ -2075,119 +1801,66 @@ notify_connect_result (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) /** * Success, connection is up. Signal client our success. * - * @param cls our "struct ConnectContext" + * @param cls our "struct GNUNET_TESTING_ConnectContext" * @param peer identity of the peer that has connected * @param atsi performance information + * @param atsi_count number of records in 'atsi' * */ static void -connect_notify (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_TRANSPORT_ATS_Information *atsi) +connect_notify (void *cls, const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_ATS_Information *atsi, + unsigned int atsi_count) { - struct ConnectContext *ctx = cls; + struct GNUNET_TESTING_ConnectContext *ctx = cls; -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Connected peer %s to peer %s\n", + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connected peer %s to peer %s\n", ctx->d1->shortname, GNUNET_i2s (peer)); -#endif - - if (0 == memcmp (&ctx->d2->id, peer, sizeof (struct GNUNET_PeerIdentity))) - { - - ctx->connected = GNUNET_YES; - ctx->distance = 0; /* FIXME: distance */ - if (ctx->hello_send_task != GNUNET_SCHEDULER_NO_TASK) - { - GNUNET_SCHEDULER_cancel (ctx->hello_send_task); - ctx->hello_send_task = GNUNET_SCHEDULER_NO_TASK; - } - GNUNET_SCHEDULER_cancel (ctx->timeout_task); - ctx->timeout_task = GNUNET_SCHEDULER_add_now (¬ify_connect_result, ctx); - } -} - -#if CONNECT_CORE2 -/** - * Success, connection is up. Signal client our success. - * - * @param cls our "struct ConnectContext" - * @param peer identity of the peer that has connected - * @param atsi performance information - * - */ -static void -connect_notify_core2 (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_TRANSPORT_ATS_Information *atsi) -{ - struct ConnectContext *ctx = cls; - - if (memcmp (&ctx->d2->id, peer, sizeof (struct GNUNET_PeerIdentity)) == 0) + if (0 != memcmp (&ctx->d2->id, peer, sizeof (struct GNUNET_PeerIdentity))) + return; + ctx->connected = GNUNET_YES; + ctx->distance = 0; /* FIXME: distance */ + if (ctx->hello_send_task != GNUNET_SCHEDULER_NO_TASK) { - ctx->connected = GNUNET_YES; - ctx->distance = 0; /* FIXME: distance */ - GNUNET_SCHEDULER_cancel (ctx->timeout_task); - ctx->timeout_task = GNUNET_SCHEDULER_add_now (¬ify_connect_result, ctx); + GNUNET_SCHEDULER_cancel (ctx->hello_send_task); + ctx->hello_send_task = GNUNET_SCHEDULER_NO_TASK; } - + GNUNET_SCHEDULER_cancel (ctx->timeout_task); + ctx->timeout_task = GNUNET_SCHEDULER_add_now (¬ify_connect_result, ctx); } -#endif - -/** - * Task called once a core connect request has been transmitted. - * - * @param cls struct ConnectContext - * @param success was the request successful? - */ -void -core_connect_request_cont (void *cls, int success) -{ - struct ConnectContext *ctx = cls; - ctx->connect_request_handle = NULL; -} static void send_hello (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { - struct ConnectContext *ctx = cls; + struct GNUNET_TESTING_ConnectContext *ctx = cls; struct GNUNET_MessageHeader *hello; ctx->hello_send_task = GNUNET_SCHEDULER_NO_TASK; if ((tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0) return; - if ((ctx->d1core_ready == GNUNET_YES) && (ctx->d2->hello != NULL) - && (NULL != GNUNET_HELLO_get_header (ctx->d2->hello)) - && (ctx->d1->phase == SP_START_DONE) && (ctx->d2->phase == SP_START_DONE)) + if ((ctx->d1core_ready == GNUNET_YES) && (ctx->d2->hello != NULL) && + (NULL != GNUNET_HELLO_get_header (ctx->d2->hello)) && + (ctx->d1->phase == SP_START_DONE) && (ctx->d2->phase == SP_START_DONE)) { hello = GNUNET_HELLO_get_header (ctx->d2->hello); GNUNET_assert (hello != NULL); -#if DEBUG_TESTING GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Offering hello of %s to %s\n", ctx->d2->shortname, ctx->d1->shortname); -#endif GNUNET_TRANSPORT_offer_hello (ctx->d1th, hello, NULL, NULL); GNUNET_assert (ctx->d1core != NULL); - ctx->connect_request_handle = - GNUNET_CORE_peer_request_connect (ctx->d1core, - &ctx->d2->id, - &core_connect_request_cont, ctx); - -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Sending connect request to CORE of %s for peer %s\n", + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Sending connect request to TRANSPORT of %s for peer %s\n", GNUNET_i2s (&ctx->d1->id), GNUNET_h2s (&ctx->d2->id.hashPubKey)); -#endif + GNUNET_TRANSPORT_try_connect (ctx->d1th, &ctx->d2->id); ctx->timeout_hello = GNUNET_TIME_relative_add (ctx->timeout_hello, GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 500)); } - ctx->hello_send_task = GNUNET_SCHEDULER_add_delayed (ctx->timeout_hello, - &send_hello, ctx); + ctx->hello_send_task = + GNUNET_SCHEDULER_add_delayed (ctx->timeout_hello, &send_hello, ctx); } /** @@ -2196,62 +1869,51 @@ send_hello (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) * @param cls a ConnectContext * @param server handle to the core service * @param my_identity the peer identity of this peer - * @param publicKey the public key of the peer */ void -core_init_notify (void *cls, - struct GNUNET_CORE_Handle *server, - const struct GNUNET_PeerIdentity *my_identity, - const struct - GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *publicKey) +core_init_notify (void *cls, struct GNUNET_CORE_Handle *server, + const struct GNUNET_PeerIdentity *my_identity) { - struct ConnectContext *connect_ctx = cls; + struct GNUNET_TESTING_ConnectContext *connect_ctx = cls; connect_ctx->d1core_ready = GNUNET_YES; if (connect_ctx->send_hello == GNUNET_NO) { - connect_ctx->connect_request_handle = - GNUNET_CORE_peer_request_connect (connect_ctx->d1core, - &connect_ctx->d2->id, - &core_connect_request_cont, - connect_ctx); - GNUNET_assert (connect_ctx->connect_request_handle != NULL); -#if DEBUG_TESTING + GNUNET_TRANSPORT_try_connect (connect_ctx->d1th, &connect_ctx->d2->id); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending connect request to CORE of %s for peer %s\n", + "Sending connect request to TRANSPORT of %s for peer %s\n", connect_ctx->d1->shortname, connect_ctx->d2->shortname); -#endif } - } +/** + * Try to connect again some peers that failed in an earlier attempt. This will + * be tried as many times as connection_attempts in the configuration file. + * + * @param cls Closure (connection context between the two peers). + * @param tc TaskContext. + */ static void reattempt_daemons_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { - struct ConnectContext *ctx = cls; + struct GNUNET_TESTING_ConnectContext *ctx = cls; + ctx->timeout_task = GNUNET_SCHEDULER_NO_TASK; if ((tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0) - { - GNUNET_free (ctx); return; - } -#if DEBUG_TESTING_RECONNECT - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "re-attempting connect of peer %s to peer %s\n", ctx->d1->shortname, ctx->d2->shortname); -#endif ctx->connect_attempts--; GNUNET_assert (ctx->d1core == NULL); ctx->d1core_ready = GNUNET_NO; - ctx->d1core = GNUNET_CORE_connect (ctx->d1->cfg, 1, - ctx, - &core_init_notify, - &connect_notify, NULL, NULL, - NULL, GNUNET_NO, - NULL, GNUNET_NO, no_handlers); + ctx->d1core = + GNUNET_CORE_connect (ctx->d1->cfg, 1, ctx, &core_init_notify, + &connect_notify, NULL, NULL, GNUNET_NO, NULL, + GNUNET_NO, no_handlers); if (ctx->d1core == NULL) { if (NULL != ctx->cb) @@ -2265,26 +1927,38 @@ reattempt_daemons_connect (void *cls, /* Don't know reason for initial connect failure, update the HELLO for the second peer */ if (NULL != ctx->d2->hello) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "updating %s's HELLO\n", + ctx->d2->shortname); GNUNET_free (ctx->d2->hello); ctx->d2->hello = NULL; if (NULL != ctx->d2->th) { - GNUNET_TRANSPORT_get_hello_cancel (ctx->d2->th, &process_hello, ctx->d2); + GNUNET_TRANSPORT_get_hello_cancel (ctx->d2->ghh); + ctx->d2->ghh = NULL; GNUNET_TRANSPORT_disconnect (ctx->d2->th); } ctx->d2->th = GNUNET_TRANSPORT_connect (ctx->d2->cfg, &ctx->d2->id, NULL, NULL, NULL, NULL); GNUNET_assert (ctx->d2->th != NULL); - GNUNET_TRANSPORT_get_hello (ctx->d2->th, &process_hello, ctx->d2); + ctx->d2->ghh = + GNUNET_TRANSPORT_get_hello (ctx->d2->th, &process_hello, ctx->d2); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "didn't have %s's HELLO\n", + ctx->d2->shortname); } if ((NULL == ctx->d2->hello) && (ctx->d2->th == NULL)) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "didn't have %s's HELLO, trying to get it now\n", + ctx->d2->shortname); ctx->d2->th = GNUNET_TRANSPORT_connect (ctx->d2->cfg, &ctx->d2->id, NULL, NULL, NULL, NULL); - if (ctx->d2->th == NULL) + if (NULL == ctx->d2->th) { GNUNET_CORE_disconnect (ctx->d1core); GNUNET_free (ctx); @@ -2294,14 +1968,26 @@ reattempt_daemons_connect (void *cls, _("Failed to connect to transport service!\n")); return; } - GNUNET_TRANSPORT_get_hello (ctx->d2->th, &process_hello, ctx->d2); + ctx->d2->ghh = + GNUNET_TRANSPORT_get_hello (ctx->d2->th, &process_hello, ctx->d2); + } + else + { + if (NULL == ctx->d2->hello) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "didn't have %s's HELLO but th wasn't NULL, not trying!!\n", + ctx->d2->shortname); + } } if (ctx->send_hello == GNUNET_YES) { - ctx->d1th = GNUNET_TRANSPORT_connect (ctx->d1->cfg, - &ctx->d1->id, - ctx->d1, NULL, NULL, NULL); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending %s's HELLO to %s\n", + ctx->d1->shortname, ctx->d2->shortname); + ctx->d1th = + GNUNET_TRANSPORT_connect (ctx->d1->cfg, &ctx->d1->id, ctx->d1, NULL, + NULL, NULL); if (ctx->d1th == NULL) { GNUNET_CORE_disconnect (ctx->d1core); @@ -2312,14 +1998,14 @@ reattempt_daemons_connect (void *cls, _("Failed to connect to transport service!\n")); return; } + GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == ctx->hello_send_task); ctx->hello_send_task = GNUNET_SCHEDULER_add_now (&send_hello, ctx); } else { - ctx->connect_request_handle = - GNUNET_CORE_peer_request_connect (ctx->d1core, - &ctx->d2->id, - &core_connect_request_cont, ctx); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Trying to reconnect %s to %s\n", + ctx->d1->shortname, ctx->d2->shortname); + GNUNET_TRANSPORT_try_connect (ctx->d1th, &ctx->d2->id); } ctx->timeout_task = GNUNET_SCHEDULER_add_delayed (ctx->relative_timeout, @@ -2331,18 +2017,19 @@ reattempt_daemons_connect (void *cls, * that we don't try to send duplicate connect * requests to core. * - * @param cls our "struct ConnectContext" + * @param cls our "struct GNUNET_TESTING_ConnectContext" * @param peer identity of the peer that has connected, * NULL when iteration has finished * @param atsi performance information + * @param atsi_count number of records in 'atsi' * */ static void -core_initial_iteration (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_TRANSPORT_ATS_Information *atsi) +core_initial_iteration (void *cls, const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_ATS_Information *atsi, + unsigned int atsi_count) { - struct ConnectContext *ctx = cls; + struct GNUNET_TESTING_ConnectContext *ctx = cls; if ((peer != NULL) && (0 == memcmp (&ctx->d2->id, peer, sizeof (struct GNUNET_PeerIdentity)))) @@ -2351,85 +2038,82 @@ core_initial_iteration (void *cls, ctx->distance = 0; /* FIXME: distance */ return; } - else if (peer == NULL) /* End of iteration over peers */ + if (peer != NULL) + return; /* ignore other peers */ + /* peer == NULL: End of iteration over peers */ + + GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == ctx->timeout_task); + if (ctx->connected == GNUNET_YES) { - if (ctx->connected == GNUNET_YES) - { - ctx->timeout_task = GNUNET_SCHEDULER_add_now (¬ify_connect_result, - ctx); - return; - } + ctx->timeout_task = GNUNET_SCHEDULER_add_now (¬ify_connect_result, ctx); + return; + } - /* Peer not already connected, need to schedule connect request! */ - if (ctx->d1core == NULL) - { -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Peers are NOT connected, connecting to core!\n"); -#endif - ctx->d1core = GNUNET_CORE_connect (ctx->d1->cfg, 1, - ctx, - &core_init_notify, - &connect_notify, NULL, NULL, - NULL, GNUNET_NO, - NULL, GNUNET_NO, no_handlers); - } + /* Peer not already connected, need to schedule connect request! */ + if (ctx->d1core == NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Peers are NOT connected, connecting to core!\n"); + ctx->d1core = + GNUNET_CORE_connect (ctx->d1->cfg, 1, ctx, &core_init_notify, + &connect_notify, NULL, NULL, GNUNET_NO, NULL, + GNUNET_NO, no_handlers); + } - if (ctx->d1core == NULL) + if (ctx->d1core == NULL) + { + ctx->timeout_task = GNUNET_SCHEDULER_add_now (¬ify_connect_result, ctx); + return; + } + + if ((NULL == ctx->d2->hello) && (ctx->d2->th == NULL)) /* Do not yet have the second peer's hello, set up a task to get it */ + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Don't have d2's HELLO, trying to get it!\n"); + ctx->d2->th = + GNUNET_TRANSPORT_connect (ctx->d2->cfg, &ctx->d2->id, NULL, NULL, NULL, + NULL); + if (ctx->d2->th == NULL) { - GNUNET_free (ctx); - if (NULL != ctx->cb) - ctx->cb (ctx->cb_cls, &ctx->d1->id, &ctx->d2->id, 0, ctx->d1->cfg, - ctx->d2->cfg, ctx->d1, ctx->d2, - _("Failed to connect to core service of first peer!\n")); + GNUNET_CORE_disconnect (ctx->d1core); + ctx->d1core = NULL; + ctx->timeout_task = + GNUNET_SCHEDULER_add_now (¬ify_connect_result, ctx); return; } + ctx->d2->ghh = + GNUNET_TRANSPORT_get_hello (ctx->d2->th, &process_hello, ctx->d2); + } - if ((NULL == ctx->d2->hello) && (ctx->d2->th == NULL)) /* Do not yet have the second peer's hello, set up a task to get it */ + if (ctx->send_hello == GNUNET_YES) + { + ctx->d1th = + GNUNET_TRANSPORT_connect (ctx->d1->cfg, &ctx->d1->id, ctx->d1, NULL, + NULL, NULL); + if (ctx->d1th == NULL) { - ctx->d2->th = - GNUNET_TRANSPORT_connect (ctx->d2->cfg, &ctx->d2->id, NULL, NULL, - NULL, NULL); - if (ctx->d2->th == NULL) - { - GNUNET_CORE_disconnect (ctx->d1core); - GNUNET_free (ctx); - if (NULL != ctx->cb) - ctx->cb (ctx->cb_cls, &ctx->d1->id, &ctx->d2->id, 0, ctx->d1->cfg, - ctx->d2->cfg, ctx->d1, ctx->d2, - _("Failed to connect to transport service!\n")); - return; - } - GNUNET_TRANSPORT_get_hello (ctx->d2->th, &process_hello, ctx->d2); + GNUNET_CORE_disconnect (ctx->d1core); + ctx->d1core = NULL; + ctx->timeout_task = + GNUNET_SCHEDULER_add_now (¬ify_connect_result, ctx); + return; } + GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == ctx->hello_send_task); + ctx->hello_send_task = GNUNET_SCHEDULER_add_now (&send_hello, ctx); + } - if (ctx->send_hello == GNUNET_YES) - { - ctx->d1th = GNUNET_TRANSPORT_connect (ctx->d1->cfg, - &ctx->d1->id, ctx->d1, NULL, NULL, - NULL); - if (ctx->d1th == NULL) - { - GNUNET_CORE_disconnect (ctx->d1core); - GNUNET_free (ctx); - if (NULL != ctx->cb) - ctx->cb (ctx->cb_cls, &ctx->d1->id, &ctx->d2->id, 0, ctx->d1->cfg, - ctx->d2->cfg, ctx->d1, ctx->d2, - _("Failed to connect to transport service!\n")); - return; - } - ctx->hello_send_task = GNUNET_SCHEDULER_add_now (&send_hello, ctx); - } + ctx->timeout_task = + GNUNET_SCHEDULER_add_delayed (ctx->relative_timeout, + ¬ify_connect_result, ctx); - ctx->timeout_task = - GNUNET_SCHEDULER_add_delayed (ctx->relative_timeout, - ¬ify_connect_result, ctx); - } } /** - * Establish a connection between two GNUnet daemons. + * Establish a connection between two GNUnet daemons. The daemons + * must both be running and not be stopped until either the + * 'cb' callback is called OR the connection request has been + * explicitly cancelled. * * @param d1 handle for the first daemon * @param d2 handle for the second daemon @@ -2441,8 +2125,9 @@ core_initial_iteration (void *cls, * the HELLO has already been exchanged * @param cb function to call at the end * @param cb_cls closure for cb + * @return handle to cancel the request */ -void +struct GNUNET_TESTING_ConnectContext * GNUNET_TESTING_daemons_connect (struct GNUNET_TESTING_Daemon *d1, struct GNUNET_TESTING_Daemon *d2, struct GNUNET_TIME_Relative timeout, @@ -2451,7 +2136,7 @@ GNUNET_TESTING_daemons_connect (struct GNUNET_TESTING_Daemon *d1, GNUNET_TESTING_NotifyConnection cb, void *cb_cls) { - struct ConnectContext *ctx; + struct GNUNET_TESTING_ConnectContext *ctx; if ((d1->running == GNUNET_NO) || (d2->running == GNUNET_NO)) { @@ -2459,10 +2144,10 @@ GNUNET_TESTING_daemons_connect (struct GNUNET_TESTING_Daemon *d1, cb (cb_cls, &d1->id, &d2->id, 0, d1->cfg, d2->cfg, d1, d2, _("Peers are not fully running yet, can not connect!\n")); GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Peers are not up!\n"); - return; + return NULL; } - ctx = GNUNET_malloc (sizeof (struct ConnectContext)); + ctx = GNUNET_malloc (sizeof (struct GNUNET_TESTING_ConnectContext)); ctx->d1 = d1; ctx->d2 = d2; ctx->timeout_hello = @@ -2474,17 +2159,46 @@ GNUNET_TESTING_daemons_connect (struct GNUNET_TESTING_Daemon *d1, ctx->connect_attempts = max_connect_attempts; ctx->connected = GNUNET_NO; ctx->send_hello = send_hello; -#if DEBUG_TESTING - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Asked to connect peer %s to peer %s\n", + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Asked to connect peer %s to peer %s\n", d1->shortname, d2->shortname); -#endif - /* Core is up! Iterate over all _known_ peers first to check if we are already connected to the peer! */ - GNUNET_assert (GNUNET_OK == + GNUNET_assert (NULL != GNUNET_CORE_is_peer_connected (ctx->d1->cfg, &ctx->d2->id, &core_initial_iteration, ctx)); - /*GNUNET_assert(GNUNET_OK == GNUNET_CORE_iterate_peers (ctx->d1->cfg, &core_initial_iteration, ctx)); */ + return ctx; } + +/** + * Cancel an attempt to connect two daemons. + * + * @param cc connect context + */ +void +GNUNET_TESTING_daemons_connect_cancel (struct GNUNET_TESTING_ConnectContext *cc) +{ + if (GNUNET_SCHEDULER_NO_TASK != cc->timeout_task) + { + GNUNET_SCHEDULER_cancel (cc->timeout_task); + cc->timeout_task = GNUNET_SCHEDULER_NO_TASK; + } + if (GNUNET_SCHEDULER_NO_TASK != cc->hello_send_task) + { + GNUNET_SCHEDULER_cancel (cc->hello_send_task); + cc->hello_send_task = GNUNET_SCHEDULER_NO_TASK; + } + if (NULL != cc->d1core) + { + GNUNET_CORE_disconnect (cc->d1core); + cc->d1core = NULL; + } + if (NULL != cc->d1th) + { + GNUNET_TRANSPORT_disconnect (cc->d1th); + cc->d1th = NULL; + } + GNUNET_free (cc); +} + + /* end of testing.c */