64 lines
1.5 KiB
Diff
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
|