63 lines
1.5 KiB
Diff
63 lines
1.5 KiB
Diff
diff -upr gdm-2.17.7-pre/daemon/getvt.c gdm-2.17.7-post/daemon/getvt.c
|
|
--- gdm-2.17.7-pre/daemon/getvt.c 2007-02-11 23:40:19.000000000 -0600
|
|
+++ gdm-2.17.7-post/daemon/getvt.c 2007-03-20 16:25:35.000000000 -0600
|
|
@@ -90,8 +90,10 @@ get_free_vt_linux (int *vtfd)
|
|
int vtno;
|
|
unsigned short vtmask;
|
|
struct vt_stat vtstat;
|
|
+ guint v_state;
|
|
|
|
*vtfd = -1;
|
|
+ fdv = -1;
|
|
|
|
do {
|
|
errno = 0;
|
|
@@ -101,26 +103,33 @@ get_free_vt_linux (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_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_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;
|
|
}
|