gnutls_certificate_credentials_t cred;
gnutls_session session;
gboolean established;
+ gboolean again;
};
struct _GIOGnuTLSWatch {
DBG("channel %p", channel);
-again:
if (gnutls_channel->established == TRUE)
return G_IO_STATUS_NORMAL;
+again:
result = gnutls_handshake(gnutls_channel->session);
if (result == GNUTLS_E_INTERRUPTED || result == GNUTLS_E_AGAIN) {
GIOFlags flags = g_io_channel_get_flags(channel);
+ if (gnutls_channel->again == TRUE)
+ return G_IO_STATUS_AGAIN;
+
if (flags & G_IO_FLAG_NONBLOCK)
return G_IO_STATUS_AGAIN;
if (result == GNUTLS_E_INTERRUPTED || result == GNUTLS_E_AGAIN) {
GIOFlags flags = g_io_channel_get_flags(channel);
+ if (gnutls_channel->again == TRUE)
+ return G_IO_STATUS_AGAIN;
+
if (flags & G_IO_FLAG_NONBLOCK)
return G_IO_STATUS_AGAIN;
if (result == GNUTLS_E_INTERRUPTED || result == GNUTLS_E_AGAIN) {
GIOFlags flags = g_io_channel_get_flags(channel);
+ if (gnutls_channel->again == TRUE)
+ return G_IO_STATUS_AGAIN;
+
if (flags & G_IO_FLAG_NONBLOCK)
return G_IO_STATUS_AGAIN;
result = write(fd, buf, count);
+ if (result < 0 && errno == EAGAIN)
+ gnutls_channel->again = TRUE;
+ else
+ gnutls_channel->again = FALSE;
+
DBG("result %zd", result);
return result;
result = read(fd, buf, count);
+ if (result < 0 && errno == EAGAIN)
+ gnutls_channel->again = TRUE;
+ else
+ gnutls_channel->again = FALSE;
+
DBG("result %zd", result);
return result;