simplify socket interface
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user