aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2007-04-09 17:11:18 +0000
committerRoy Marples <roy@marples.name>2007-04-09 17:11:18 +0000
commit89ac4eee26d07f9e62dcc518d386551e8eef40ad (patch)
tree06e2513cc2a6d17b4351995779e56dde9c31c752
parent3c7c1736b7d6b6d086e9c5b54b963f8e244e3418 (diff)
rc does not need SIGCHLD handler. Also, always return 0 in /etc/rc as non zero for default may freeze system.
-rw-r--r--etc.BSD/rc10
-rw-r--r--src/rc.c16
2 files changed, 9 insertions, 17 deletions
diff --git a/etc.BSD/rc b/etc.BSD/rc
index 64fb4df9..13a192a1 100644
--- a/etc.BSD/rc
+++ b/etc.BSD/rc
@@ -11,4 +11,12 @@
RUNLEVEL="1" /sbin/rc sysinit || exit 1
RUNLEVEL="1" /sbin/rc boot || exit 1
-/sbin/rc default || exit 1
+PREVLEVEL="1" /sbin/rc default
+
+# If we return non zero after starting rc then 2 things may happen
+# 1) We get the message "init: can't get /dev/console for controlling terminal"
+# every few seconds
+# 2) We get no error and console freezes.
+# This is probably a bug somewhere in rc, but until that is fixed we have to
+# return 0.
+exit 0
diff --git a/src/rc.c b/src/rc.c
index 2b9629f7..16d45eb5 100644
--- a/src/rc.c
+++ b/src/rc.c
@@ -458,26 +458,11 @@ static void wait_for_services ()
static void handle_signal (int sig)
{
- pid_t pid;
- int status;
int serrno = errno;
char signame[10] = { '\0' };
switch (sig)
{
- case SIGCHLD:
- do
- {
- pid = waitpid (-1, &status, WNOHANG);
- if (pid < 0)
- {
- if (errno && errno != ECHILD)
- eerror ("waitpid: %s", strerror (errno));
- return;
- }
- } while (! WIFEXITED (status) && ! WIFSIGNALED (status));
- break;
-
case SIGINT:
if (! signame[0])
snprintf (signame, sizeof (signame), "SIGINT");
@@ -557,7 +542,6 @@ int main (int argc, char **argv)
signal (SIGINT, handle_signal);
signal (SIGQUIT, handle_signal);
signal (SIGTERM, handle_signal);
- signal (SIGCHLD, handle_signal);
/* Ensure our environment is pure
Also, add our configuration to it */