svn commit: r194198 - head/sbin/init
Ed Schouten
ed at FreeBSD.org
Sun Jun 14 17:00:36 UTC 2009
Author: ed
Date: Sun Jun 14 17:00:35 2009
New Revision: 194198
URL: http://svn.freebsd.org/changeset/base/194198
Log:
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.
Modified:
head/sbin/init/init.c
Modified: head/sbin/init/init.c
==============================================================================
--- head/sbin/init/init.c Sun Jun 14 16:48:17 2009 (r194197)
+++ head/sbin/init/init.c Sun Jun 14 17:00:35 2009 (r194198)
@@ -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 {
More information about the svn-src-all
mailing list