public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Nirbheek Chauhan" <nirbheek@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gnome:master commit in: gnome-base/gdm/, gnome-base/gdm/files/
Date: Fri, 15 Apr 2011 19:36:56 +0000 (UTC)	[thread overview]
Message-ID: <c0ded3e0fe2576cf70a224394ee08d18b6fcfd98.nirbheek@gentoo> (raw)

commit:     c0ded3e0fe2576cf70a224394ee08d18b6fcfd98
Author:     Nirbheek Chauhan <nirbheek <AT> gentoo <DOT> org>
AuthorDate: Fri Apr 15 19:31:06 2011 +0000
Commit:     Nirbheek Chauhan <nirbheek <AT> gentoo <DOT> org>
CommitDate: Fri Apr 15 19:35:43 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gnome.git;a=commit;h=c0ded3e0

gnome-base/gdm: fix bug 261339, bug 288852, bug 284053, remove old cruft

* VT detection should finally be fixed. See patch for details.

---
 .../gdm/files/gdm-3.0.0-fix-vt-problems.patch      |  195 ++++++++++++++++++++
 .../gdm/{gdm-3.0.0.ebuild => gdm-3.0.0-r1.ebuild}  |   33 +---
 2 files changed, 202 insertions(+), 26 deletions(-)

diff --git a/gnome-base/gdm/files/gdm-3.0.0-fix-vt-problems.patch b/gnome-base/gdm/files/gdm-3.0.0-fix-vt-problems.patch
new file mode 100644
index 0000000..b7ceb49
--- /dev/null
+++ b/gnome-base/gdm/files/gdm-3.0.0-fix-vt-problems.patch
@@ -0,0 +1,195 @@
+From 64002e623fea54ab10040206d164c5fdee4a43d2 Mon Sep 17 00:00:00 2001
+From: Nirbheek Chauhan <nirbheek@gentoo.org>
+Date: Fri, 15 Apr 2011 22:13:44 +0530
+Subject: [PATCH] Fix VT grab race with getty causing X to grab the wrong VT
+
+On bootup, if X is spawned without any args, it'll take up the first unused VT.
+If GDM starts up before gettys are spawned, X takes up VT1 or VT2 depending on
+the init system and bootsplash.
+
+This is problematic because afterwards getty will come up underneath X, and
+cause keyboard problems and eventually crash X.
+
+So we read /etc/inittab, check for open VTs, compare the two values, and take
+the conservative one.
+---
+ configure.ac        |    4 ++
+ daemon/Makefile.am  |    1 +
+ daemon/gdm-server.c |  106 ++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 3 files changed, 110 insertions(+), 1 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index ca0f8bb..b9e7462 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -302,6 +302,10 @@ AC_CHECK_TYPE(socklen_t,,
+ AC_CHECK_HEADERS(sys/sockio.h)
+ AC_CHECK_FUNCS([setresuid setenv unsetenv clearenv])
+ 
++dnl Needed for querying the kernel for free VTs
++AC_CHECK_HEADERS(sys/vt.h)
++AC_CHECK_HEADERS(sys/ioctl.h)
++
+ dnl checks needed for Darwin compatibility to linux **environ.
+ AC_CHECK_HEADERS(crt_externs.h)
+ AC_CHECK_FUNCS(_NSGetEnviron)
+diff --git a/daemon/Makefile.am b/daemon/Makefile.am
+index da18835..c1b6bda 100644
+--- a/daemon/Makefile.am
++++ b/daemon/Makefile.am
+@@ -14,6 +14,7 @@ AM_CPPFLAGS = \
+ 	-DLIBEXECDIR=\"$(libexecdir)\"			\
+ 	-DLOGDIR=\"$(logdir)\"				\
+ 	-DSBINDIR=\"$(sbindir)\"			\
++	-DSYSCONFDIR=\""$(sysconfdir)"\"		\
+ 	-DGNOMELOCALEDIR=\""$(datadir)/locale"\"	\
+ 	-DGDM_XAUTH_DIR=\"$(GDM_XAUTH_DIR)\"		\
+ 	-DGDM_SCREENSHOT_DIR=\"$(GDM_SCREENSHOT_DIR)\"		\
+diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c
+index 339f3cc..29d16dc 100644
+--- a/daemon/gdm-server.c
++++ b/daemon/gdm-server.c
+@@ -26,6 +26,8 @@
+ #include <unistd.h>
+ #include <string.h>
+ #include <sys/types.h>
++#include <sys/ioctl.h>
++#include <sys/vt.h>
+ #include <sys/wait.h>
+ #include <errno.h>
+ #include <ctype.h>
+@@ -42,6 +44,7 @@
+ #include <glib/gi18n.h>
+ #include <glib/gstdio.h>
+ #include <glib-object.h>
++#include <gio/gio.h>
+ 
+ #include <X11/Xlib.h> /* for Display */
+ 
+@@ -54,6 +57,8 @@ extern char **environ;
+ 
+ #define GDM_SERVER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_SERVER, GdmServerPrivate))
+ 
++#define INITTAB SYSCONFDIR"/inittab"
++
+ /* These are the servstat values, also used as server
+  * process exit codes */
+ #define SERVER_TIMEOUT 2        /* Server didn't start */
+@@ -674,6 +679,105 @@ gdm_server_spawn (GdmServer  *server,
+ }
+ 
+ /**
++ * Parse the inittab file used by getty to spawn VTs to find unused ttys
++ */
++int
++get_free_vt_from_inittab ()
++{
++        GFile *gfile;
++        GFileInputStream *contents;
++        GDataInputStream *dstream;
++        GRegex *getty;
++        GMatchInfo *tty_match = NULL;
++        GSList *tty_list = NULL;
++        GError *error = NULL;
++        gchar *temp = NULL;
++        int vtno = 0;
++
++        gfile = g_file_new_for_path (INITTAB);
++        contents = g_file_read (gfile, NULL, &error);
++        g_object_unref (gfile);
++        if (!contents) {
++                if (error) {
++                        g_debug ("Unable to open file %s", INITTAB);
++                        g_error_free (error);
++                }
++                goto out;
++        }
++
++        dstream = g_data_input_stream_new (G_INPUT_STREAM (contents));
++        getty = g_regex_new ("^c[0-9]+:.+getty.+tty([0-9]+)", 0, 0, NULL);
++        g_object_unref (contents);
++
++        while (1) {
++                temp = g_data_input_stream_read_line (dstream, NULL, NULL, &error);
++                if (!temp)
++                        break;
++                if (!g_regex_match (getty, temp, 0, &tty_match))
++                        continue;
++                g_free (temp);
++                temp = g_match_info_fetch (tty_match, 1);
++                if (!temp)
++                        continue;
++                tty_list = g_slist_insert_sorted (tty_list, temp, (GCompareFunc)g_strcmp0);
++                g_match_info_free (tty_match);
++        }
++
++        if (error) {
++                g_debug ("Unable to read line from %s", INITTAB);
++                g_error_free (error);
++                goto free;
++        }
++
++        /* Ignore holes in vt allocation, just take the last one */
++        temp = g_slist_last (tty_list)->data;
++        if (temp)
++                vtno = (int) g_ascii_strtoull (temp, NULL, 10) + 1;
++
++free:
++        g_object_unref (dstream);
++        g_regex_unref (getty);
++        g_slist_free_full (tty_list, g_free);
++        g_free (error);
++out:
++        return vtno;
++}
++
++/**
++ * Query the VT_* kernel ioctls to find an empty tty
++ */
++int
++get_free_vt_from_kernel()
++{
++        int fd, vtno = 0;
++
++        fd = open ("/dev/tty0", O_WRONLY, 0);
++        if ((ioctl(fd, VT_OPENQRY, &vtno) < 0) || (vtno == -1)) {
++                vtno = 0;
++                g_debug ("Unable to find a free vt, falling back to Xorg autodetect");
++        }
++        return vtno;
++}
++
++gchar*
++get_free_vt ()
++{
++        int inittab_vtno, kernel_vtno;
++        gchar* vt = NULL;
++
++        inittab_vtno = get_free_vt_from_inittab();
++        if (inittab_vtno > 0)
++                g_debug ("Inittab says vt%i is free\n", inittab_vtno);
++        kernel_vtno = get_free_vt_from_kernel();
++        if (kernel_vtno > 0)
++                g_debug ("Kernel says vt%i is free\n", kernel_vtno);
++        /* Select the greater of the two because getty will use the others */
++        if (kernel_vtno != 0 && inittab_vtno != 0)
++                vt = g_strdup_printf ("vt%i", kernel_vtno > inittab_vtno ? kernel_vtno : inittab_vtno);
++        return vt;
++}
++
++/**
+  * gdm_server_start:
+  * @disp: Pointer to a GdmDisplay structure
+  *
+@@ -686,7 +790,7 @@ gdm_server_start (GdmServer *server)
+         gboolean res;
+ 
+         /* fork X server process */
+-        res = gdm_server_spawn (server, NULL);
++        res = gdm_server_spawn (server, get_free_vt());
+ 
+         return res;
+ }
+-- 
+1.7.3.4
+

diff --git a/gnome-base/gdm/gdm-3.0.0.ebuild b/gnome-base/gdm/gdm-3.0.0-r1.ebuild
similarity index 84%
rename from gnome-base/gdm/gdm-3.0.0.ebuild
rename to gnome-base/gdm/gdm-3.0.0-r1.ebuild
index 6b964ab..0e43a55 100644
--- a/gnome-base/gdm/gdm-3.0.0.ebuild
+++ b/gnome-base/gdm/gdm-3.0.0-r1.ebuild
@@ -1,6 +1,6 @@
-# Copyright 1999-2010 Gentoo Foundation
+# Copyright 1999-2011 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/gnome-base/gdm/gdm-2.32.0.ebuild,v 1.2 2010/11/11 11:48:55 ssuominen Exp $
+# $Header: $
 
 EAPI="3"
 GCONF_DEBUG="yes"
@@ -90,7 +90,6 @@ pkg_setup() {
 		--with-xdmcp=yes
 		--enable-authentication-scheme=pam
 		--with-pam-prefix=/etc
-		SOUND_PROGRAM=/usr/bin/gdmplay
 		$(use_with accessibility xevie)
 		$(use_enable ipv6)
 		$(use_enable xklavier libxklavier)
@@ -112,9 +111,8 @@ src_prepare() {
 	# daemonize so that the boot process can continue, bug #236701
 	epatch "${FILESDIR}/${PN}-2.32.0-fix-daemonize-regression.patch"
 
-	# fix VT grab problem causing GDM to grab VT2 instead of 7, bug #261339
-	# FIXME FIXME FIXME: this is due to a race b/w getty and gdm
-	#epatch "${FILESDIR}/${PN}-2.32.0-broken-VT-detection.patch"
+	# GDM grabs VT2 instead of VT7, bug 261339, bug 284053, bug 288852
+	epatch "${FILESDIR}/${PN}-3.0.0-fix-vt-problems.patch"
 
 	# make custom session work, bug #216984
 	epatch "${FILESDIR}/${PN}-2.32.0-custom-session.patch"
@@ -125,7 +123,7 @@ src_prepare() {
 	# fix libxklavier automagic support
 	epatch "${FILESDIR}/${PN}-2.32.0-automagic-libxklavier-support.patch"
 
-	mkdir "${S}"/m4
+	mkdir -p "${S}"/m4
 	intltoolize --force --copy --automake || die "intltoolize failed"
 	eautoreconf
 }
@@ -135,6 +133,7 @@ src_install() {
 
 	local gentoodir="${WORKDIR}/${GDM_EXTRA}"
 
+	# FIXME: Remove dosym usage, gone in EAPI 4
 	# gdm-binary should be gdm to work with our init (#5598)
 	rm -f "${D}/usr/sbin/gdm"
 	dosym /usr/sbin/gdm-binary /usr/sbin/gdm
@@ -144,14 +143,6 @@ src_install() {
 
 	# log, etc.
 	keepdir /var/log/gdm
-	keepdir /var/gdm
-
-	fowners root:gdm /var/gdm
-	fperms 1770 /var/gdm
-
-	# add a custom xsession .desktop by default (#44537)
-	exeinto /etc/X11/dm/Sessions
-	doexe "${gentoodir}/custom.desktop" || die "doexe 1 failed"
 
 	# add xinitrc.d scripts
 	exeinto /etc/X11/xinit/xinitrc.d
@@ -162,19 +153,9 @@ src_install() {
 	echo 'XDG_DATA_DIRS="/usr/share/gdm"' > 99xdg-gdm
 	doenvd 99xdg-gdm || die "doenvd failed"
 
-	# add a custom sound playing script (#248253)
-	dobin "${gentoodir}/gdmplay"
-
-	# avoid file collision, bug #213118
-	rm -f "${D}/usr/share/xsessions/gnome.desktop"
-
-	# We replace the pam stuff by our own
-	rm -rf "${D}/etc/pam.d"
-
 	use gnome-keyring && sed -i "s:#Keyring=::g" "${gentoodir}"/pam.d/*
 
-	dopamd "${gentoodir}"/pam.d/*
-	dopamsecurity console.apps "${gentoodir}/security/console.apps/gdmsetup"
+	dopamd "${gentoodir}"/pam.d/gdm{,-autologin}
 }
 
 pkg_postinst() {



             reply	other threads:[~2011-04-15 19:37 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-04-15 19:36 Nirbheek Chauhan [this message]
  -- strict thread matches above, loose matches on Subject: below --
2013-12-11 23:44 [gentoo-commits] proj/gnome:master commit in: gnome-base/gdm/, gnome-base/gdm/files/ Gilles Dartiguelongue
2012-12-26 21:45 Gilles Dartiguelongue
2012-09-12 12:08 Nirbheek Chauhan
2012-09-12 12:06 Nirbheek Chauhan
2012-09-09  0:39 Nirbheek Chauhan
2012-08-18 14:07 Priit Laes
2011-10-23  8:41 Alexandre Restovtsev
2011-08-13  6:08 Alexandre Restovtsev
2011-06-26  6:22 Nirbheek Chauhan
2011-05-03 10:52 Nirbheek Chauhan
2011-04-05  0:57 Nirbheek Chauhan
2011-04-02 13:54 Nirbheek Chauhan
2011-02-26 11:41 Nirbheek Chauhan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c0ded3e0fe2576cf70a224394ee08d18b6fcfd98.nirbheek@gentoo \
    --to=nirbheek@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox