summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2013-09-02 16:08:35 +0300
committerAlon Levy <alevy@redhat.com>2013-09-03 00:09:27 +0300
commit21175d0701a8e8d838a8ec18690ef39620fef875 (patch)
tree4088d7a35b6135690501aced711b5faaca157e44
parent14e28e2dc6d867a6ac55b75a0b21a1f7e25b5f49 (diff)
downloadvd_agent-21175d0701a8e8d838a8ec18690ef39620fef875.tar.gz
vd_agent-21175d0701a8e8d838a8ec18690ef39620fef875.tar.xz
vd_agent-21175d0701a8e8d838a8ec18690ef39620fef875.zip
vdagentd: support fake uinput
This is used with Xspice. Fake means we open a pipe for write only, and don't do any ioctls on it. Specifically it means the axis and buttons have to be coordinated for now with Xspice (xf86-video-qxl). Signed-off-by: Alon Levy <alevy@redhat.com>
-rw-r--r--src/vdagentd-uinput.c11
-rw-r--r--src/vdagentd-uinput.h2
-rw-r--r--src/vdagentd.c14
3 files changed, 21 insertions, 6 deletions
diff --git a/src/vdagentd-uinput.c b/src/vdagentd-uinput.c
index a415f9c..47e1b45 100644
--- a/src/vdagentd-uinput.c
+++ b/src/vdagentd-uinput.c
@@ -42,12 +42,13 @@ struct vdagentd_uinput {
struct vdagentd_guest_xorg_resolution *screen_info;
int screen_count;
VDAgentMouseState last;
+ int fake;
};
struct vdagentd_uinput *vdagentd_uinput_create(const char *devname,
int width, int height,
struct vdagentd_guest_xorg_resolution *screen_info, int screen_count,
- int debug)
+ int debug, int fake)
{
struct vdagentd_uinput *uinput;
@@ -58,6 +59,7 @@ struct vdagentd_uinput *vdagentd_uinput_create(const char *devname,
uinput->devname = devname;
uinput->fd = -1; /* Gets opened by vdagentd_uinput_update_size() */
uinput->debug = debug;
+ uinput->fake = fake;
vdagentd_uinput_update_size(&uinput, width, height,
screen_info, screen_count);
@@ -119,13 +121,18 @@ void vdagentd_uinput_update_size(struct vdagentd_uinput **uinputp,
return;
#endif
- uinput->fd = open(uinput->devname, O_RDWR);
+ uinput->fd = open(uinput->devname, uinput->fake ? O_WRONLY : O_RDWR);
if (uinput->fd == -1) {
syslog(LOG_ERR, "open %s: %m", uinput->devname);
vdagentd_uinput_destroy(uinputp);
return;
}
+ if (uinput->fake) {
+ /* fake device doesn't understand any ioctls and only writes events */
+ return;
+ }
+
rc = write(uinput->fd, &device, sizeof(device));
if (rc != sizeof(device)) {
syslog(LOG_ERR, "write %s: %m", uinput->devname);
diff --git a/src/vdagentd-uinput.h b/src/vdagentd-uinput.h
index 81f0376..b9bd9f1 100644
--- a/src/vdagentd-uinput.h
+++ b/src/vdagentd-uinput.h
@@ -30,7 +30,7 @@ struct vdagentd_uinput;
struct vdagentd_uinput *vdagentd_uinput_create(const char *devname,
int width, int height,
struct vdagentd_guest_xorg_resolution *screen_info, int screen_count,
- int debug);
+ int debug, int fake);
void vdagentd_uinput_destroy(struct vdagentd_uinput **uinputp);
void vdagentd_uinput_do_mouse(struct vdagentd_uinput **uinputp,
diff --git a/src/vdagentd.c b/src/vdagentd.c
index 2288671..cfb7acc 100644
--- a/src/vdagentd.c
+++ b/src/vdagentd.c
@@ -58,6 +58,7 @@ static const char *portdev = "/dev/virtio-ports/com.redhat.spice.0";
static const char *vdagentd_socket = VDAGENTD_SOCKET;
static const char *uinput_device = "/dev/uinput";
static int debug = 0;
+static int uinput_fake = 0;
static struct udscs_server *server = NULL;
static struct vdagent_virtio_port *virtio_port = NULL;
static GHashTable *active_xfers = NULL;
@@ -317,7 +318,8 @@ int virtio_port_read_complete(
agent_data->height,
agent_data->screen_info,
agent_data->screen_count,
- debug > 1);
+ debug > 1,
+ uinput_fake);
if (!uinput) {
syslog(LOG_CRIT, "Fatal uinput error");
retval = 1;
@@ -488,7 +490,8 @@ static void check_xorg_resolution(void)
agent_data->height,
agent_data->screen_info,
agent_data->screen_count,
- debug > 1);
+ debug > 1,
+ uinput_fake);
else
vdagentd_uinput_update_size(&uinput,
agent_data->width,
@@ -867,6 +870,11 @@ int main(int argc, char *argv[])
}
}
+ if (strncmp(uinput_device, "/dev", 4) != 0) {
+ syslog(LOG_INFO, "using fake uinput");
+ uinput_fake = 1;
+ }
+
memset(&act, 0, sizeof(act));
act.sa_flags = SA_RESTART;
act.sa_handler = quit_handler;
@@ -899,7 +907,7 @@ int main(int argc, char *argv[])
#ifdef WITH_STATIC_UINPUT
uinput = vdagentd_uinput_create(uinput_device, 1024, 768, NULL, 0,
- debug > 1);
+ debug > 1, uinput_fake);
if (!uinput) {
udscs_destroy_server(server);
return 1;