2013/12/5 Tom Lane <tgl@sss.pgh.pa.us>
> Alexander Kukushkin <cyberdemn@gmail.com> writes:
> > After analysing source code of postgres and openssl I've found (at least
> I
> > think) the reason why it is happening:
> >
>
----------------------------------------------------------------------------------------------------------------------------
> > static int
> > my_sock_write(BIO *h, const char *buf, int size)
> > {
> > int res = 0;
>
> > res = send(h->num, buf, size, 0);
> > if (res <= 0)
> > {
> > if (errno == EINTR)
> > {
> > BIO_set_retry_write(h);
> > }
> > }
>
> > return res;
> > }
>
> BTW, I was looking at that function the other day and thinking it was
> wrong: if the send() returns exactly zero, it hasn't set errno has it?
> But perhaps that case never arises.
>
> regards, tom lane
>
According to documentation, "On success, these calls return the number of
characters sent. On error, -1 is returned, and errno is set appropriately."
So, return zero is not an error and errno should not be set.
I guess you could get zero only in case when you are sending an empty
buffer or in nonblocking mode, which obviously is not the case.
But, returning to my original message... I noticed that I've made stupid
copy&paste error
static int
my_sock_write(BIO *h, const char *buf, int size)
{
int res = 0;
res = send(h->num, buf, size, 0);
+ BIO_clear_retry_flags(h); // <-- here, should be "h" not "b" as in
original message.
if (res <= 0)
{
if (errno == EINTR)
{
BIO_set_retry_write(h);
}
Best regards,
Alexander Kukushkin