Skip to content
  • Michael Roth's avatar
    qemu-ga: add initial win32 support · 7868e26e
    Michael Roth authored
    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.
    7868e26e