Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d3b5cffc authored by Alan Cox's avatar Alan Cox Committed by Live-CD User
Browse files

vt: add an activate and lock



X and other graphical interfaces need to be able to flip to a console
and lock it into graphics mode without races.

Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent a5eb5624
Loading
Loading
Loading
Loading
+37 −1
Original line number Diff line number Diff line
@@ -972,6 +972,41 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
		}
		break;

	case VT_SETACTIVATE:
	{
		struct vt_setactivate vsa;

		if (!perm)
			goto eperm;

		if (copy_from_user(&vsa, (struct vt_setactivate __user *)arg,
						sizeof(struct vt_setactivate)))
			return -EFAULT;
		if (vsa.console == 0 || vsa.console > MAX_NR_CONSOLES)
			ret = -ENXIO;
		else {
			vsa.console--;
			acquire_console_sem();
			ret = vc_allocate(vsa.console);
			if (ret == 0) {
				struct vc_data *nvc;
				/* This is safe providing we don't drop the
				   console sem between vc_allocate and
				   finishing referencing nvc */
				nvc = vc_cons[vsa.console].d;
				nvc->vt_mode = vsa.mode;
				nvc->vt_mode.frsig = 0;
				put_pid(nvc->vt_pid);
				nvc->vt_pid = get_pid(task_pid(current));
			}
			release_console_sem();
			if (ret)
				break;
			/* Commence switch and lock */
			set_console(arg);
		}
	}

	/*
	 * wait until the specified VT has been activated
	 */
@@ -1342,7 +1377,8 @@ void vc_SAK(struct work_struct *work)
}

/*
 * Performs the back end of a vt switch
 * Performs the back end of a vt switch. Called under the console
 * semaphore.
 */
static void complete_change_console(struct vc_data *vc)
{
+7 −0
Original line number Diff line number Diff line
@@ -77,4 +77,11 @@ struct vt_event {

#define VT_WAITEVENT	0x560E	/* Wait for an event */

struct vt_setactivate {
	unsigned int console;
	struct vt_mode mode;
};

#define VT_SETACTIVATE	0x560F	/* Activate and set the mode of a console */

#endif /* _LINUX_VT_H */