-/**
- * Finite-state machine for starting GNUnet.
- *
- * @param cls our "struct GNUNET_TESTING_Daemon"
- * @param tc unused
- */
-static void
-start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
-{
- struct GNUNET_TESTING_Daemon *d = cls;
- GNUNET_TESTING_NotifyDaemonRunning cb;
- enum GNUNET_OS_ProcessStatusType type;
- unsigned long code;
- char *dst;
- int bytes_read;
-
-#if DEBUG_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peer FSM is in phase %u.\n", d->phase);
-#endif
-
- 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_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,
- _
- ("`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);
- return;
- }
- if ((type != GNUNET_OS_PROCESS_EXITED) || (code != 0))
- {
- cb = d->cb;
- d->cb = NULL;
- if (NULL != cb)
- 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_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);
- 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"));
- 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);
- GNUNET_DISK_pipe_close_end (d->pipe_stdout,
- GNUNET_DISK_PIPE_END_WRITE);
- }
- else
- {
- if (d->username != NULL)
- GNUNET_asprintf (&dst, "%s@%s", d->username, d->hostname);
- 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
- "-q",
- #endif
- 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);
- }
- GNUNET_DISK_pipe_close_end (d->pipe_stdout,
- GNUNET_DISK_PIPE_END_WRITE);
- GNUNET_free (dst);
- }
- if (NULL == d->proc)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Could not start `%s' process to create hostkey.\n"),
- (NULL == d->hostname) ? "gnunet-peerinfo" : "ssh");
- 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")
- : _("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
- =
- GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_absolute_get_remaining
- (d->max_timeout),
- GNUNET_DISK_pipe_handle
- (d->pipe_stdout,
- GNUNET_DISK_PIPE_END_READ),
- &start_fsm, d);
- }
- else /* Already have a hostkey! */
- {
- if (d->hostkey_callback != NULL)
- {
- d->hostkey_callback (d->hostkey_cls, &d->id, d, NULL);
- d->hostkey_callback = NULL;
- d->phase = SP_HOSTKEY_CREATED;
- }
- else
- d->phase = SP_TOPOLOGY_SETUP;
-
- /* wait some more */
- d->task
- = GNUNET_SCHEDULER_add_now (&start_fsm, d);
- }
- break;
- case SP_HOSTKEY_CREATE:
- bytes_read =
- GNUNET_DISK_file_read (GNUNET_DISK_pipe_handle
- (d->pipe_stdout, GNUNET_DISK_PIPE_END_READ),
- &d->hostkeybuf[d->hostkeybufpos],
- sizeof (d->hostkeybuf) - d->hostkeybufpos);
- if (bytes_read > 0)
- d->hostkeybufpos += bytes_read;
-
- if ((d->hostkeybufpos < 104) && (bytes_read > 0))
- {
- /* keep reading */
- d->task
- =
- GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_absolute_get_remaining
- (d->max_timeout),
- GNUNET_DISK_pipe_handle
- (d->pipe_stdout,
- GNUNET_DISK_PIPE_END_READ),
- &start_fsm, d);
- return;
- }
- d->hostkeybuf[103] = '\0';
-
- if ((bytes_read < 0) ||
- (GNUNET_OK != GNUNET_CRYPTO_hash_from_string (d->hostkeybuf,
- &d->id.hashPubKey)))
- {
- /* error */
- if (bytes_read < 0)
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _("Error reading from gnunet-peerinfo: %s\n"),
- STRERROR (errno));
- else
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _("Malformed output from gnunet-peerinfo!\n"));
- cb = d->cb;
- 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;
- if (NULL != cb)
- 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;
- d->have_hostkey = GNUNET_YES;
- if (d->hostkey_callback != NULL)
- {
- d->hostkey_callback (d->hostkey_cls, &d->id, d, NULL);
- d->hostkey_callback = NULL;
- d->phase = SP_HOSTKEY_CREATED;
- }
- else
- {
- 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))
- {
- cb = d->cb;
- d->cb = NULL;
- if (NULL != cb)
- 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);
- 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", NULL);
- }
- else
- {
- if (d->username != NULL)
- GNUNET_asprintf (&dst, "%s@%s", d->username, d->hostname);
- 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
- if (d->ssh_port_str == NULL)
- {
- d->proc = GNUNET_OS_start_process (NULL, NULL, "ssh", "ssh",
-#if !DEBUG_TESTING
- "-q",
-#endif
- dst, "gnunet-arm",
-#if DEBUG_TESTING
- "-L", "DEBUG",
-#endif
- "-c", d->cfgfile, "-s", "-q",
- NULL);
- }
- 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",
- NULL);
- }
- GNUNET_free (dst);
- }
- if (NULL == d->proc)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Could not start `%s' process to start GNUnet.\n"),
- (NULL == d->hostname) ? "gnunet-arm" : "ssh");
- 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"));
- 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
- d->phase = SP_START_ARMING;
- d->task
- = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT,
- &start_fsm, d);
- break;
- case SP_START_ARMING:
- if (GNUNET_OK != GNUNET_OS_process_status (d->proc, &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);
- GNUNET_free_non_null (d->hostname);
- GNUNET_free_non_null (d->username);
- GNUNET_free(d->proc);
- GNUNET_free(d);
- return;
- }
- /* wait some more */
- d->task
- = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT,
- &start_fsm, d);
- return;
- }
-#if DEBUG_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Successfully started `%s'.\n", "gnunet-arm");
-#endif
- GNUNET_free(d->proc);
- d->phase = SP_START_CORE;
-#if DEBUG_TESTING
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Calling CORE_connect\n");
-#endif
- /* 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)
- {
- 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 (&d->id));
-#endif
-
- GNUNET_TRANSPORT_get_hello (d->th, &process_hello, d);
- GNUNET_SCHEDULER_add_now (¬ify_daemon_started, d);
- /*cb = d->cb;
- d->cb = NULL;
- if (NULL != cb)
- 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)
- {
- if (d->server != NULL)
- GNUNET_CORE_disconnect(d->server);
- if (d->th != NULL)
- GNUNET_TRANSPORT_disconnect(d->th);
- cb = d->cb;
- d->cb = NULL;
- if (NULL != cb)
- cb (d->cb_cls,
- NULL,
- d->cfg,
- d,
- _("Unable to get HELLO 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;
- }
- if (d->hello != NULL)
- return;
- GNUNET_assert(d->task == GNUNET_SCHEDULER_NO_TASK);
- d->task
- = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(GNUNET_CONSTANTS_SERVICE_RETRY, 2),
- &start_fsm, d);
- break;
- case SP_START_DONE:
- GNUNET_break (0);
- break;
- case SP_SERVICE_START:
- /* confirm gnunet-arm exited */
- if (GNUNET_OK != GNUNET_OS_process_status (d->proc, &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"));
- return;
- }
- /* wait some more */
- d->task
- = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT,
- &start_fsm, d);
- return;
- }
- if ((type != GNUNET_OS_PROCESS_EXITED) || (code != 0))
- {
- cb = d->cb;
- d->cb = NULL;
- if (NULL != cb)
- 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;
- }
-#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);
- break;
- case SP_SERVICE_SHUTDOWN_START:
- /* confirm copying complete */
- if (GNUNET_OK != GNUNET_OS_process_status (d->proc, &type, &code))
- {
- if (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value ==
- 0)
- {
- if (NULL != d->dead_cb)
- d->dead_cb (d->dead_cb_cls,
- _
- ("either `gnunet-arm' or `ssh' does not seem to terminate.\n"));
- return;
- }
- /* wait some more */
- d->task
- = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT,
- &start_fsm, d);
- return;
- }
- if ((type != GNUNET_OS_PROCESS_EXITED) || (code != 0))
- {
- if (NULL != d->dead_cb)
- d->dead_cb (d->dead_cb_cls,
- _
- ("shutdown (either `gnunet-arm' or `ssh') did not complete cleanly.\n"));
- return;
- }
-#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))
- {
- if (GNUNET_TIME_absolute_get_remaining (d->max_timeout).rel_value ==
- 0)
- {
- if (NULL != d->dead_cb)
- d->dead_cb (d->dead_cb_cls,
- _
- ("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_disconnect (d->th);
- d->th = NULL;
- }
- GNUNET_CONFIGURATION_destroy (d->cfg);
- 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_free (d);
- return;
- }
- /* wait some more */
- d->task
- = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT,
- &start_fsm, d);
- return;
- }
- if ((type != GNUNET_OS_PROCESS_EXITED) || (code != 0))
- {
- if (NULL != d->dead_cb)
- d->dead_cb (d->dead_cb_cls,
- _
- ("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_disconnect (d->th);
- d->th = NULL;
- }
- if (d->server != NULL)
- {
- GNUNET_CORE_disconnect (d->server);
- d->server = NULL;
- }
- GNUNET_CONFIGURATION_destroy (d->cfg);
- 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_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);
- d->server = NULL;
- }
-
- if (d->th != NULL)
- {
- GNUNET_TRANSPORT_get_hello_cancel (d->th, &process_hello, d);
- GNUNET_TRANSPORT_disconnect (d->th);
- d->th = NULL;
- }
-
- if (NULL != d->dead_cb)
- d->dead_cb (d->dead_cb_cls, NULL);
-
- /* state clean up and notifications */
- if (d->churn == GNUNET_NO)
- {
- GNUNET_CONFIGURATION_destroy (d->cfg);
- GNUNET_free (d->cfgfile);
- GNUNET_free_non_null (d->hostname);
- GNUNET_free_non_null (d->username);
- }
-
- GNUNET_free_non_null (d->hello);
- d->hello = NULL;
- GNUNET_free_non_null (d->shortname);
- GNUNET_free_non_null (d->proc);
- d->proc = NULL;
- d->shortname = NULL;
- if (d->churn == GNUNET_NO)
- GNUNET_free (d);
-
- break;
- case SP_CONFIG_UPDATE:
- /* confirm copying complete */
- if (GNUNET_OK != GNUNET_OS_process_status (d->proc, &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"));
- return;
- }
- /* wait some more */
- d->task
- = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_EXEC_WAIT,
- &start_fsm, d);
- return;
- }
- if ((type != GNUNET_OS_PROCESS_EXITED) || (code != 0))
- {
- if (NULL != d->update_cb)
- 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;
- break;
- }
-}