From 15a80404bec02e6fbf47108f306f6b3020bc078d Mon Sep 17 00:00:00 2001 From: Michael Steinert Date: Fri, 24 Aug 2012 13:00:25 -0600 Subject: Simplify socket code The SSL & TCP code now use a common function to open sockets. Previously Nagle's algorithm wasn't disabled for SSL sockets. Also, bump the patch version for release. Signed-off-by: Michael Steinert --- .gitignore | 1 + librabbitmq/amqp-openssl.c | 55 ++++++++++++++++++------------------- librabbitmq/amqp-tcp-socket.c | 63 +++---------------------------------------- librabbitmq/amqp.h | 3 +-- 4 files changed, 32 insertions(+), 90 deletions(-) diff --git a/.gitignore b/.gitignore index eaee49e..a33a375 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ /config.status /config.sub /configure +/cscope.* /depcomp /install-sh /libtool diff --git a/librabbitmq/amqp-openssl.c b/librabbitmq/amqp-openssl.c index af36a1e..4974a11 100644 --- a/librabbitmq/amqp-openssl.c +++ b/librabbitmq/amqp-openssl.c @@ -28,12 +28,13 @@ #include "amqp_private.h" #include "threads.h" #include -#include #include #include #include #include +#include "socket.h" + static int initialize_openssl(void); static int destroy_openssl(void); @@ -56,8 +57,9 @@ static pthread_mutex_t *amqp_openssl_lockarray = NULL; struct amqp_ssl_socket_t { const struct amqp_socket_class_t *klass; - BIO *bio; SSL_CTX *ctx; + int sockfd; + SSL *ssl; char *buffer; size_t length; amqp_boolean_t verify; @@ -72,13 +74,9 @@ amqp_ssl_socket_send(void *base, struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; ssize_t sent; ERR_clear_error(); - sent = BIO_write(self->bio, buf, len); + sent = SSL_write(self->ssl, buf, len); if (0 > sent) { - SSL *ssl; - int error; - BIO_get_ssl(self->bio, &ssl); - error = SSL_get_error(ssl, sent); - switch (error) { + switch (SSL_get_error(self->ssl, sent)) { case SSL_ERROR_NONE: case SSL_ERROR_ZERO_RETURN: case SSL_ERROR_WANT_READ: @@ -132,13 +130,9 @@ amqp_ssl_socket_recv(void *base, struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; ssize_t received; ERR_clear_error(); - received = BIO_read(self->bio, buf, len); + received = SSL_read(self->ssl, buf, len); if (0 > received) { - SSL *ssl; - int error; - BIO_get_ssl(self->bio, &ssl); - error = SSL_get_error(ssl, received); - switch (error) { + switch(SSL_get_error(self->ssl, received)) { case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: received = 0; @@ -158,9 +152,7 @@ amqp_ssl_socket_verify(void *base, const char *host) X509_NAME_ENTRY *entry; X509_NAME *name; X509 *peer; - SSL *ssl; - BIO_get_ssl(self->bio, &ssl); - peer = SSL_get_peer_certificate(ssl); + peer = SSL_get_peer_certificate(self->ssl); if (!peer) { goto error; } @@ -221,20 +213,24 @@ amqp_ssl_socket_open(void *base, const char *host, int port) struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; long result; int status; - SSL *ssl; - self->bio = BIO_new_ssl_connect(self->ctx); - if (!self->bio) { + self->ssl = SSL_new(self->ctx); + if (!self->ssl) { return -1; } - BIO_get_ssl(self->bio, &ssl); - SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); - BIO_set_conn_hostname(self->bio, host); - BIO_set_conn_int_port(self->bio, &port); - status = BIO_do_connect(self->bio); - if (1 != status) { + SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY); + self->sockfd = amqp_open_socket(host, port); + if (0 > self->sockfd) { + return -1; + } + status = SSL_set_fd(self->ssl, self->sockfd); + if (!status) { + return -1; + } + status = SSL_connect(self->ssl); + if (!status) { return -1; } - result = SSL_get_verify_result(ssl); + result = SSL_get_verify_result(self->ssl); if (X509_V_OK != result) { return -1; } @@ -252,7 +248,8 @@ amqp_ssl_socket_close(void *base) { struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; if (self) { - BIO_free_all(self->bio); + SSL_free(self->ssl); + amqp_os_socket_close(self->sockfd); SSL_CTX_free(self->ctx); free(self->buffer); free(self); @@ -271,7 +268,7 @@ static int amqp_ssl_socket_get_sockfd(void *base) { struct amqp_ssl_socket_t *self = (struct amqp_ssl_socket_t *)base; - return BIO_get_fd(self->bio, NULL); + return self->sockfd; } static const struct amqp_socket_class_t amqp_ssl_socket_class = { diff --git a/librabbitmq/amqp-tcp-socket.c b/librabbitmq/amqp-tcp-socket.c index 0ca6802..d6e6fdb 100644 --- a/librabbitmq/amqp-tcp-socket.c +++ b/librabbitmq/amqp-tcp-socket.c @@ -59,66 +59,11 @@ static int amqp_tcp_socket_open(void *base, const char *host, int port) { struct amqp_tcp_socket_t *self = (struct amqp_tcp_socket_t *)base; - struct addrinfo *address_list; - struct addrinfo *addr; - struct addrinfo hint; - char port_string[33]; - int status, one = 1; /* for setsockopt */ - status = amqp_socket_init(); - if (status) { - return status; + self->sockfd = amqp_open_socket(host, port); + if (0 > self->sockfd) { + return -1; } - memset(&hint, 0, sizeof hint); - hint.ai_family = PF_UNSPEC; /* PF_INET or PF_INET6 */ - hint.ai_socktype = SOCK_STREAM; - hint.ai_protocol = IPPROTO_TCP; - (void)snprintf(port_string, sizeof port_string, "%d", port); - port_string[sizeof port_string - 1] = '\0'; - status = getaddrinfo(host, port_string, &hint, &address_list); - if (status) { - return -ERROR_GETHOSTBYNAME_FAILED; - } - for (addr = address_list; addr; addr = addr->ai_next) { - /* - * This cast is to squash warnings on Win64, see: - * http://bit.ly/PTxfCU - */ - self->sockfd = (int)amqp_socket_socket(addr->ai_family, - addr->ai_socktype, - addr->ai_protocol); - if (-1 == self->sockfd) { - status = -amqp_os_socket_error(); - continue; - } -#ifdef DISABLE_SIGPIPE_WITH_SETSOCKOPT - status = amqp_socket_setsockopt(self->sockfd, SOL_SOCKET, - SO_NOSIGPIPE, &one, - sizeof one); - if (0 > status) { - status = -amqp_os_socket_error(); - amqp_os_socket_close(self->sockfd); - continue; - } -#endif /* DISABLE_SIGPIPE_WITH_SETSOCKOPT */ - status = amqp_socket_setsockopt(self->sockfd, IPPROTO_TCP, - TCP_NODELAY, &one, - sizeof one); - if (0 > status) { - status = -amqp_os_socket_error(); - amqp_os_socket_close(self->sockfd); - continue; - } - status = connect(self->sockfd, addr->ai_addr, addr->ai_addrlen); - if (0 > status) { - status = -amqp_os_socket_error(); - amqp_os_socket_close(self->sockfd); - continue; - } - status = 0; - break; - } - freeaddrinfo(address_list); - return status; + return 0; } static int diff --git a/librabbitmq/amqp.h b/librabbitmq/amqp.h index 734094b..b9fda62 100644 --- a/librabbitmq/amqp.h +++ b/librabbitmq/amqp.h @@ -437,8 +437,7 @@ AMQP_CALL amqp_table_entry_cmp(void const *entry1, void const *entry2); AMQP_PUBLIC_FUNCTION int -AMQP_CALL amqp_open_socket(char const *hostname, int portnumber) - AMQP_DEPRECATED; +AMQP_CALL amqp_open_socket(char const *hostname, int portnumber); AMQP_PUBLIC_FUNCTION int -- cgit v1.2.1