simplify socket interface

This commit is contained in:
Benjamin Sergeant 2020-01-12 22:30:16 -08:00
parent 5d641bc267
commit 8a344788ba
7 changed files with 27 additions and 74 deletions

View File

@ -73,7 +73,7 @@ namespace ix
virtual void close();
virtual ssize_t send(char* buffer, size_t length);
virtual ssize_t send(const std::string& buffer);
ssize_t send(const std::string& buffer);
virtual ssize_t recv(void* buffer, size_t length);
// Blocking and cancellable versions, working with socket that can be set

View File

@ -112,45 +112,10 @@ namespace ix
OSStatus SocketAppleSSL::writeToSocket(SSLConnectionRef connection,
const void* data,
size_t* dataLength)
size_t* len)
{
#if 1
int sock = (int) (long) connection;
if (sock < 0) return errSSLInternal;
size_t bytesSent = 0;
ssize_t length;
size_t dataLen = *dataLength;
const UInt8 *dataPtr = (UInt8 *)data;
OSStatus ortn;
int theErr;
*dataLength = 0;
do {
length = write(sock,
(char *)dataPtr + bytesSent,
dataLen - bytesSent);
} while((length > 0) &&
( (bytesSent += length) < dataLen) );
if(length <= 0) {
theErr = errno;
if(theErr == EAGAIN) {
ortn = errSSLWouldBlock;
}
else {
ortn = errSecIO;
}
}
else {
ortn = noErr;
}
*dataLength = bytesSent;
return ortn;
#else
int fd = (int) (long) connection;
if (fd < 0) return errSSLInternal;
assert(data != nullptr);
assert(len != nullptr);
@ -190,7 +155,6 @@ namespace ix
default: return errSecIO;
}
}
#endif
}
@ -274,29 +238,31 @@ namespace ix
ssize_t SocketAppleSSL::send(char* buf, size_t nbyte)
{
std::lock_guard<std::mutex> lock(_mutex);
size_t processed = 0;
OSStatus status = SSLWrite(_sslContext, buf, nbyte, &processed);
if (status == noErr)
OSStatus status = errSSLWouldBlock;
while (status == errSSLWouldBlock)
{
return processed;
}
else if (status == errSSLWouldBlock)
{
errno = EWOULDBLOCK;
return -1;
}
else
{
return -1;
}
}
size_t processed = 0;
std::lock_guard<std::mutex> lock(_mutex);
status = SSLWrite(_sslContext, buf, nbyte, &processed);
ssize_t SocketAppleSSL::send(const std::string& buffer)
{
return send((char*) &buffer[0], buffer.size());
if (processed > 0) return (ssize_t) processed;
// The connection was reset, inform the caller that this
// Socket should close
if (status == errSSLClosedGraceful || status == errSSLClosedNoNotify ||
status == errSSLClosedAbort)
{
errno = ECONNRESET;
return -1;
}
if (status == errSSLWouldBlock)
{
errno = EWOULDBLOCK;
return -1;
}
}
return -1;
}
// No wait support

View File

@ -30,7 +30,6 @@ namespace ix
virtual void close() final;
virtual ssize_t send(char* buffer, size_t length) final;
virtual ssize_t send(const std::string& buffer) final;
virtual ssize_t recv(void* buffer, size_t length) final;
private:

View File

@ -249,11 +249,6 @@ namespace ix
}
}
ssize_t SocketMbedTLS::send(const std::string& buffer)
{
return send((char*) &buffer[0], buffer.size());
}
ssize_t SocketMbedTLS::recv(void* buf, size_t nbyte)
{
while (true)

View File

@ -35,7 +35,6 @@ namespace ix
virtual void close() final;
virtual ssize_t send(char* buffer, size_t length) final;
virtual ssize_t send(const std::string& buffer) final;
virtual ssize_t recv(void* buffer, size_t length) final;
private:

View File

@ -629,11 +629,6 @@ namespace ix
}
}
ssize_t SocketOpenSSL::send(const std::string& buffer)
{
return send((char*) &buffer[0], buffer.size());
}
ssize_t SocketOpenSSL::recv(void* buf, size_t nbyte)
{
while (true)

View File

@ -33,7 +33,6 @@ namespace ix
virtual void close() final;
virtual ssize_t send(char* buffer, size_t length) final;
virtual ssize_t send(const std::string& buffer) final;
virtual ssize_t recv(void* buffer, size_t length) final;
private: