Solaris: Avoid switching to inactive VT's

Fix for OpenSolaris bug 6876992: "[vconsole] Ctrl+Alt+F12 switchs to blank
console screen with hotkeys property turned-off"
http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6876992

Xorg needs to do sanity test for the VT it is commanded to switch to.
If the VT is not opened by any process, discard the switching request.

The changes also contain the fix for some flaws discovered when
getting the new gdm to run.

Signed-off-by: Aaron Zang <Aaron.Zang@Sun.COM>
Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
This commit is contained in:
Aaron Zang 2009-12-14 17:55:46 -08:00 committed by Alan Coopersmith
parent d9c20ee419
commit 15ca3312c0
3 changed files with 45 additions and 14 deletions

View File

@ -202,8 +202,16 @@ xf86ProcessActionEvent(ActionEvent action, void *arg)
vtno--; vtno--;
#endif #endif
#if defined(sun) #if defined(sun)
if (vtno == xf86Info.vtno) if (vtno == xf86Info.vtno) {
break; break;
} else {
struct vt_stat state;
if (ioctl(xf86Info.consoleFd, VT_GETSTATE, &state) < 0)
break;
if ((state.v_state & (1 << vtno)) == 0)
break;
}
xf86Info.vtRequestsPending = TRUE; xf86Info.vtRequestsPending = TRUE;
xf86Info.vtPendingNum = vtno; xf86Info.vtPendingNum = vtno;

View File

@ -38,17 +38,27 @@
* Handle the VT-switching interface for Solaris/OpenSolaris * Handle the VT-switching interface for Solaris/OpenSolaris
*/ */
static int xf86VTPruneDoor = 0;
void void
xf86VTRequest(int sig) xf86VTRelease(int sig)
{ {
if (xf86Info.vtPendingNum != -1) if (xf86Info.vtPendingNum == -1)
{ {
xf86VTPruneDoor = 1;
xf86Info.vtRequestsPending = TRUE;
return;
}
ioctl(xf86Info.consoleFd, VT_RELDISP, 1); ioctl(xf86Info.consoleFd, VT_RELDISP, 1);
xf86Info.vtPendingNum = -1; xf86Info.vtPendingNum = -1;
return; return;
} }
void
xf86VTAcquire(int sig)
{
xf86Info.vtRequestsPending = TRUE; xf86Info.vtRequestsPending = TRUE;
return; return;
} }
@ -68,6 +78,12 @@ xf86VTSwitchAway(void)
xf86Info.vtRequestsPending = FALSE; xf86Info.vtRequestsPending = FALSE;
if (xf86VTPruneDoor) {
xf86VTPruneDoor = 0;
ioctl(xf86Info.consoleFd, VT_RELDISP, 1);
return (TRUE);
}
vt_door_arg.vt_ev = VT_EV_HOTKEYS; vt_door_arg.vt_ev = VT_EV_HOTKEYS;
vt_door_arg.vt_num = xf86Info.vtPendingNum; vt_door_arg.vt_num = xf86Info.vtPendingNum;
door_arg.data_ptr = (char *)&vt_door_arg; door_arg.data_ptr = (char *)&vt_door_arg;

View File

@ -39,6 +39,8 @@ static Bool Protect0 = FALSE;
static int VTnum = -1; static int VTnum = -1;
static int xf86StartVT = -1; static int xf86StartVT = -1;
static int vtEnabled = 0; static int vtEnabled = 0;
extern void xf86VTAcquire(int);
extern void xf86VTRelease(int);
#endif #endif
/* Device to open as xf86Info.consoleFd */ /* Device to open as xf86Info.consoleFd */
@ -137,7 +139,8 @@ xf86OpenConsole(void)
else else
{ {
if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) || if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) ||
(xf86Info.vtno == -1)) { (xf86Info.vtno == -1))
{
FatalError("xf86OpenConsole: Cannot find a free VT\n"); FatalError("xf86OpenConsole: Cannot find a free VT\n");
} }
} }
@ -146,7 +149,8 @@ xf86OpenConsole(void)
snprintf(consoleDev, PATH_MAX, "/dev/vt/%d", xf86Info.vtno); snprintf(consoleDev, PATH_MAX, "/dev/vt/%d", xf86Info.vtno);
} }
if (fd != -1) { if (fd != -1)
{
close(fd); close(fd);
} }
@ -178,11 +182,12 @@ xf86OpenConsole(void)
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0) if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0)
FatalError("xf86OpenConsole: VT_GETMODE failed\n"); FatalError("xf86OpenConsole: VT_GETMODE failed\n");
OsSignal(SIGUSR1, xf86VTRequest); OsSignal(SIGUSR1, xf86VTAcquire);
OsSignal(SIGUSR2, xf86VTRelease);
VT.mode = VT_PROCESS; VT.mode = VT_PROCESS;
VT.relsig = SIGUSR1;
VT.acqsig = SIGUSR1; VT.acqsig = SIGUSR1;
VT.relsig = SIGUSR2;
if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0) if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0)
FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n"); FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n");
@ -204,7 +209,8 @@ xf86OpenConsole(void)
else /* serverGeneration != 1 */ else /* serverGeneration != 1 */
{ {
#ifdef HAS_USL_VTS #ifdef HAS_USL_VTS
if (vtEnabled) { if (vtEnabled)
{
/* /*
* Now re-get the VT * Now re-get the VT
*/ */
@ -285,7 +291,8 @@ xf86CloseConsole(void)
#endif #endif
#ifdef HAS_USL_VTS #ifdef HAS_USL_VTS
if (vtEnabled == 1) { if (vtEnabled)
{
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1) if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1)
{ {
VT.mode = VT_AUTO; /* Set default vt handling */ VT.mode = VT_AUTO; /* Set default vt handling */