+static char *test_phrase = "HELLO WORLD";
+static int ok;
+
+static struct GNUNET_OS_Process *proc;
+
+/* Pipe to write to started processes stdin (on write end) */
+static struct GNUNET_DISK_PipeHandle *hello_pipe_stdin;
+
+/* Pipe to read from started processes stdout (on read end) */
+static struct GNUNET_DISK_PipeHandle *hello_pipe_stdout;
+
+static GNUNET_SCHEDULER_TaskIdentifier die_task;
+
+static void
+end_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+
+ if (0 != GNUNET_OS_process_kill (proc, SIGTERM))
+ {
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
+ }
+ GNUNET_OS_process_wait (proc);
+ GNUNET_OS_process_close (proc);
+ proc = NULL;
+ GNUNET_DISK_pipe_close (hello_pipe_stdout);
+ GNUNET_DISK_pipe_close (hello_pipe_stdin);
+}
+
+static void
+read_call (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ struct GNUNET_DISK_FileHandle *stdout_read_handle = cls;
+ char buf[16];
+
+ memset (&buf, 0, sizeof (buf));
+ int bytes;
+
+ bytes = GNUNET_DISK_file_read (stdout_read_handle, &buf, sizeof (buf));
+
+#if VERBOSE
+ FPRINTF (stderr, "bytes is %d\n", bytes);
+#endif
+
+ if (bytes < 1)
+ {
+ GNUNET_break (0);
+ ok = 1;
+ GNUNET_SCHEDULER_cancel (die_task);
+ GNUNET_SCHEDULER_add_now (&end_task, NULL);
+ return;
+ }
+
+ ok = strncmp (&buf[0], test_phrase, strlen (test_phrase));
+#if VERBOSE
+ FPRINTF (stderr, "read %s\n", &buf[0]);
+#endif
+ if (ok == 0)
+ {
+ GNUNET_SCHEDULER_cancel (die_task);
+ GNUNET_SCHEDULER_add_now (&end_task, NULL);
+ return;
+ }
+
+ GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
+ stdout_read_handle, &read_call,
+ stdout_read_handle);
+
+}
+
+
+static void
+task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)