#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
+#include <sys/wait.h>
#include <unistd.h>
#ifdef USE_UTEMPTER
sigaction(SIGQUIT, &action, NULL);
sigaction(SIGUSR1, &action, NULL);
sigaction(SIGUSR2, &action, NULL);
-
- /* Collect zombies automatically without having to call waitpid(2). */
- signal(SIGCHLD, SIG_IGN);
}
static int open_tty(void) {
}
close(fds[0]);
- execvp(argv[0], argv);
- perror("execvp");
- exit(EXIT_FAILURE);
+ /* Double fork so `wall-notify` doesn't have to wait for the
+ * notification process to terminate. We can't just use
+ * signal(SIGCHLD, SIG_IGN); because utempter on at least FreeBSD
+ * doesn't work if SIGCHLD is ignored. */
+ pid = fork();
+ if (pid < 0) {
+ perror("fork");
+ exit(EXIT_FAILURE);
+ } else if (pid == 0) {
+ execvp(argv[0], argv);
+ perror("execvp");
+ exit(EXIT_FAILURE);
+ }
+
+ exit(EXIT_SUCCESS);
}
/* father */
out:
close(fds[0]); /* read side */
fclose(fh);
+
+ if (waitpid(pid, NULL, 0) < 0) {
+ perror("waitpid");
+ }
}
static void handle_wall(int fd, char **argv) {
char buffer[4096];