X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fafb-ws.c;h=5af2434fa0255c25b8a89187a433d5eec5debd5b;hb=9fe2dfd3c4df334607083f989346090e1051a565;hp=c25c3f108a173f62edf79222c6099057e1625978;hpb=e22f8536c5f8833828a6d5cb8f5a77a8c0712e08;p=src%2Fapp-framework-binder.git diff --git a/src/afb-ws.c b/src/afb-ws.c index c25c3f10..5af2434f 100644 --- a/src/afb-ws.c +++ b/src/afb-ws.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 "IoT.bzh" + * Copyright (C) 2016, 2017 "IoT.bzh" * Author: José Bollo * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,7 @@ #include #include #include +#include #include @@ -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; + } } /* @@ -379,6 +391,7 @@ static void aws_on_readable(struct afb_ws *ws) */ static int aws_read(struct afb_ws *ws, size_t size) { + struct pollfd pfd; ssize_t sz; char *buffer; @@ -387,10 +400,19 @@ static int aws_read(struct afb_ws *ws, size_t size) if (buffer == NULL) return 0; ws->buffer.buffer = buffer; - sz = websock_read(ws->ws, &buffer[ws->buffer.size], size); - if ((size_t)sz != size) - return 0; - ws->buffer.size += size; + do { + sz = websock_read(ws->ws, &buffer[ws->buffer.size], size); + if (sz < 0) { + if (errno != EAGAIN) + return 0; + pfd.fd = ws->fd; + pfd.events = POLLIN; + poll(&pfd, 1, 10); + } else { + ws->buffer.size += (size_t)sz; + size -= (size_t)sz; + } + } while (size != 0); } return 1; }