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(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org