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