From 3b775c45f7ba6a3f8b54491f3535d54efe5f89fa Mon Sep 17 00:00:00 2001 From: Alan Antonuk Date: Mon, 6 Apr 2015 23:42:17 -0700 Subject: Return NEEDREAD status from amqp_tcp_socket_recv When tcp socket is in non-blocking mode, return AMQP_STATUS_PRIVATE_SOCKET_NEEDREAD when socket doesn't have any data in it. --- librabbitmq/amqp_private.h | 9 +++++++++ librabbitmq/amqp_tcp_socket.c | 19 +++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/librabbitmq/amqp_private.h b/librabbitmq/amqp_private.h index 77a8f39..50905e1 100644 --- a/librabbitmq/amqp_private.h +++ b/librabbitmq/amqp_private.h @@ -121,6 +121,15 @@ typedef enum amqp_connection_state_enum_ { CONNECTION_STATE_BODY } amqp_connection_state_enum; +typedef enum amqp_status_private_enum_ +{ + /* 0x00xx -> AMQP_STATUS_*/ + /* 0x01xx -> AMQP_STATUS_TCP_* */ + /* 0x02xx -> AMQP_STATUS_SSL_* */ + AMQP_PRIVATE_STATUS_SOCKET_NEEDREAD = -0x1301, + AMQP_PRIVATE_STATUS_SOCKET_NEEDWRITE = -0x1302 +} amqp_status_private_enum; + /* 7 bytes up front, then payload, then 1 byte footer */ #define HEADER_SIZE 7 #define FOOTER_SIZE 1 diff --git a/librabbitmq/amqp_tcp_socket.c b/librabbitmq/amqp_tcp_socket.c index 721697a..4b597ed 100644 --- a/librabbitmq/amqp_tcp_socket.c +++ b/librabbitmq/amqp_tcp_socket.c @@ -32,6 +32,10 @@ #include #include +#ifdef _WIN32 +# define EWOULDBLOCK WSAEWOULDBLOCK +#endif + struct amqp_tcp_socket_t { const struct amqp_socket_class_t *klass; int sockfd; @@ -226,10 +230,17 @@ start: if (0 > ret) { self->internal_error = amqp_os_socket_error(); - if (EINTR == self->internal_error) { - goto start; - } else { - ret = AMQP_STATUS_SOCKET_ERROR; + switch (self->internal_error) { + case EINTR: + goto start; + case EWOULDBLOCK: +#if defined(EAGAIN) && EAGAIN != EWOULDBLOCK + case EAGAIN: +#endif + ret = AMQP_PRIVATE_STATUS_SOCKET_NEEDREAD; + break; + default: + ret = AMQP_STATUS_SOCKET_ERROR; } } else if (0 == ret) { ret = AMQP_STATUS_CONNECTION_CLOSED; -- cgit v1.2.1