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