#define X509_getm_notBefore X509_get_notBefore
#define X509_getm_notAfter X509_get_notAfter
#define X509_STORE_CTX_get0_chain X509_STORE_CTX_get_chain
+#define SSL_has_pending SSL_pending
#endif
#undef _
static int add_entropy (const char *file);
static int ssl_socket_read (CONNECTION* conn, char* buf, size_t len);
static int ssl_socket_write (CONNECTION* conn, const char* buf, size_t len);
+static int ssl_socket_poll (CONNECTION* conn, time_t wait_secs);
static int ssl_socket_open (CONNECTION * conn);
static int ssl_socket_close (CONNECTION * conn);
static int tls_close (CONNECTION* conn);
conn->conn_read = ssl_socket_read;
conn->conn_write = ssl_socket_write;
conn->conn_close = tls_close;
+ conn->conn_poll = ssl_socket_poll;
conn->ssf = SSL_CIPHER_get_bits (SSL_get_current_cipher (ssldata->ssl),
&maxbits);
conn->conn_read = ssl_socket_read;
conn->conn_write = ssl_socket_write;
conn->conn_close = ssl_socket_close;
- conn->conn_poll = raw_socket_poll;
+ conn->conn_poll = ssl_socket_poll;
return 0;
}
return rc;
}
+static int ssl_socket_poll (CONNECTION* conn, time_t wait_secs)
+{
+ sslsockdata *data = conn->sockdata;
+
+ if (SSL_has_pending (data->ssl))
+ return 1;
+ else
+ return raw_socket_poll (conn, wait_secs);
+}
+
static int ssl_socket_open (CONNECTION * conn)
{
sslsockdata *data;
conn->conn_read = raw_socket_read;
conn->conn_write = raw_socket_write;
conn->conn_close = raw_socket_close;
+ conn->conn_poll = raw_socket_poll;
return rc;
}
/* local prototypes */
static int tls_socket_read (CONNECTION* conn, char* buf, size_t len);
static int tls_socket_write (CONNECTION* conn, const char* buf, size_t len);
+static int tls_socket_poll (CONNECTION* conn, time_t wait_secs);
static int tls_socket_open (CONNECTION* conn);
static int tls_socket_close (CONNECTION* conn);
static int tls_starttls_close (CONNECTION* conn);
conn->conn_read = tls_socket_read;
conn->conn_write = tls_socket_write;
conn->conn_close = tls_socket_close;
- conn->conn_poll = raw_socket_poll;
+ conn->conn_poll = tls_socket_poll;
return 0;
}
return sent;
}
+static int tls_socket_poll (CONNECTION* conn, time_t wait_secs)
+{
+ tlssockdata *data = conn->sockdata;
+
+ if (gnutls_record_check_pending (data->state))
+ return 1;
+ else
+ return raw_socket_poll (conn, wait_secs);
+}
+
static int tls_socket_open (CONNECTION* conn)
{
if (raw_socket_open (conn) < 0)
conn->conn_read = tls_socket_read;
conn->conn_write = tls_socket_write;
conn->conn_close = tls_starttls_close;
+ conn->conn_poll = tls_socket_poll;
return 0;
}
conn->conn_read = raw_socket_read;
conn->conn_write = raw_socket_write;
conn->conn_close = raw_socket_close;
+ conn->conn_poll = raw_socket_poll;
return rc;
}