+/**
+ * logging short hand
+ */
+#define LOG(type,...) \
+ GNUNET_log (type, __VA_ARGS__);
+
+/**
+ * Our barrier wait handle
+ */
+struct GNUNET_TESTBED_BarrierWaitHandle *wh;
+
+
+/**
+ * Dummy task callback to keep us running forever
+ *
+ * @param cls NULL
+ * @param tc scheduler task context
+ */
+static void
+do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ if (NULL != wh)
+ GNUNET_TESTBED_barrier_wait_cancel (wh);
+ wh = NULL;
+}
+
+
+/**
+ * Functions of this type are to be given as acallback argumetn to
+ * GNUNET_TESTBED_barrier_wait(). The callback will be called when the barrier
+ * corresponding given in GNUNET_TESTBED_barrier_wait() is crossed or cancelled.
+ *
+ * @param cls NULL
+ * @param name the barrier name
+ * @param status GNUNET_SYSERR in case of error while waiting for the barrier;
+ * GNUNET_OK if the barrier is crossed
+ */
+static void
+barrier_wait_cb (void *cls, const char *name, int status)
+{
+ GNUNET_break (NULL == cls);
+ wh = NULL;
+ GNUNET_break (GNUNET_OK == status);
+}
+
+
+/**
+ * Task to wait for the barrier
+ *
+ * @param cls NULL
+ * @param tc scheduler task context
+ * @return
+ */
+static void
+do_wait (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
+ return;
+ wh = GNUNET_TESTBED_barrier_wait (TEST_BARRIER_NAME, &barrier_wait_cb, NULL);
+ GNUNET_break (NULL != wh);
+}
+
+
+/**
+ * Main run function.
+ *
+ * @param cls NULL
+ * @param args arguments passed to GNUNET_PROGRAM_run
+ * @param cfgfile the path to configuration file
+ * @param config the configuration file handle
+ */
+static void
+run (void *cls, char *const *args, const char *cfgfile,
+ const struct GNUNET_CONFIGURATION_Handle *config)