summaryrefslogtreecommitdiff
path: root/librabbitmq/amqp_tcp_socket.c
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 /librabbitmq/amqp_tcp_socket.c
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.
Diffstat (limited to 'librabbitmq/amqp_tcp_socket.c')
-rw-r--r--librabbitmq/amqp_tcp_socket.c19
1 files changed, 15 insertions, 4 deletions
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;