+static GNUNET_SCHEDULER_TaskIdentifier child_death_task_id;
+
+/**
+ * The shutdown task
+ */
+static void
+shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ shutdown_task_id = GNUNET_SCHEDULER_NO_TASK;
+ if (0 != child_exit_code)
+ {
+ LOG (GNUNET_ERROR_TYPE_WARNING, "Child exited with error code: %lu\n",
+ child_exit_code);
+ ret = 128 + (int) child_exit_code;
+ }
+ if (0 != fh)
+ {
+ close (fh);
+ }
+ if ((NULL != fn) && (0 != unlink (fn)))
+ {
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "open");
+ ret = GNUNET_SYSERR;
+ }
+}
+
+
+static void
+terminate_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ static int hard_kill;
+
+ GNUNET_assert (NULL != child);
+ terminate_task_id =
+ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
+ &terminate_task, NULL);
+ if (0 != hard_kill)
+ {
+ switch (hard_kill)
+ {
+ case 1:
+ case 2:
+ LOG (GNUNET_ERROR_TYPE_WARNING,
+ "%d more interrupts needed to send SIGKILL to the child\n",
+ 3 - hard_kill);
+ hard_kill++;
+ return;
+ case 3:
+ GNUNET_break (0 == GNUNET_OS_process_kill (child, SIGKILL));
+ return;
+ }
+ }
+ hard_kill++;
+ GNUNET_break (0 == GNUNET_OS_process_kill (child, SIGTERM));
+ LOG (GNUNET_ERROR_TYPE_INFO, _("Waiting for child to exit.\n"));
+}
+