tcp_wrappers/tcp_wrappers-7.6-sigchld.patch

50 lines
1.3 KiB
Diff

--- tcp_wrappers_7.6/shell_cmd.c.sigchld 1994-12-28 17:42:44.000000000 +0100
+++ tcp_wrappers_7.6/shell_cmd.c 2007-05-25 14:28:33.000000000 +0200
@@ -31,6 +31,10 @@
static void do_child();
+/* Dummy handler */
+
+static void sigchld(int sig) {}
+
/* shell_cmd - execute shell command */
void shell_cmd(command)
@@ -39,6 +43,22 @@
int child_pid;
int wait_pid;
+ struct sigaction new_action, old_action;
+ sigset_t new_mask, old_mask;
+
+ new_action.sa_handler = &sigchld;
+ new_action.sa_flags = 0;
+ sigemptyset(&new_action.sa_mask);
+ sigemptyset(&new_mask);
+ sigaddset(&new_mask, SIGCHLD);
+
+ /*
+ * Ignore the SIGCHLD signal a unblock it so that the program should not
+ * see it.
+ */
+ sigaction(SIGCHLD, &new_action, &old_action);
+ sigprocmask(SIG_UNBLOCK, &new_mask, &old_mask);
+
/*
* Most of the work is done within the child process, to minimize the
* risk of damage to the parent.
@@ -55,6 +75,12 @@
while ((wait_pid = wait((int *) 0)) != -1 && wait_pid != child_pid)
/* void */ ;
}
+
+ /*
+ * Revert the signal mask and the SIGCHLD handler.
+ */
+ sigprocmask(SIG_SETMASK, &old_mask, 0);
+ sigaction(SIGCHLD, &old_action, 0);
}
/* do_child - exec command with { stdin, stdout, stderr } to /dev/null */