50 lines
1.3 KiB
Diff
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 */
|