X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/97f65b001294338abed02a7b132d6be6517b3f1d..a4589237d33eb5ed0858371a668f652651f4bcda:/selbuf.c diff --git a/selbuf.c b/selbuf.c index 0f07dfc..6fe97ee 100644 --- a/selbuf.c +++ b/selbuf.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: selbuf.c,v 1.1 1999/05/14 21:01:15 mdw Exp $ + * $Id: selbuf.c,v 1.6 2004/04/08 01:36:13 mdw Exp $ * * Line-buffering select handler * @@ -27,14 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: selbuf.c,v $ - * Revision 1.1 1999/05/14 21:01:15 mdw - * Integrated `select' handling bits from the background resolver project. - * - */ - /*----- Header files ------------------------------------------------------*/ #include @@ -64,8 +56,8 @@ void selbuf_enable(selbuf *b) { - if (!(b->b.f & lbuf_enable)) { - b->b.f |= lbuf_enable; + if (!(b->b.f & LBUF_ENABLE)) { + b->b.f |= LBUF_ENABLE; sel_addfile(&b->reader); lbuf_flush(&b->b, 0, 0); } @@ -83,8 +75,8 @@ void selbuf_enable(selbuf *b) void selbuf_disable(selbuf *b) { - if (b->b.f & lbuf_enable) { - b->b.f &= ~lbuf_enable; + if (b->b.f & LBUF_ENABLE) { + b->b.f &= ~LBUF_ENABLE; sel_rmfile(&b->reader); } } @@ -108,23 +100,36 @@ static void selbuf_read(int fd, unsigned mode, void *vp) int n; sz = lbuf_free(&b->b, &p); -again: n = read(fd, p, sz); - if (n <= 0) { - switch (errno) { - case EINTR: - goto again; - case EAGAIN: + if (n == 0) + lbuf_close(&b->b); + else if (n > 0) + lbuf_flush(&b->b, p, n); + else switch (errno) { + case EINTR: + case EAGAIN: #if EAGAIN != EWOULDBLOCK - case EWOULDBLOCK: + case EWOULDBLOCK: #endif - return; - default: - lbuf_close(&b->b); - } + return; + default: + lbuf_close(&b->b); } - else - lbuf_flush(&b->b, p, n); +} + +/* --- @selbuf_setsize@ --- * + * + * Arguments: @selbuf *b@ = pointer to buffer block + * @size_t sz@ = size of buffer + * + * Returns: --- + * + * Use: Sets the size of the buffer used for reading lines. + */ + +void selbuf_setsize(selbuf *b, size_t sz) +{ + lbuf_setsize(&b->b, sz); } /* --- @selbuf_init@ --- * @@ -132,7 +137,7 @@ again: * Arguments: @selbuf *b@ = pointer to buffer block * @sel_state *s@ = pointer to select state to attach to * @int fd@ = file descriptor to listen to - * @void (*func)(char *s, void *p)@ = function to call + * @lbuf_func *func@ = function to call * @void *p@ = argument for function * * Returns: --- @@ -140,16 +145,27 @@ again: * Use: Initializes a buffer block. */ -void selbuf_init(selbuf *b, - sel_state *s, - int fd, - void (*func)(char */*s*/, void */*p*/), - void *p) +void selbuf_init(selbuf *b, sel_state *s, int fd, lbuf_func *func, void *p) { lbuf_init(&b->b, func, p); - b->b.f &= ~lbuf_enable; + b->b.f &= ~LBUF_ENABLE; sel_initfile(s, &b->reader, fd, SEL_READ, selbuf_read, b); selbuf_enable(b); } +/* --- @selbuf_destroy@ --- * + * + * Arguments: @selbuf *b@ = pointer to buffer block + * + * Returns: --- + * + * Use: Deallocates a line buffer and frees any resources it owned. + */ + +void selbuf_destroy(selbuf *b) +{ + selbuf_disable(b); + lbuf_destroy(&b->b); +} + /*----- That's all, folks -------------------------------------------------*/