- if (gnutls_record_check_pending (ctx->session)
- || select_fd (fd, 0, WAIT_FOR_READ))
- ret = gnutls_record_recv (ctx->session, buf + offset, bufsize - offset);
- }
- while (ret == GNUTLS_E_INTERRUPTED);
+ if (gnutls_record_check_pending (ctx->session) <= 0
+ && select_fd (fd, 0.0, WAIT_FOR_READ) <= 0)
+ read = 0;
+ else
+ read = gnutls_record_recv (ctx->session, buf + offset,
+ bufsize - offset);
+
+ if (read < 0)
+ {
+ if (offset)
+ read = 0;
+ else
+ return read;
+ }