return ret;
}
+inline static
+int errno_to_gerr(int err)
+{
+ switch(err)
+ {
+ case EAGAIN:
+ return GNUTLS_E_AGAIN;
+ case EINTR:
+ return GNUTLS_E_INTERRUPTED;
+ case EMSGSIZE:
+ return GNUTLS_E_LARGE_PACKET;
+ default:
+ gnutls_assert ();
+ return GNUTLS_E_PUSH_ERROR;
+ }
+}
+
static ssize_t
_gnutls_dgram_read (gnutls_session_t session, mbuffer_st **bufel,
gnutls_pull_func pull_func)
_gnutls_read_log ("READ: %d returned from %p, errno=%d gerrno=%d\n",
(int) i, fd, errno, session->internals.errnum);
- switch(err)
- {
- case EAGAIN:
- ret = GNUTLS_E_AGAIN;
- goto cleanup;
- case EINTR:
- ret = GNUTLS_E_INTERRUPTED;
- goto cleanup;
- case EMSGSIZE:
- ret = GNUTLS_E_LARGE_PACKET;
- default:
- gnutls_assert ();
- ret = GNUTLS_E_PULL_ERROR;
- }
+ ret = errno_to_gerr(err);
goto cleanup;
}
else
goto finish;
}
- if (err == EAGAIN)
- return GNUTLS_E_AGAIN;
- return GNUTLS_E_INTERRUPTED;
+ return errno_to_gerr(err);
}
else
{
return ret;
}
+
static ssize_t
_gnutls_writev (gnutls_session_t session, const giovec_t * giovec,
int giovec_cnt)
{
int err = get_errno (session);
_gnutls_debug_log ("errno: %d\n", err);
- if (err == EAGAIN)
- return GNUTLS_E_AGAIN;
- else if (err == EINTR)
- return GNUTLS_E_INTERRUPTED;
- else
- {
- gnutls_assert ();
- return GNUTLS_E_PUSH_ERROR;
- }
+
+ return errno_to_gerr(err);
}
return i;
}
(int) send_buffer->byte_length);
return ret;
}
+ else if (ret == GNUTLS_E_LARGE_PACKET)
+ {
+ _mbuffer_head_remove_bytes (send_buffer, tosend);
+ _gnutls_write_log ("WRITE cannot send large packet (%u bytes).\n",
+ (unsigned int) tosend);
+ return ret;
+ }
else
{
_gnutls_write_log ("WRITE error: code %d, %d bytes left.\n",