summaryrefslogtreecommitdiffstats
path: root/sbin/init
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2009-06-14 17:00:35 +0000
committered <ed@FreeBSD.org>2009-06-14 17:00:35 +0000
commitced07ef3b3639a83761cd0e5bb0df9418adc1d4d (patch)
treee28abd0f50c9dc30488e9aafd5a242e9601c370d /sbin/init
parenta6a33f782477877bea87e59cd8c7b89c8efc1e79 (diff)
downloadFreeBSD-src-ced07ef3b3639a83761cd0e5bb0df9418adc1d4d.zip
FreeBSD-src-ced07ef3b3639a83761cd0e5bb0df9418adc1d4d.tar.gz
Fix the staircase issue properly this time.
Even though I thought this bug was somewhere in the TTY layer, it turns out init(8) doesn't make sure /dev/console is opened initially properly. I've added revoke() to two pieces of code: - death(): Apart from killing the gettys on shutdown, this doesn't guarantee the TTY to be closed immediately. - runshutdown(): Just like setctty(), we should revoke /dev/console. Applications like syslogd may have file descriptors to the console.
Diffstat (limited to 'sbin/init')
-rw-r--r--sbin/init/init.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sbin/init/init.c b/sbin/init/init.c
index 8c0b680..baf29bb 100644
--- a/sbin/init/init.c
+++ b/sbin/init/init.c
@@ -1495,9 +1495,16 @@ death(void)
/* NB: should send a message to the session logger to avoid blocking. */
logwtmp("~", "shutdown", "");
+ /*
+ * Also revoke the TTY here. Because runshutdown() may reopen
+ * the TTY whose getty we're killing here, there is no guarantee
+ * runshutdown() will perform the initial open() call, causing
+ * the terminal attributes to be misconfigured.
+ */
for (sp = sessions; sp; sp = sp->se_next) {
sp->se_flags |= SE_SHUTDOWN;
kill(sp->se_process, SIGHUP);
+ revoke(sp->se_device);
}
/* Try to run the rc.shutdown script within a period of time */
@@ -1566,6 +1573,7 @@ runshutdown(void)
sigaction(SIGTSTP, &sa, (struct sigaction *)0);
sigaction(SIGHUP, &sa, (struct sigaction *)0);
+ revoke(_PATH_CONSOLE);
if ((fd = open(_PATH_CONSOLE, O_RDWR)) == -1)
warning("can't open %s: %m", _PATH_CONSOLE);
else {
OpenPOWER on IntegriCloud