ustream: add function ustream_read().

It can be used to fill caller-specified buffer 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 <yszhou4tech@gmail.com>
This commit is contained in:
Yousong Zhou 2015-01-21 21:21:25 +08:00 committed by Felix Fietkau
parent f1c794b29e
commit 60236c4853
2 changed files with 25 additions and 0 deletions

View file

@ -333,6 +333,26 @@ char *ustream_get_read_buf(struct ustream *s, int *buflen)
return data; return data;
} }
int ustream_read(struct ustream *s, char *buf, int buflen)
{
char *chunk;
int chunk_len;
int len = 0;
do {
chunk = ustream_get_read_buf(s, &chunk_len);
if (!chunk)
break;
if (chunk_len > buflen - len)
chunk_len = buflen - len;
memcpy(buf + len, chunk, chunk_len);
ustream_consume(s, chunk_len);
len += chunk_len;
} while (len < buflen);
return len;
}
static void ustream_write_error(struct ustream *s) static void ustream_write_error(struct ustream *s)
{ {
if (!s->write_error) if (!s->write_error)

View file

@ -143,6 +143,11 @@ void ustream_free(struct ustream *s);
/* ustream_consume: remove data from the head of the read buffer */ /* ustream_consume: remove data from the head of the read buffer */
void ustream_consume(struct ustream *s, int len); void ustream_consume(struct ustream *s, int len);
/*
* ustream_read: read and consume data in read buffer into caller-specified
* area. Return length of data read.
*/
int ustream_read(struct ustream *s, char *buf, int buflen);
/* ustream_write: add data to the write buffer */ /* ustream_write: add data to the write buffer */
int ustream_write(struct ustream *s, const char *buf, int len, bool more); int ustream_write(struct ustream *s, const char *buf, int len, bool more);
int ustream_printf(struct ustream *s, const char *format, ...); int ustream_printf(struct ustream *s, const char *format, ...);