+static void print_child_error (const char *reason, char **argv)
+{
+ char **sp;
+
+ fprintf (stderr, "%s: %d %s:", progname, (int) child, reason);
+ for (sp = argv; *sp != NULL; sp++)
+ {
+ fputc (' ', stderr);
+ fputs (*sp, stderr);
+ }
+ fputc ('\n', stderr);
+}
+
+static int read_out (int amaster)
+{
+ char buf[LINE_MAX];
+ ssize_t buf_got;
+
+ buf_got = read (amaster, buf, sizeof buf);
+ if (buf_got == 0)
+ return 0;
+ /* Weird but at least after POLLHUP we get EIO instead of just EOF. */
+ if (buf_got == -1 && errno == EIO)
+ return 0;
+ if (buf_got == -1 && errno == EAGAIN)
+ return 0;
+ if (buf_got < 0)
+ {
+ perror ("read (amaster)");
+ exit (EXIT_FAILURE);
+ }
+ if (write (STDOUT_FILENO, buf, buf_got) != buf_got)
+ {
+ perror ("write(2)");
+ exit (EXIT_FAILURE);
+ }
+ return 1;
+}
+
+static int spawn (char **argv, int timeout)