summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Steinert <mike.steinert@gmail.com>2012-08-24 13:00:25 -0600
committerAlan Antonuk <alan.antonuk@gmail.com>2013-04-09 15:51:48 -0700
commit15a80404bec02e6fbf47108f306f6b3020bc078d (patch)
treeafc830837b11fc2729b83c001d3278e6e4487f9d
parenta817949685e97a90fb78acf35beb04bd0c8fc7e2 (diff)
downloadrabbitmq-c-github-ask-15a80404bec02e6fbf47108f306f6b3020bc078d.tar.gz
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 <mike.steinert@gmail.com>
-rw-r--r--.gitignore1
-rw-r--r--librabbitmq/amqp-openssl.c55
-rw-r--r--librabbitmq/amqp-tcp-socket.c63
-rw-r--r--librabbitmq/amqp.h3
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 <ctype.h>
-#include <openssl/bio.h>
#include <openssl/conf.h>
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <stdlib.h>
+#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