diff options
| -rw-r--r-- | drivers/char/vt_ioctl.c | 39 | ||||
| -rw-r--r-- | include/linux/vt.h | 3 |
2 files changed, 22 insertions, 20 deletions
diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c index 6aa10284104a..87778dcf8727 100644 --- a/drivers/char/vt_ioctl.c +++ b/drivers/char/vt_ioctl.c | |||
| @@ -888,7 +888,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, | |||
| 888 | ret = -EFAULT; | 888 | ret = -EFAULT; |
| 889 | goto out; | 889 | goto out; |
| 890 | } | 890 | } |
| 891 | if (tmp.mode != VT_AUTO && tmp.mode != VT_PROCESS) { | 891 | if (tmp.mode != VT_AUTO && tmp.mode != VT_PROCESS && tmp.mode != VT_PROCESS_AUTO) { |
| 892 | ret = -EINVAL; | 892 | ret = -EINVAL; |
| 893 | goto out; | 893 | goto out; |
| 894 | } | 894 | } |
| @@ -1622,7 +1622,7 @@ static void complete_change_console(struct vc_data *vc) | |||
| 1622 | * telling it that it has acquired. Also check if it has died and | 1622 | * telling it that it has acquired. Also check if it has died and |
| 1623 | * clean up (similar to logic employed in change_console()) | 1623 | * clean up (similar to logic employed in change_console()) |
| 1624 | */ | 1624 | */ |
| 1625 | if (vc->vt_mode.mode == VT_PROCESS) { | 1625 | if (vc->vt_mode.mode == VT_PROCESS || vc->vt_mode.mode == VT_PROCESS_AUTO) { |
| 1626 | /* | 1626 | /* |
| 1627 | * Send the signal as privileged - kill_pid() will | 1627 | * Send the signal as privileged - kill_pid() will |
| 1628 | * tell us if the process has gone or something else | 1628 | * tell us if the process has gone or something else |
| @@ -1682,7 +1682,7 @@ void change_console(struct vc_data *new_vc) | |||
| 1682 | * vt to auto control. | 1682 | * vt to auto control. |
| 1683 | */ | 1683 | */ |
| 1684 | vc = vc_cons[fg_console].d; | 1684 | vc = vc_cons[fg_console].d; |
| 1685 | if (vc->vt_mode.mode == VT_PROCESS) { | 1685 | if (vc->vt_mode.mode == VT_PROCESS || vc->vt_mode.mode == VT_PROCESS_AUTO) { |
| 1686 | /* | 1686 | /* |
| 1687 | * Send the signal as privileged - kill_pid() will | 1687 | * Send the signal as privileged - kill_pid() will |
| 1688 | * tell us if the process has gone or something else | 1688 | * tell us if the process has gone or something else |
| @@ -1693,27 +1693,28 @@ void change_console(struct vc_data *new_vc) | |||
| 1693 | */ | 1693 | */ |
| 1694 | vc->vt_newvt = new_vc->vc_num; | 1694 | vc->vt_newvt = new_vc->vc_num; |
| 1695 | if (kill_pid(vc->vt_pid, vc->vt_mode.relsig, 1) == 0) { | 1695 | if (kill_pid(vc->vt_pid, vc->vt_mode.relsig, 1) == 0) { |
| 1696 | if(vc->vt_mode.mode == VT_PROCESS) | ||
| 1697 | /* | ||
| 1698 | * It worked. Mark the vt to switch to and | ||
| 1699 | * return. The process needs to send us a | ||
| 1700 | * VT_RELDISP ioctl to complete the switch. | ||
| 1701 | */ | ||
| 1702 | return; | ||
| 1703 | } else { | ||
| 1696 | /* | 1704 | /* |
| 1697 | * It worked. Mark the vt to switch to and | 1705 | * The controlling process has died, so we revert back to |
| 1698 | * return. The process needs to send us a | 1706 | * normal operation. In this case, we'll also change back |
| 1699 | * VT_RELDISP ioctl to complete the switch. | 1707 | * to KD_TEXT mode. I'm not sure if this is strictly correct |
| 1708 | * but it saves the agony when the X server dies and the screen | ||
| 1709 | * remains blanked due to KD_GRAPHICS! It would be nice to do | ||
| 1710 | * this outside of VT_PROCESS but there is no single process | ||
| 1711 | * to account for and tracking tty count may be undesirable. | ||
| 1700 | */ | 1712 | */ |
| 1701 | return; | 1713 | reset_vc(vc); |
| 1702 | } | 1714 | } |
| 1703 | 1715 | ||
| 1704 | /* | 1716 | /* |
| 1705 | * The controlling process has died, so we revert back to | 1717 | * Fall through to normal (VT_AUTO and VT_PROCESS_AUTO) handling of the switch... |
| 1706 | * normal operation. In this case, we'll also change back | ||
| 1707 | * to KD_TEXT mode. I'm not sure if this is strictly correct | ||
| 1708 | * but it saves the agony when the X server dies and the screen | ||
| 1709 | * remains blanked due to KD_GRAPHICS! It would be nice to do | ||
| 1710 | * this outside of VT_PROCESS but there is no single process | ||
| 1711 | * to account for and tracking tty count may be undesirable. | ||
| 1712 | */ | ||
| 1713 | reset_vc(vc); | ||
| 1714 | |||
| 1715 | /* | ||
| 1716 | * Fall through to normal (VT_AUTO) handling of the switch... | ||
| 1717 | */ | 1718 | */ |
| 1718 | } | 1719 | } |
| 1719 | 1720 | ||
diff --git a/include/linux/vt.h b/include/linux/vt.h index d5dd0bc408fd..778b7b2a47d4 100644 --- a/include/linux/vt.h +++ b/include/linux/vt.h | |||
| @@ -27,7 +27,7 @@ struct vt_mode { | |||
| 27 | #define VT_SETMODE 0x5602 /* set mode of active vt */ | 27 | #define VT_SETMODE 0x5602 /* set mode of active vt */ |
| 28 | #define VT_AUTO 0x00 /* auto vt switching */ | 28 | #define VT_AUTO 0x00 /* auto vt switching */ |
| 29 | #define VT_PROCESS 0x01 /* process controls switching */ | 29 | #define VT_PROCESS 0x01 /* process controls switching */ |
| 30 | #define VT_ACKACQ 0x02 /* acknowledge switch */ | 30 | #define VT_PROCESS_AUTO 0x02 /* process is notified of switching */ |
| 31 | 31 | ||
| 32 | struct vt_stat { | 32 | struct vt_stat { |
| 33 | unsigned short v_active; /* active vt */ | 33 | unsigned short v_active; /* active vt */ |
| @@ -38,6 +38,7 @@ struct vt_stat { | |||
| 38 | #define VT_SENDSIG 0x5604 /* signal to send to bitmask of vts */ | 38 | #define VT_SENDSIG 0x5604 /* signal to send to bitmask of vts */ |
| 39 | 39 | ||
| 40 | #define VT_RELDISP 0x5605 /* release display */ | 40 | #define VT_RELDISP 0x5605 /* release display */ |
| 41 | #define VT_ACKACQ 0x02 /* acknowledge switch */ | ||
| 41 | 42 | ||
| 42 | #define VT_ACTIVATE 0x5606 /* make vt active */ | 43 | #define VT_ACTIVATE 0x5606 /* make vt active */ |
| 43 | #define VT_WAITACTIVE 0x5607 /* wait for vt active */ | 44 | #define VT_WAITACTIVE 0x5607 /* wait for vt active */ |
