X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-ws.c;h=c6126100908186f35a7b41451038430f3a7b45f8;hb=ca9807f73646f536ac58c002d963a8bb8d245f5d;hp=a7582794a0617acd6e9ceb3f03c17c5890785d84;hpb=904f490e7d70653bb54b53d3bc7c7bead45be844;p=src%2Fapp-framework-binder.git diff --git a/src/afb-ws.c b/src/afb-ws.c index a7582794..c6126100 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 @@ -200,6 +201,14 @@ void afb_ws_hangup(struct afb_ws *ws) aws_disconnect(ws, 1); } +/* + * Is the websocket 'ws' still connected ? + */ +int afb_ws_is_connected(struct afb_ws *ws) +{ + return ws->ws != NULL; +} + /* * Sends a 'close' command to the endpoint of 'ws' with the 'code' and the * 'reason' (that can be NULL and that else should not be greater than 123 @@ -329,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; + } } /* @@ -359,7 +379,7 @@ static void aws_on_readable(struct afb_ws *ws) int rc; assert(ws->ws != NULL); - rc = websock_dispatch(ws->ws); + rc = websock_dispatch(ws->ws, 0); if (rc < 0 && errno == EPIPE) afb_ws_hangup(ws); } @@ -371,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; @@ -379,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); /* TODO: make fully asynchronous websockets */ + } else { + ws->buffer.size += (size_t)sz; + size -= (size_t)sz; + } + } while (size != 0); } return 1; }