Re: [PATCH] Fix virt-viewer.exe on win32

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



ACK.

Unrelated, but data->channel seems to be leaked.

Christophe 

On Fri, Jan 24, 2014 at 04:55:58PM +0000, Daniel P. Berrange wrote:
> Libvirt uses gnulib for making winsock look like POSIX
> sockets. This means that in the libvirt event handle
> callbacks the application will be given a file descriptor
> rather than a winsock HANDLE object. The g_io_channel_unix_new
> method will detect that it is an FD and delegate to the
> g_io_channel_win32_new_fd method. Unfortunately the glib Win32
> event loop impl is not very good at dealing with FD objects,
> simulating poll() by doing a read() on the FD :-(
> 
> The API docs for g_io_channel_win32_new_fd say
> 
>  "All reads from the file descriptor should be done by
>   this internal GLib thread. Your code should call only
>   g_io_channel_read()."
> 
> This isn't going to fly for libvirt, since it has zero
> knowledge of glib at all, so is just doing normal read().
> 
> Fortunately we can work around this problem by turning
> the FD we get from libvirt back into a HANDLE using the
> _get_osfhandle() method.
> 
> Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx>
> ---
>  src/virt-viewer-events.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c
> index 216ed93..6d7fe9e 100644
> --- a/src/virt-viewer-events.c
> +++ b/src/virt-viewer-events.c
> @@ -26,6 +26,9 @@
>  #include <string.h>
>  #include <stdlib.h>
>  #include <glib.h>
> +#ifdef G_OS_WIN32
> +#include <io.h>
> +#endif
>  #include <libvirt/libvirt.h>
>  
>  #include "virt-viewer-events.h"
> @@ -96,7 +99,12 @@ int virt_viewer_events_add_handle(int fd,
>      data->events = events;
>      data->cb = cb;
>      data->opaque = opaque;
> +#ifdef G_OS_WIN32
> +    DEBUG_LOG("Converted fd %d to handle %d", fd, _get_osfhandle(fd));
> +    data->channel = g_io_channel_win32_new_socket(_get_osfhandle(fd));
> +#else
>      data->channel = g_io_channel_unix_new(fd);
> +#endif
>      data->ff = ff;
>  
>      DEBUG_LOG("Add handle %d %d %p", data->fd, events, data->opaque);
> -- 
> 1.8.4.2
> 
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list@xxxxxxxxxx
> https://www.redhat.com/mailman/listinfo/virt-tools-list

Attachment: pgp7tuR79miDB.pgp
Description: PGP signature

_______________________________________________
virt-tools-list mailing list
virt-tools-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/virt-tools-list

[Index of Archives]     [Linux Virtualization]     [KVM Development]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]     [Video 4 Linux]

  Powered by Linux