On Tue, Jun 17, 2014 at 3:45 PM, Lavrentiev, Anton (NIH/NLM/NCBI) [C]
<[email protected]> wrote:
>> as there are more cases where GNUTLS_E_AGAIN doesn't directly map to EAGAIN 
>> errno.
> Studying the current GNUTLS source, it looks like the added case is for 
> exactly short writes,
> which errno_to_gerr() supports.  The other place is for short read, but since 
> the pull
> callback is wrapped into the "while (left > 0)" loop (gnutls_stream_read), it 
> is a legitimate
> case, which also maps correctly.  I still can't understand why the similar 
> loop "while (left > 0)"
> was dropped off gnutls_io_write_flush (formerly part of 
> gnutls_io_write_buffered) between 2.x and 3.x.
> Anyhow, I'm going to modify our push callback behavior to do a tight loop 
> around the former
> push callback.  Doing so I notice that reading and writing are no longer 
> symmetrical:
> the pull callback does not require the looping on short reads as it will be 
> done by GNUTLS,
> and the push callback requires the looping because GNUTLS now bails out on 
> short writes.

I believe the reason was, that if there was a short send(), that is
equivalent to try again (EAGAIN), or the underlying layer would have
to block to send the rest. Thus it looked more efficient to return
GNUTLS_E_AGAIN rather than retrying, and making immediately after the
short send() a new system call that would fail with EAGAIN.

regards,
Nikos

_______________________________________________
Gnutls-help mailing list
[email protected]
http://lists.gnupg.org/mailman/listinfo/gnutls-help

Reply via email to