Overhauled SSL to use explicit BIO buffers

This commit is contained in:
2023-02-24 17:47:13 -05:00
parent 98c1b2d599
commit 596e39add8
6 changed files with 293 additions and 165 deletions

View File

@@ -149,40 +149,42 @@ static SOCKET accept_on_socket(SOCKET listen_socket, std::string &err) {
}
}
// the return values for socket_send and socket_recv are:
// the return values for socket_send:
//
// positive: sent or received bytes successfully
// zero: would block
// negative: channel closed, possibly cleanly or possibly with error
// positive: sent bytes successfully
// negative: error.
// If the error message is empty, then it's "would block"
// Any other error generates an error message.
//
static int socket_send(SOCKET socket, const char *bytes, int nbytes, std::string &err) {
err.clear();
int wbytes = send(socket, bytes, nbytes, 0);
if (wbytes < 0) {
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
return 0;
err.clear();
} else {
err = drvutil::strerror_str(errno);
return -1;
}
return -1;
} else {
err.clear();
return wbytes;
}
}
static int socket_recv(SOCKET socket, char *bytes, int nbytes, std::string &err) {
err.clear();
int nrecv = recv(socket, bytes, nbytes, 0);
if (nrecv < 0) {
if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {
err = drvutil::strerror_str(errno);
return -1;
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
err.clear();
} else {
return 0;
err = drvutil::strerror_str(errno);
}
} else if (nrecv == 0) {
return -1;
} else if (nrecv == 0) {
err.clear();
return 0;
} else {
err.clear();
return nrecv;
}
}