simplify socket interface
This commit is contained in:
		| @@ -73,7 +73,7 @@ namespace ix | |||||||
|         virtual void close(); |         virtual void close(); | ||||||
|  |  | ||||||
|         virtual ssize_t send(char* buffer, size_t length); |         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); |         virtual ssize_t recv(void* buffer, size_t length); | ||||||
|  |  | ||||||
|         // Blocking and cancellable versions, working with socket that can be set |         // Blocking and cancellable versions, working with socket that can be set | ||||||
|   | |||||||
| @@ -112,45 +112,10 @@ namespace ix | |||||||
|  |  | ||||||
|     OSStatus SocketAppleSSL::writeToSocket(SSLConnectionRef connection, |     OSStatus SocketAppleSSL::writeToSocket(SSLConnectionRef connection, | ||||||
|                                            const void* data, |                                            const void* data, | ||||||
|                                            size_t* dataLength) |                                            size_t* len) | ||||||
|     { |     { | ||||||
| #if 1 |         int fd = (int) (long) connection; | ||||||
|         int sock = (int) (long) connection; |         if (fd < 0) return errSSLInternal; | ||||||
|         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 |  | ||||||
|  |  | ||||||
|         assert(data != nullptr); |         assert(data != nullptr); | ||||||
|         assert(len != nullptr); |         assert(len != nullptr); | ||||||
| @@ -190,7 +155,6 @@ namespace ix | |||||||
|                 default: return errSecIO; |                 default: return errSecIO; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| #endif |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -274,30 +238,32 @@ namespace ix | |||||||
|  |  | ||||||
|     ssize_t SocketAppleSSL::send(char* buf, size_t nbyte) |     ssize_t SocketAppleSSL::send(char* buf, size_t nbyte) | ||||||
|     { |     { | ||||||
|         std::lock_guard<std::mutex> lock(_mutex); |         OSStatus status = errSSLWouldBlock; | ||||||
|  |         while (status == errSSLWouldBlock) | ||||||
|         size_t processed = 0; |  | ||||||
|         OSStatus status = SSLWrite(_sslContext, buf, nbyte, &processed); |  | ||||||
|  |  | ||||||
|         if (status == noErr) |  | ||||||
|         { |         { | ||||||
|             return processed; |             size_t processed = 0; | ||||||
|  |             std::lock_guard<std::mutex> lock(_mutex); | ||||||
|  |             status = SSLWrite(_sslContext, buf, nbyte, &processed); | ||||||
|  |  | ||||||
|  |             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; | ||||||
|             } |             } | ||||||
|         else if (status == errSSLWouldBlock) |  | ||||||
|  |             if (status == errSSLWouldBlock) | ||||||
|             { |             { | ||||||
|                 errno = EWOULDBLOCK; |                 errno = EWOULDBLOCK; | ||||||
|                 return -1; |                 return -1; | ||||||
|             } |             } | ||||||
|         else |         } | ||||||
|         { |  | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|     } |  | ||||||
|  |  | ||||||
|     ssize_t SocketAppleSSL::send(const std::string& buffer) |  | ||||||
|     { |  | ||||||
|         return send((char*) &buffer[0], buffer.size()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // No wait support |     // No wait support | ||||||
|     ssize_t SocketAppleSSL::recv(void* buf, size_t nbyte) |     ssize_t SocketAppleSSL::recv(void* buf, size_t nbyte) | ||||||
|   | |||||||
| @@ -30,7 +30,6 @@ namespace ix | |||||||
|         virtual void close() final; |         virtual void close() final; | ||||||
|  |  | ||||||
|         virtual ssize_t send(char* buffer, size_t length) 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; |         virtual ssize_t recv(void* buffer, size_t length) final; | ||||||
|  |  | ||||||
|     private: |     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) |     ssize_t SocketMbedTLS::recv(void* buf, size_t nbyte) | ||||||
|     { |     { | ||||||
|         while (true) |         while (true) | ||||||
|   | |||||||
| @@ -35,7 +35,6 @@ namespace ix | |||||||
|         virtual void close() final; |         virtual void close() final; | ||||||
|  |  | ||||||
|         virtual ssize_t send(char* buffer, size_t length) 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; |         virtual ssize_t recv(void* buffer, size_t length) final; | ||||||
|  |  | ||||||
|     private: |     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) |     ssize_t SocketOpenSSL::recv(void* buf, size_t nbyte) | ||||||
|     { |     { | ||||||
|         while (true) |         while (true) | ||||||
|   | |||||||
| @@ -33,7 +33,6 @@ namespace ix | |||||||
|         virtual void close() final; |         virtual void close() final; | ||||||
|  |  | ||||||
|         virtual ssize_t send(char* buffer, size_t length) 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; |         virtual ssize_t recv(void* buffer, size_t length) final; | ||||||
|  |  | ||||||
|     private: |     private: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user