Date: Tuesday, August 10, 2010 @ 14:56:52 Author: jgc Revision: 87106
upgpkg: gdm 2.30.4-2 Add patch to allocate VT starting from 7. Fixes issues with agetty claiming the TTY after gdm has started X on it Added: gdm/trunk/gdm-vt-allocation-hack.patch Modified: gdm/trunk/PKGBUILD ------------------------------+ PKGBUILD | 3 + gdm-vt-allocation-hack.patch | 118 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) Modified: PKGBUILD =================================================================== --- PKGBUILD 2010-08-10 18:56:47 UTC (rev 87105) +++ PKGBUILD 2010-08-10 18:56:52 UTC (rev 87106) @@ -19,12 +19,14 @@ source=(http://ftp.gnome.org/pub/gnome/sources/${pkgname}/2.30/${pkgname}-${pkgver}.tar.bz2 04_fix_external_program_directories.patch ck-since.patch + gdm-vt-allocation-hack.patch gdm.pam gdm-autologin.pam gdm) sha256sums=('3a1c7fd590622d5291584d98ce5cf3e7888adf949655041549561f3a5983b5a9' 'cb585c39c6671387b5a25f21a99c97e3a20eaf4188fea1b62871681a1ebf8bff' 'bbe7dcfa162fd4eb362e15d5742beef6881535bd449524097a14c54afec99bff' + '3c8b588d4af08d94dc93bcd5e4c2a983c3f4fbbbe40833bceac2a1df4f1e8215' 'f1dfa4d88288d4b0a631a68a51b46c2da537bee8fe5a99f9f288c8ff75a50b19' '3daff680ff6b7ea56f84f40843e46e72477c81e9e405028203c942af04d07ae5' '272c08d8e8b50bf424d0705ac864d4c18c47ec4f6893b1af732c2efbc86c9550') @@ -33,6 +35,7 @@ cd "${srcdir}/${pkgname}-${pkgver}" patch -Np1 -i "${srcdir}/04_fix_external_program_directories.patch" patch -Np1 -i "${srcdir}/ck-since.patch" + patch -Np1 -i "${srcdir}/gdm-vt-allocation-hack.patch" ./configure --prefix=/usr --sysconfdir=/etc \ --libexecdir=/usr/lib/gdm --localstatedir=/var --disable-static \ --with-at-spi-registryd-directory=/usr/lib/at-spi \ Added: gdm-vt-allocation-hack.patch =================================================================== --- gdm-vt-allocation-hack.patch (rev 0) +++ gdm-vt-allocation-hack.patch 2010-08-10 18:56:52 UTC (rev 87106) @@ -0,0 +1,118 @@ +diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c +index 39def47..03488fd 100644 +--- a/daemon/gdm-server.c ++++ b/daemon/gdm-server.c +@@ -33,6 +33,8 @@ + #include <grp.h> + #include <signal.h> + #include <sys/resource.h> ++#include <sys/ioctl.h> ++#include <sys/vt.h> + + #include <glib.h> + #include <glib/gi18n.h> +@@ -150,6 +152,92 @@ _gdm_server_query_ck_for_display_device (GdmServer *server) + return out; + } + ++#ifndef O_NOCTTY ++# define O_NOCTTY 0 ++#endif ++ ++static int ++open_vt (int vtno) ++{ ++ char *vtname; ++ int fd; ++ ++ vtname = g_strdup_printf ("/dev/tty%d", vtno); ++ ++ do { ++ errno = 0; ++ fd = open (vtname, O_RDWR | O_NOCTTY, 0); ++ } while (errno == EINTR); ++ ++ g_free (vtname); ++ return fd; ++} ++ ++static gint ++find_first_probably_free_vt (void) ++{ ++ int fd, fdv; ++ int vtno; ++ unsigned short vtmask; ++ struct vt_stat vtstat; ++ guint v_state; ++ ++ fdv = -1; ++ ++ do { ++ errno = 0; ++ fd = open ("/dev/console", O_WRONLY | O_NOCTTY, 0); ++ } while (errno == EINTR); ++ ++ if (fd >= 0) { ++ if (ioctl (fd, VT_GETSTATE, &vtstat) >= 0) { ++ v_state = vtstat.v_state; ++ } else { ++ close (fd); ++ v_state = 0; ++ fd = -1; ++ } ++ } else { ++ v_state = 0; ++ } ++ ++ if (fd < 0) { ++ do { ++ errno = 0; ++ fd = open ("/dev/console", O_RDONLY | O_NOCTTY, 0); ++ } while (errno == EINTR); ++ ++ if (fd >= 0) { ++ if (ioctl (fd, VT_GETSTATE, &vtstat) >= 0) ++ v_state = vtstat.v_state; ++ } ++ } ++ ++ for (vtno = 7, vtmask = 1 << vtno; vtmask; vtno++, vtmask <<= 1) { ++ /* Is this console in use? */ ++ if (v_state & vtmask) ++ continue; ++ ++ /* No, try to open it */ ++ fdv = open_vt (vtno); ++ if (fdv >= 0) ++ break; ++ ++ /* If we're here, kernel indicated that the console was free, ++ * but we failed to open it. Just go on to higher VTs. */ ++ } ++ ++ if (fdv >= 0) ++ close (fdv); ++ else ++ vtno = -1; ++ ++ if (fd >= 0) ++ close (fd); ++ ++ return vtno; ++} ++ + char * + gdm_server_get_display_device (GdmServer *server) + { +@@ -310,6 +398,11 @@ gdm_server_resolve_command_line (GdmServer *server, + + if (vtarg != NULL && ! gotvtarg) { + argv[len++] = g_strdup (vtarg); ++ } else if (!query_in_arglist && !gotvtarg) { ++ gint vtnum = find_first_probably_free_vt (); ++ ++ if (vtnum > 0) ++ argv [len++] = g_strdup_printf ("vt%d", vtnum); + } + + argv[len++] = NULL;
