+/**
+* Restart the given peer
+* @param tth testing handle
+* @param p the peer
+* @param cfgname the cfg file used to restart
+* @param restart_cb callback to call when restarted
+* @param cb_cls callback closure
+* @return GNUNET_OK in success otherwise GNUNET_SYSERR
+*/
+int
+GNUNET_TRANSPORT_TESTING_restart_peer (struct GNUNET_TRANSPORT_TESTING_handle
+ *tth, struct PeerContext *p,
+ const char *cfgname,
+ GNUNET_TRANSPORT_TESTING_start_cb
+ restart_cb, void *cb_cls)
+{
+ GNUNET_assert (tth != NULL);
+ GNUNET_assert (p != NULL);
+ GNUNET_assert (NULL != p->peer);
+
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
+ "Restarting peer %u (`%s')\n", p->no, GNUNET_i2s (&p->id));
+
+ /* shutdown */
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
+ "Stopping peer %u (`%s')\n", p->no, GNUNET_i2s (&p->id));
+ if (NULL != p->ghh)
+ GNUNET_TRANSPORT_get_hello_cancel (p->ghh);
+ p->ghh = NULL;
+
+ if (NULL != p->th)
+ GNUNET_TRANSPORT_disconnect (p->th);
+
+ if (GNUNET_SYSERR == GNUNET_TESTING_peer_stop(p->peer))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
+ "Failed to stop peer %u (`%s')\n", p->no, GNUNET_i2s (&p->id));
+ return GNUNET_SYSERR;
+ }
+
+ sleep (5);
+
+ /* restart */
+ if (GNUNET_SYSERR == GNUNET_TESTING_peer_start(p->peer))
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
+ "Failed to restart peer %u (`%s')\n",
+ p->no, GNUNET_i2s (&p->id));
+ return GNUNET_SYSERR;
+ }
+
+ GNUNET_assert (p->th != NULL);
+ GNUNET_assert (p->start_cb == NULL);
+ p->start_cb = restart_cb;
+ p->cb_cls = cb_cls;
+
+ p->th = GNUNET_TRANSPORT_connect (p->cfg, NULL, p,
+ ¬ify_receive,
+ ¬ify_connect,
+ ¬ify_disconnect);
+ GNUNET_assert (NULL != p->th);
+
+ p->ghh = GNUNET_TRANSPORT_get_hello (p->th, &get_hello, p);
+ GNUNET_assert (p->ghh != NULL);
+ return GNUNET_OK;
+}
+
+