aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2016-09-14 23:02:39 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2016-09-15 07:57:34 +0200
commitc6b4fa9e2c35d5c8bdbf929b6f1622f31afd35c9 (patch)
tree22163041d8ad74c8500651d343ee141d4558da80
parentdc011f99aed9407c8319b1b70a81f56ad2f02bc8 (diff)
afb-ws: handle EAGAIN return status
Change-Id: If325537e36a8db1a3f082fa211d619de7ddd478c Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r--src/afb-ws.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/afb-ws.c b/src/afb-ws.c
index c25c3f10..4e0138a8 100644
--- a/src/afb-ws.c
+++ b/src/afb-ws.c
@@ -24,6 +24,7 @@
#include <sys/uio.h>
#include <string.h>
#include <stdarg.h>
+#include <poll.h>
#include <systemd/sd-event.h>
@@ -337,10 +338,21 @@ int afb_ws_binary_v(struct afb_ws *ws, const struct iovec *iovec, int count)
static ssize_t aws_writev(struct afb_ws *ws, const struct iovec *iov, int iovcnt)
{
ssize_t rc;
- do {
+ for (;;) {
rc = writev(ws->fd, iov, iovcnt);
- } while(rc == -1 && errno == EINTR);
- return rc;
+ if (rc == -1) {
+ if (errno == EINTR)
+ continue;
+ else if (errno == EAGAIN) {
+ struct pollfd pfd;
+ pfd.fd = ws->fd;
+ pfd.events = POLLOUT;
+ poll(&pfd, 1, 10);
+ continue;
+ }
+ }
+ return rc;
+ }
}
/*
@@ -352,7 +364,9 @@ static ssize_t aws_readv(struct afb_ws *ws, const struct iovec *iov, int iovcnt)
do {
rc = readv(ws->fd, iov, iovcnt);
} while(rc == -1 && errno == EINTR);
- if (rc == 0) {
+ if (rc == -1 && errno == EAGAIN) {
+ rc = 0;
+ } else if (rc == 0) {
errno = EPIPE;
rc = -1;
}