uvtd: vt: implement ioctl dummies

Add dummies for the ioctl VT callbacks. Also implement the KD-MODE and
KB-MODE state tracking as it is fairly trivial.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
David Herrmann 2013-03-06 17:33:39 +01:00
parent 724afe8c1a
commit 5c7184f797

View File

@ -31,8 +31,13 @@
#include <errno.h>
#include <inttypes.h>
#include <linux/kd.h>
#include <linux/vt.h>
#include <stdlib.h>
#include <string.h>
#include <termio.h>
#include <termios.h>
#include <unistd.h>
#include "shl_hook.h"
#include "shl_log.h"
#include "uvt.h"
@ -47,6 +52,9 @@ struct uvtd_vt {
struct shl_hook *hook;
struct uvtd_session *session;
bool is_legacy;
unsigned int mode;
unsigned int kbmode;
};
static void vt_hup(struct uvtd_vt *vt)
@ -97,6 +105,8 @@ int uvtd_vt_new(struct uvtd_vt **out, struct uvt_ctx *uctx, unsigned int id,
vt->ref = 1;
vt->uctx = uctx;
vt->is_legacy = is_legacy;
vt->mode = KD_TEXT;
vt->kbmode = K_UNICODE;
ret = shl_hook_new(&vt->hook);
if (ret)
@ -168,6 +178,113 @@ unsigned int uvtd_vt_poll(struct uvtd_vt *vt)
return UVT_TTY_WRITE;
}
static int vt_ioctl_TCFLSH(void *data, unsigned long arg)
{
switch (arg) {
case TCIFLUSH:
case TCOFLUSH:
case TCIOFLUSH:
break;
default:
return -EINVAL;
}
return 0;
}
static int vt_ioctl_VT_ACTIVATE(void *data, unsigned long arg)
{
return -EINVAL;
}
static int vt_ioctl_VT_WAITACTIVE(void *data, unsigned long arg)
{
return -EINVAL;
}
static int vt_ioctl_VT_GETSTATE(void *data, struct vt_stat *arg)
{
return -EINVAL;
}
static int vt_ioctl_VT_OPENQRY(void *data, unsigned int *arg)
{
return -EINVAL;
}
static int vt_ioctl_VT_GETMODE(void *data, struct vt_mode *arg)
{
return -EINVAL;
}
static int vt_ioctl_VT_SETMODE(void *data, const struct vt_mode *arg)
{
return -EINVAL;
}
static int vt_ioctl_VT_RELDISP(void *data, unsigned long arg)
{
return -EINVAL;
}
static int vt_ioctl_KDGETMODE(void *data, unsigned int *arg)
{
struct uvtd_vt *vt = data;
*arg = vt->mode;
return 0;
}
static int vt_ioctl_KDSETMODE(void *data, unsigned int arg)
{
struct uvtd_vt *vt = data;
switch (arg) {
case KD_TEXT0:
case KD_TEXT1:
arg = KD_TEXT;
/* fallthrough */
case KD_TEXT:
case KD_GRAPHICS:
vt->mode = arg;
break;
default:
return -EINVAL;
}
return 0;
}
static int vt_ioctl_KDGKBMODE(void *data, unsigned int *arg)
{
struct uvtd_vt *vt = data;
*arg = vt->kbmode;
return 0;
}
static int vt_ioctl_KDSKBMODE(void *data, unsigned int arg)
{
struct uvtd_vt *vt = data;
switch (arg) {
case K_RAW:
/* TODO: what does K_RAW do? */
case K_UNICODE:
case K_OFF:
vt->kbmode = arg;
break;
case K_XLATE:
case K_MEDIUMRAW:
/* TODO: do we need these? */
return -EOPNOTSUPP;
default:
return -EINVAL;
}
return 0;
}
/* compatibility to UVT-VT ops */
static void vt_ref(void *vt)
@ -213,4 +330,18 @@ struct uvt_vt_ops uvtd_vt_ops = {
.read = vt_read,
.write = vt_write,
.poll = vt_poll,
.ioctl_TCFLSH = vt_ioctl_TCFLSH,
.ioctl_VT_ACTIVATE = vt_ioctl_VT_ACTIVATE,
.ioctl_VT_WAITACTIVE = vt_ioctl_VT_WAITACTIVE,
.ioctl_VT_GETSTATE = vt_ioctl_VT_GETSTATE,
.ioctl_VT_OPENQRY = vt_ioctl_VT_OPENQRY,
.ioctl_VT_GETMODE = vt_ioctl_VT_GETMODE,
.ioctl_VT_SETMODE = vt_ioctl_VT_SETMODE,
.ioctl_VT_RELDISP = vt_ioctl_VT_RELDISP,
.ioctl_KDGETMODE = vt_ioctl_KDGETMODE,
.ioctl_KDSETMODE = vt_ioctl_KDSETMODE,
.ioctl_KDGKBMODE = vt_ioctl_KDGKBMODE,
.ioctl_KDSKBMODE = vt_ioctl_KDSKBMODE,
};