SHA256
1
0
forked from pool/gdm
gdm/gdm-2.17.7-vt-fallback.patch

64 lines
1.5 KiB
Diff

diff -upr gdm-2.19.5-pre/daemon/getvt.c gdm-2.19.5-post/daemon/getvt.c
--- gdm-2.19.5-pre/daemon/getvt.c 2007-07-30 13:51:14.000000000 -0500
+++ gdm-2.19.5-post/daemon/getvt.c 2007-08-03 20:14:13.000000000 -0500
@@ -181,8 +181,10 @@ get_free_vt_sys (int *vtfd)
int vtno;
unsigned short vtmask;
struct vt_stat vtstat;
+ guint v_state;
*vtfd = -1;
+ fdv = -1;
do {
errno = 0;
@@ -193,26 +195,33 @@ get_free_vt_sys (int *vtfd)
#endif
, 0);
} while G_UNLIKELY (errno == EINTR);
- if (fd < 0)
- return -1;
- if (ioctl (fd, VT_GETSTATE, &vtstat) < 0) {
- VE_IGNORE_EINTR (close (fd));
- return -1;
- }
+ if (fd >= 0 && ioctl (fd, VT_GETSTATE, &vtstat) >= 0)
+ v_state = vtstat.v_state;
+ else
+ v_state = 0;
- for (vtno = gdm_daemon_config_get_value_int (GDM_KEY_FIRST_VT), vtmask = 1 << vtno;
- vtstat.v_state & vtmask; vtno++, vtmask <<= 1);
- if (!vtmask) {
- VE_IGNORE_EINTR (close (fd));
- return -1;
+ for (vtno = gdm_daemon_config_get_value_int (GDM_KEY_FIRST_VT), 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. */
}
- fdv = open_vt (vtno);
- if (fdv < 0) {
+ if (fdv < 0)
+ vtno = -1;
+
+ if (fd >= 0) {
VE_IGNORE_EINTR (close (fd));
- return -1;
}
+
*vtfd = fdv;
return vtno;
}
Only in gdm-2.19.5-post: error.21177