On 2014-12-16 22:15, Yousong Zhou wrote:
> It can be used to fill caller specified buffer area with data already in
> ustream read buffer.  Useful in the following use pattern.
> 
>       int available = ustream_pending_data(s, false);
>       if (available >= sizeof(struct msghdr)) {
>               struct msghdr h;
>               ustream_read(s, &h, sizeof(h));
>       }
> 
> Signed-off-by: Yousong Zhou <yszhou4t...@gmail.com>
> ---
>  ustream.c |   24 ++++++++++++++++++++++++
>  ustream.h |    5 +++++
>  2 files changed, 29 insertions(+)
> 
> diff --git a/ustream.c b/ustream.c
> index 828a025..f1db809 100644
> --- a/ustream.c
> +++ b/ustream.c
> @@ -333,6 +333,30 @@ char *ustream_get_read_buf(struct ustream *s, int 
> *buflen)
>       return data;
>  }
>  
> +int ustream_read(struct ustream *s, char *buf, int buflen)
> +{
> +     int len = 0;
> +     int chunk_len;
> +     struct ustream_buf *sbuf;
> +
> +     if (!s->r.head) {
> +             return 0;
> +     }
> +
> +     sbuf = s->r.head;
> +     do {
> +             chunk_len = sbuf->tail - sbuf->data;
> +             if (chunk_len > buflen)
> +                     chunk_len = buflen;
> +             memcpy(&buf[len], sbuf->data, chunk_len);
> +             buflen -= chunk_len;
> +             len += chunk_len;
> +             sbuf = sbuf->next;
> +     } while (buflen && sbuf);
> +
> +     return len;
> +}
> +
I'd expect ustream_read() to consume the data it has read.
It should also probably just use ustream_get_read_buf() and
ustream_consume() instead of open-coding its functionality.

- Felix
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to