diff options
author | Alan Antonuk <alan.antonuk@gmail.com> | 2015-04-06 23:42:17 -0700 |
---|---|---|
committer | Alan Antonuk <alan.antonuk@gmail.com> | 2015-04-19 22:09:32 -0700 |
commit | 3b775c45f7ba6a3f8b54491f3535d54efe5f89fa (patch) | |
tree | dc9dfa1a9f11520adca6502d8e9d499f8777a009 | |
parent | 8a2b35620a8cbe094bce0b6b3ed33e3c49ebc048 (diff) | |
download | rabbitmq-c-3b775c45f7ba6a3f8b54491f3535d54efe5f89fa.tar.gz |
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.
-rw-r--r-- | librabbitmq/amqp_private.h | 9 | ||||
-rw-r--r-- | 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 <stdio.h> #include <stdlib.h> +#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; |