fix read polling by putting the buffer prepare in a loop
authorFelix Fietkau <nbd@openwrt.org>
Tue, 22 Jan 2013 14:24:28 +0000 (15:24 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 22 Jan 2013 14:25:01 +0000 (15:25 +0100)
allow user to process more than a single buffer's worth of data in one call

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
ustream-ssl.c

index f403cb55d5d88427d4d3525b5bae99a44d227b59..bbc6b1132871414f588a07e60bf5430fc4dbf538 100644 (file)
@@ -80,21 +80,22 @@ static void ustream_ssl_check_conn(struct ustream_ssl *us)
        ustream_ssl_error(us, ret);
 }
 
-static void ustream_ssl_notify_read(struct ustream *s, int bytes)
+static bool __ustream_ssl_poll(struct ustream *s)
 {
        struct ustream_ssl *us = container_of(s->next, struct ustream_ssl, stream);
        char *buf;
-       int wr = 0, len, ret;
+       int len, ret;
+       bool more = false;
 
        ustream_ssl_check_conn(us);
        if (!us->connected || us->error)
-               return;
-
-       buf = ustream_reserve(&us->stream, 1, &len);
-       if (!len)
-               return;
+               return false;
 
        do {
+               buf = ustream_reserve(&us->stream, 1, &len);
+               if (!len)
+                       break;
+
                ret = SSL_read(us->ssl, buf, len);
                if (ret < 0) {
                        ret = SSL_get_error(us->ssl, ret);
@@ -111,13 +112,16 @@ static void ustream_ssl_notify_read(struct ustream *s, int bytes)
                        break;
                }
 
-               buf += ret;
-               len -= ret;
-               wr += ret;
+               ustream_fill_read(&us->stream, ret);
+               more = true;
        } while (1);
 
-       if (wr)
-               ustream_fill_read(&us->stream, wr);
+       return more;
+}
+
+static void ustream_ssl_notify_read(struct ustream *s, int bytes)
+{
+       __ustream_ssl_poll(s);
 }
 
 static void ustream_ssl_notify_write(struct ustream *s, int bytes)
@@ -186,8 +190,10 @@ static void ustream_ssl_free(struct ustream *s)
 static bool ustream_ssl_poll(struct ustream *s)
 {
        struct ustream_ssl *us = container_of(s, struct ustream_ssl, stream);
+       bool fd_poll;
 
-       return ustream_poll(us->conn);
+       fd_poll = ustream_poll(us->conn);
+       return __ustream_ssl_poll(s) || fd_poll;
 }
 
 static void ustream_ssl_stream_init(struct ustream_ssl *us)