/* * Write data to a secure connection. */ ssize_t secure_write(Port *port, void *ptr, size_t len) { ssize_t n; int waitfor; retry: waitfor = 0; #ifdef USE_SSL if (port->ssl_in_use) { n = be_tls_write(port, ptr, len, &waitfor); } else #endif { n = secure_raw_write(port, ptr, len); waitfor = WL_SOCKET_WRITEABLE; } if (n < 0 && !port->noblock && (errno == EWOULDBLOCK || errno == EAGAIN)) { int w; Assert(waitfor); w = WaitLatchOrSocket(MyLatch, WL_LATCH_SET | waitfor, port->sock, 0); /* Handle interrupt. */ if (w & WL_LATCH_SET) { ResetLatch(MyLatch); ProcessClientWriteInterrupt(true); /* * We'll retry the write. Most likely it will return immediately * because there's still no data available, and we'll wait * for the socket to become ready again. */ } goto retry; } /* * Process interrupts that happened while (or before) sending. Note that * we signal that we're not blocking, which will prevent some types of * interrupts from being processed. */ ProcessClientWriteInterrupt(false); return n; }
static int my_sock_write(BIO *h, const char *buf, int size) { int res = 0; res = secure_raw_write(((Port *) BIO_get_data(h)), buf, size); BIO_clear_retry_flags(h); if (res <= 0) { /* If we were interrupted, tell caller to retry */ if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) { BIO_set_retry_write(h); } } return res; }