
On 11/22/2010 01:42 PM, Matthias Bolte wrote:
This doesn't entirely make any sense to me. GNUTLS also uses GNULIB, including all its socket wrappers for send/recv. If the push/pull function is NULL, gnulib does this
if (session->internals._gnutls_push_func == NULL) { i = send (GNUTLS_POINTER_TO_INT (fd), &ptr[n - left], left, 0);
Okay, yes GnuTLS uses gnulib, but they explicitly don't use gnulib's replacements for send() and recv() on Windows. See lib/gnutls_buffers.c:
/* We need to disable gnulib's replacement wrappers to get native Windows interfaces. */ #undef recv #undef send
GnuTLS decided to use the native Windows versions of send() and recv(). This cannot be changed, as that would break existing applications using GnuTLS on Windows relying on GnuTLS using the native Windows versions of send() and recv(). Therefore, I think my patch is necessary, as libvirt requires GnuTLS to use gnulib's replacement functions.
Makes sense to me. However, why the double cast? +#if HAVE_WINSOCK2_H +static ssize_t +custom_gnutls_push(void *s, const void *buf, size_t len) +{ + return send((int)(long)s, buf, len, 0); +} + +static ssize_t +custom_gnutls_pull(void *s, void *buf, size_t len) +{ + return recv((int)(long)s, buf, len, 0); +} +#endif Wouldn't send((size_t)s, ...) be better than send((int)(long)s,...)? -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org