close(_signal_pipe[1]); \
} while(0)
-void exec_proc_signal_ready(int *signal_fd)
+static void exec_child_signal_ready(int *signal_fd)
{
uint8_t val = 0x00;
close(*signal_fd);
*signal_fd = -1;
}
+
+static void exec_parent_wait(int signal_fd)
+{
+ uint8_t val = 0x00;
+
+ read(signal_fd, &val, sizeof(val));
+}
+
+static void exec_parent_ready(int *signal_fd)
+{
+ uint8_t val = 0x00;
+
+ write(signal_fd, &val, sizeof(val));
+
+ close(*signal_fd);
+ *signal_fd = -1;
+}
+
#endif
/** Execute a program without waiting for the program to finish.
* Ensure the child can only exit once we've
* signalled it to continue.
*/
- exec_proc_signal_ready(&signal_pipe[1]);
+ exec_child_signal_ready(&signal_pipe[1]);
#endif
exec_child(request, argv, env, false, unused, unused, unused);
}
#ifdef EXEC_SYNC_WITH_CHILD
close(signal_pipe[1]);
- exec_proc_signal_ready(&signal_pipe[0]);
+ exec_parent_wait(signal_pipe[0]);
+ exec_parent_ready(&signal_pipe[0]);
#endif
return 0;
}
if (fr_nonblock(stderr_pipe[0]) < 0) PERROR("Error setting stderr to nonblock");
}
-
+
#ifdef EXEC_SYNC_WITH_CHILD
if (pipe(signal_pipe) < 0) {
fr_strerror_printf_push("Failed creating signal pipe for child");
* Ensure the child can only exit once we've
* signalled it to continue.
*/
- exec_proc_signal_ready(&signal_pipe[1]);
+ exec_child_signal_ready(&signal_pipe[1]);
#endif
exec_child(request, argv, env, true, stdin_pipe, stdout_pipe, stderr_pipe);
}
#ifdef EXEC_SYNC_WITH_CHILD
close(signal_pipe[1]);
*signal_fd = signal_pipe[0];
+ exec_parent_wait(signal_pipe[0]);
#endif
if (stdin_fd) {
* continue now we've installed the appropriate
* monitoring.
*/
- exec_proc_signal_ready(&signal_fd);
+ exec_parent_ready(&signal_fd);
#endif
/*
* Setup event to kill the child process after a period of time.