Changelog
+Daniel (16 December 2006)
+- Brendan Jurd provided a fix that now prevents libcurl from getting a SIGPIPE
+ during certain conditions when GnuTLS is used.
+
Daniel (11 December 2006)
- Alexey Simak found out that when doing FTP with the multi interface and
something went wrong like it got a bad response code back from the server,
o rate limiting works better
o getting FTP response code errors when using the multi-interface caused
libcurl to leak memory
+ o no more SIGPIPE when GnuTLS is used
Other curl-related news:
James Housley, Olaf Stueben, Yang Tse, Gisle Vanem, Bradford Bruce,
Ciprian Badescu, Dmitriy Sergeyev, Nir Soffer, Venkat Akella, Toon Verwaest,
Matt Witherspoon, Alexey Simak, Martin Skinner, Sh Diao, Jared Lundell,
- Stefan Krause, Sebastien Willemijns, Alexey Simak
+ Stefan Krause, Sebastien Willemijns, Alexey Simak, Brendan Jurd
Thanks! (and sorry if I forgot to mention someone)
}
#endif
+/*
+ * Custom push and pull callback functions used by GNU TLS to read and write
+ * to the socket. These functions are simple wrappers to send() and recv()
+ * (although here using the sread/swrite macros as defined by setup_once.h).
+ * We use custom functions rather than the GNU TLS defaults because it allows
+ * us to get specific about the fourth "flags" argument, and to use arbitrary
+ * private data with gnutls_transport_set_ptr if we wish.
+ */
+static ssize_t Curl_gtls_push(void *s, const void *buf, size_t len)
+{
+ return swrite(s, buf, len);
+}
+
+static ssize_t Curl_gtls_pull(void *s, void *buf, size_t len)
+{
+ return sread(s, buf, len);
+}
/* Global GnuTLS init, called from Curl_ssl_init() */
int Curl_gtls_init(void)
gnutls_transport_set_ptr(session,
(gnutls_transport_ptr)conn->sock[sockindex]);
+ /* register callback functions to send and receive data. */
+ gnutls_transport_set_push_function(session, Curl_gtls_push);
+ gnutls_transport_set_pull_function(session, Curl_gtls_pull);
+
+ /* lowat must be set to zero when using custom push and pull functions. */
+ gnutls_transport_set_lowat(session, 0);
+
/* This might be a reconnect, so we check for a session ID in the cache
to speed up things */