gdm: update to 2.32.0.

This commit is contained in:
Juan RP 2010-10-24 21:56:57 +02:00
parent 149f467c33
commit fd7576910e
2 changed files with 123 additions and 3 deletions

View file

@ -0,0 +1,118 @@
diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c
index 39def47..03488fd 100644
--- daemon/gdm-server.c.old
+++ 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;

View file

@ -1,7 +1,7 @@
# Template file for 'gdm'
pkgname=gdm
version=2.30.2
distfiles="${GNOME_SITE}/$pkgname/2.30/$pkgname-$version.tar.bz2"
version=2.32.0
distfiles="${GNOME_SITE}/$pkgname/2.32/$pkgname-$version.tar.bz2"
build_style=gnu_configure
configure_args="--disable-schemas-install --disable-scrollkeeper
--with-gconf-schema-file-dir=/usr/share/gconf/schemas
@ -10,7 +10,7 @@ configure_args="--disable-schemas-install --disable-scrollkeeper
--with-user=gdm --with-group=gdm --with-xevie"
short_desc="GNOME Display Manager"
maintainer="Juan RP <xtraeme@gmail.com>"
checksum=884f4816a78f8f1eece8f1468f19dc01c5350d4a3513d3c0e854f45f870c1ec5
checksum=f47acd19ed10d6fbb37c3e2b54f5b392c7020db67f71db3f75567ead30ab2fa4
long_desc="
GDM is the GNOME Display Manager, it is the little proggie that runs
in the background, runs your X sessions, presents you with a login box
@ -49,6 +49,8 @@ Add_dependency run libgnomecanvas
Add_dependency run libgnome
Add_dependency run popt
Add_dependency run libart
Add_dependency run libpng
Add_dependency run gdk-pixbuf
Add_dependency run gtk+
Add_dependency run atk
Add_dependency run pango