summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Antonuk <alan.antonuk@gmail.com>2015-04-06 23:42:17 -0700
committerAlan Antonuk <alan.antonuk@gmail.com>2015-04-19 22:09:32 -0700
commit3b775c45f7ba6a3f8b54491f3535d54efe5f89fa (patch)
treedc9dfa1a9f11520adca6502d8e9d499f8777a009
parent8a2b35620a8cbe094bce0b6b3ed33e3c49ebc048 (diff)
downloadrabbitmq-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.h9
-rw-r--r--librabbitmq/amqp_tcp_socket.c19
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;