X-Git-Url: http://git.archive.openwrt.org/?p=project%2Flibubox.git;a=blobdiff_plain;f=ustream.h;h=53e08280bf522118f6ff53447aa62e71aeb1b16e;hp=d9f98b78e86b1a7c22f6a8d918060422e59e1b3f;hb=2b89f2169b83be17441835758a53782a41aef976;hpb=dc69ce4799deb53797266d55311871b9c0062066 diff --git a/ustream.h b/ustream.h index d9f98b7..53e0828 100644 --- a/ustream.h +++ b/ustream.h @@ -52,7 +52,7 @@ struct ustream { struct ustream *next; /* - * notify_read: + * notify_read: (optional) * called by the ustream core to notify that new data is available * for reading. * must not free the ustream from this callback @@ -68,7 +68,7 @@ struct ustream { void (*notify_write)(struct ustream *s, int bytes); /* - * notify_state: + * notify_state: (optional) * called by the ustream implementation to notify that the read * side of the stream is closed (eof is set) or there was a write * error (write_error is set). @@ -143,6 +143,11 @@ void ustream_free(struct ustream *s); /* ustream_consume: remove data from the head of the read buffer */ 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 */ int ustream_write(struct ustream *s, const char *buf, int len, bool more); int ustream_printf(struct ustream *s, const char *format, ...); @@ -163,6 +168,19 @@ static inline bool ustream_read_blocked(struct ustream *s) return !!(s->read_blocked & READ_BLOCKED_USER); } +static inline int ustream_pending_data(struct ustream *s, bool write) +{ + struct ustream_buf_list *b = write ? &s->w : &s->r; + return b->data_bytes; +} + +static inline bool ustream_read_buf_full(struct ustream *s) +{ + struct ustream_buf *buf = s->r.data_tail; + return buf && buf->data == buf->head && buf->tail == buf->end && + s->r.buffers == s->r.max_buffers; +} + /*** --- functions only used by ustream implementations --- ***/ /* ustream_init_defaults: fill default callbacks and options */