20828N/A--- gdm-2.30.7/daemon/main.c-orig 2011-08-29 16:11:16.857687716 -0500
20828N/A+++ gdm-2.30.7/daemon/main.c 2011-08-29 16:22:28.322458642 -0500
20828N/A@@ -33,6 +33,7 @@
20828N/A #include <sys/wait.h>
20828N/A #include <locale.h>
20828N/A #include <signal.h>
20828N/A+#include <sys/vt.h>
20828N/A
20828N/A #include <glib.h>
20828N/A #include <glib/gi18n.h>
20828N/A@@ -461,10 +462,53 @@ gdm_daemon_change_user (uid_t *uidp,
20828N/A g_free (groupname);
20828N/A }
20828N/A
20828N/A+gboolean
20828N/A+ck_fd_is_a_console (int fd)
20828N/A+{
20828N/A+#ifdef __linux__
20828N/A+ struct vt_stat vts;
20828N/A+#elif defined(__FreeBSD__)
20828N/A+ int vers;
20828N/A+#endif
20828N/A+ int kb_ok;
20828N/A+
20828N/A+ errno = 0;
20828N/A+#ifdef __linux__
20828N/A+ kb_ok = (ioctl (fd, VT_GETSTATE, &vts) == 0);
20828N/A+#elif defined(__FreeBSD__)
20828N/A+ kb_ok = (ioctl (fd, CONS_GETVERS, &vers) == 0);
20828N/A+#else
20828N/A+ kb_ok = 1;
20828N/A+#endif
20828N/A+
20828N/A+ return (isatty (fd) && kb_ok);
20828N/A+}
20828N/A+
20828N/A+static int
20828N/A+open_a_console (char *fnam)
20828N/A+{
20828N/A+ int fd;
20828N/A+
20828N/A+ fd = open (fnam, O_RDONLY | O_NOCTTY);
20828N/A+ if (fd < 0 && errno == EACCES)
20828N/A+ fd = open (fnam, O_WRONLY | O_NOCTTY);
20828N/A+
20828N/A+ if (fd < 0)
20828N/A+ return -1;
20828N/A+
20828N/A+ if (! ck_fd_is_a_console (fd)) {
20828N/A+ close (fd);
20828N/A+ fd = -1;
20828N/A+ }
20828N/A+
20828N/A+ return fd;
20828N/A+}
20828N/A+
20828N/A static gboolean
20828N/A signal_cb (int signo,
20828N/A gpointer data)
20828N/A {
20828N/A+ int fd;
20828N/A int ret;
20828N/A
20828N/A g_debug ("Got callback for signal %d", signo);
20891N/A@@ -484,6 +528,25 @@ signal_cb (int signo,
20828N/A case SIGTERM:
20828N/A /* let the fatal signals interrupt us */
20828N/A g_debug ("Caught signal %d, shutting down normally.", signo);
20828N/A+
20828N/A+ /* Switch to VT1 before going down. */
20828N/A+ fd = open_a_console ("/dev/vt/active");
20828N/A+ if (fd < 0) {
20828N/A+ fd = open_a_console ("/dev/vt/0");
20828N/A+ }
20828N/A+
20828N/A+ if (fd >= 0) {
20828N/A+ int res;
20828N/A+
20828N/A+ res = ioctl (fd, VT_ACTIVATE, 1);
20828N/A+
20828N/A+ if (res != 0) {
20828N/A+ if (errno == ENOTSUP) {
20828N/A+ g_debug ("VT_ENABLE not supported, cannot switch to VT1");
20828N/A+ }
20828N/A+ }
20828N/A+ }
20828N/A+
20828N/A ret = FALSE;
20828N/A
20828N/A break;