]> Zhao Yanbai Git Server - minix.git/commitdiff
TTY fixes:
authorDavid van Moolenbroek <david@minix3.org>
Mon, 21 Dec 2009 23:19:01 +0000 (23:19 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Mon, 21 Dec 2009 23:19:01 +0000 (23:19 +0000)
- reenable code to restore screen/cursor at shutdown
- add proper signal checking logic
- lock to first console during shutdown

drivers/tty/console.c
drivers/tty/tty.c

index 77108fd50b2c7c6d37fda442039476b8c877c7d2..7fc93ecacabb4bd5d8556ac15ad04677cbb8d439 100644 (file)
@@ -103,6 +103,8 @@ PRIVATE int nr_cons= 1;             /* actual number of consoles */
 PRIVATE console_t cons_table[NR_CONS];
 PRIVATE console_t *curcons = NULL;     /* currently visible */
 
+PRIVATE int shutting_down = FALSE;     /* don't allow console switches */
+
 /* Color if using a color controller. */
 #define color  (vid_port == C_6845)
 
@@ -1228,12 +1230,11 @@ PUBLIC void toggle_scroll()
 PUBLIC void cons_stop()
 {
 /* Prepare for halt or reboot. */
-  select_console(0);
-#if 0
   cons_org0();
   softscroll = 1;
+  select_console(0);
   cons_table[0].c_attr = cons_table[0].c_blank = BLANK_COLOR;
-#endif
+  shutting_down = TRUE;
 }
 
 /*===========================================================================*
@@ -1298,6 +1299,8 @@ PUBLIC void select_console(int cons_line)
 {
 /* Set the current console to console number 'cons_line'. */
 
+  if (shutting_down) return;
+
   if (cons_line < 0 || cons_line >= nr_cons) return;
 
   ccurrent = cons_line;
index 8574bc62febac7455e6a983c4cdc99c5a9595a53..e2445b9771fc3fcbcd42935978be562f47107d42 100644 (file)
@@ -102,6 +102,7 @@ unsigned long rs_irq_set = 0;
 
 struct kmessages kmess;
 
+FORWARD _PROTOTYPE( void got_signal, (void)                            );
 FORWARD _PROTOTYPE( void tty_timed_out, (timer_t *tp)                  );
 FORWARD _PROTOTYPE( void expire_timers, (void)                         );
 FORWARD _PROTOTYPE( void settimer, (tty_t *tty_ptr, int enable)                );
@@ -219,8 +220,8 @@ PUBLIC int main(void)
                                expire_timers();
                                break;
                        case PM_PROC_NR:
-                               /* switch to primary console */
-                               cons_stop();
+                               /* signal */
+                               got_signal();
                                break;
                        case SYSTEM:
                                /* system signal */
@@ -343,6 +344,24 @@ PRIVATE void sef_local_startup()
   sef_startup();
 }
 
+/*===========================================================================*
+ *                             got_signal                                   *
+ *===========================================================================*/
+PRIVATE void got_signal()
+{
+/* PM notified us that we have received a signal. If it is a SIGTERM, assume
+ * that the system is shutting down.
+ */
+  sigset_t set;
+
+  if (getsigset(&set) != 0) return;
+
+  if (!sigismember(&set, SIGTERM)) return;
+
+  /* switch to primary console */
+  cons_stop();
+}
+
 /*===========================================================================*
  *                             do_status                                    *
  *===========================================================================*/