/** * Reads one byte from a socket * @param socket the socket to read from * @param c the character read, returned * @return completion code */ int SSLSocket_getch(SSL* ssl, int socket, char* c) { int rc = SOCKET_ERROR; FUNC_ENTRY; if ((rc = SocketBuffer_getQueuedChar(socket, c)) != SOCKETBUFFER_INTERRUPTED) goto exit; if ((rc = SSL_read(ssl, c, (size_t)1)) < 0) { int err = SSLSocket_error("SSL_read - getch", ssl, socket, rc); if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { rc = TCPSOCKET_INTERRUPTED; SocketBuffer_interrupted(socket, 0); } } else if (rc == 0) rc = SOCKET_ERROR; /* The return value from recv is 0 when the peer has performed an orderly shutdown. */ else if (rc == 1) { SocketBuffer_queueChar(socket, *c); rc = TCPSOCKET_COMPLETE; } exit: FUNC_EXIT_RC(rc); return rc; }
/** * Reads one byte from a socket * @param socket the socket to read from * @param c the character read, returned * @return completion code */ int Socket_getch(int socket, char* c) { int rc = SOCKET_ERROR; FUNC_ENTRY; if ((rc = SocketBuffer_getQueuedChar(socket, c)) != SOCKETBUFFER_INTERRUPTED) goto exit; if ((rc = recv(socket, c, (size_t)1, 0)) == SOCKET_ERROR) { int err = Socket_error("recv - getch", socket); if (err == EWOULDBLOCK || err == EAGAIN) { rc = TCPSOCKET_INTERRUPTED; SocketBuffer_interrupted(socket, 0); } } else if (rc == 0) rc = SOCKET_ERROR; /* The return value from recv is 0 when the peer has performed an orderly shutdown. */ else if (rc == 1) { SocketBuffer_queueChar(socket, *c); rc = TCPSOCKET_COMPLETE; } exit: FUNC_EXIT_RC(rc); return rc; }