From a5ae3e120ff751cc51da661b617fb0d1040cc5a2 Mon Sep 17 00:00:00 2001 From: Richard Nyberg Date: Wed, 13 Sep 2006 20:13:44 +0000 Subject: Some changes to the iobuf interface. Remove a debug assert from btpd_if.c and make it act properly on iobuf errors. --- misc/iobuf.c | 64 +++++++++++++++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 31 deletions(-) (limited to 'misc/iobuf.c') diff --git a/misc/iobuf.c b/misc/iobuf.c index cf5bc73..45918ab 100644 --- a/misc/iobuf.c +++ b/misc/iobuf.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -9,18 +8,21 @@ #define GROWLEN (1 << 14) -int -buf_init(struct io_buffer *iob, size_t size) +struct io_buffer +buf_init(size_t size) { - iob->buf_off = 0; - iob->buf_len = size; - iob->error = 0; - iob->buf = malloc(size); - if (iob->buf == NULL) { - iob->error = ENOMEM; - return ENOMEM; - } else - return 0; + struct io_buffer iob; + iob.off = 0; + iob.len = size; + iob.error = (iob.buf = malloc(size)) == NULL ? 1 : 0; + return iob; +} + +void +buf_free(struct io_buffer *iob) +{ + if (iob->buf != NULL) + free(iob->buf); } int @@ -28,14 +30,14 @@ buf_grow(struct io_buffer *iob, size_t addlen) { if (iob->error) return iob->error; - char *nbuf = realloc(iob->buf, iob->buf_len + addlen); + char *nbuf = realloc(iob->buf, iob->len + addlen); if (nbuf == NULL) { - iob->error = ENOMEM; - return ENOMEM; + iob->error = 1; + return 0; } else { iob->buf = nbuf; - iob->buf_len += addlen; - return 0; + iob->len += addlen; + return 1; } } @@ -43,31 +45,31 @@ int buf_print(struct io_buffer *iob, const char *fmt, ...) { if (iob->error) - return iob->error; + return 0; int np; va_list ap; va_start(ap, fmt); np = vsnprintf(NULL, 0, fmt, ap); va_end(ap); - if (np + 1 > iob->buf_len - iob->buf_off) - if (buf_grow(iob, (1 + (np + 1) / GROWLEN) * GROWLEN) != 0) - return ENOMEM; + if (np + 1 > iob->len - iob->off) + if (!buf_grow(iob, (1 + (np + 1) / GROWLEN) * GROWLEN)) + return 0; va_start(ap, fmt); - vsnprintf(iob->buf + iob->buf_off, np + 1, fmt, ap); + vsnprintf(iob->buf + iob->off, np + 1, fmt, ap); va_end(ap); - iob->buf_off += np; - return 0; + iob->off += np; + return 1; } int buf_write(struct io_buffer *iob, const void *buf, size_t len) { if (iob->error) - return iob->error; - if (len > iob->buf_len - iob->buf_off) - if (buf_grow(iob, (1 + len / GROWLEN) * GROWLEN) != 0) - return ENOMEM; - bcopy(buf, iob->buf + iob->buf_off, len); - iob->buf_off += len; - return 0; + return 0; + if (len > iob->len - iob->off) + if (!buf_grow(iob, (1 + len / GROWLEN) * GROWLEN)) + return 0; + bcopy(buf, iob->buf + iob->off, len); + iob->off += len; + return 1; } -- cgit 1.4.1