qemu-ga: add initial win32 support
commit7868e26e5930f49ca942311885776b938dcf3b77
authorMichael Roth <mdroth@linux.vnet.ibm.com>
Sat, 21 Jan 2012 01:01:30 +0000 (20 19:01 -0600)
committerMichael Roth <mdroth@linux.vnet.ibm.com>
Thu, 23 Feb 2012 21:43:49 +0000 (23 15:43 -0600)
treed1fad8cd6f57209d7812d55dd5fe13d2460a05df
parentd8ca685acbd06b5cccd9fcd7866ded1f453b8311
qemu-ga: add initial win32 support

This adds a win32 channel implementation that makes qemu-ga functional
on Windows using virtio-serial (unix-listen/isa-serial not currently
implemented). Unlike with the posix implementation, we do not use
GIOChannel for the following reasons:

 - glib calls stat() on an fd to check whether S_IFCHR is set, which is
   the case for virtio-serial on win32. Because of that, a one-time
   check to determine whether the channel is readable is done by making
   a call to PeekConsoleInput(), which reports the underlying handle is
   not a valid console handle, and thus we can never read from the
   channel.

 - if one goes as far as to "trick" glib into thinking it is a normal
   file descripter, the buffering is done in such a way that data
   written to the output stream will subsequently result in that same
   data being read back as if it were input, causing an error loop.
   furthermore, a forced flush of the channel only moves the data into a
   secondary buffer managed by glib, so there's no way to prevent output
   from getting read back as input.

The implementation here ties into the glib main loop by implementing a
custom GSource that continually submits asynchronous/overlapped I/O to
fill an GAChannel-managed read buffer, and tells glib to poll the
corresponding event handle for a completion whenever there is no
data/RPC in the read buffer to notify the main application about.
Makefile.objs
qemu-ga.c
qga/channel-win32.c [new file with mode: 0644]