X-Git-Url: http://git.madism.org/?a=blobdiff_plain;ds=sidebyside;f=buffer.c;h=81855fd9c0a53c2ce1387bf246415d5258313c95;hb=6d692d51a497e480ac4b0f4f63e6ce2539419e36;hp=8342162ac0c935937a7f02e085904826144dc22b;hpb=b5fcb83a2555a4aac4d298e7ed5487b3416ef6f6;p=apps%2Fpfixtools.git diff --git a/buffer.c b/buffer.c index 8342162..81855fd 100644 --- a/buffer.c +++ b/buffer.c @@ -1,5 +1,5 @@ /******************************************************************************/ -/* postlicyd: a postfix policy daemon with a lot of features */ +/* pfixtools: a collection of postfix related tools */ /* ~~~~~~~~~ */ /* ________________________________________________________________________ */ /* */ @@ -30,26 +30,44 @@ /******************************************************************************/ /* - * Copyright © 2006 Pierre Habouzit + * Copyright © 2006-2007 Pierre Habouzit */ +#include #include #include +#include "mem.h" #include "buffer.h" #define BUFSIZ_INCREMENT 256 void buffer_resize(buffer_t *buf, ssize_t newsize) { - if (newsize >= buf->size) { - /* rounds newsize to the 1024 multiple just after newsize+1 */ - newsize = (newsize + BUFSIZ_INCREMENT) & ~(BUFSIZ_INCREMENT - 1); - p_realloc(&buf->data, newsize); + p_allocgrow(&buf->data, newsize + 1, &buf->size); +} + +ssize_t buffer_addvf(buffer_t *buf, const char *fmt, va_list ap) +{ + ssize_t len, avail = buf->size - buf->len; + va_list ap2; + + va_copy(ap2, ap); + + len = vsnprintf(buf->data + buf->len, avail, fmt, ap); + if (len >= avail) { + buffer_resize(buf, buf->len + len); + avail = buf->size - buf->len; + len = vsnprintf(buf->data + buf->len, avail, fmt, ap2); } + buf->len += len; + buf->data[buf->len] = '\0'; + va_end(ap2); + return len; } -void buffer_consume(buffer_t *buf, ssize_t len) { +void buffer_consume(buffer_t *buf, ssize_t len) +{ if (len <= 0) return; @@ -80,3 +98,13 @@ ssize_t buffer_read(buffer_t *buf, int fd, ssize_t count) buffer_extend(buf, res); return res; } + +ssize_t buffer_write(buffer_t *buf, int fd) +{ + ssize_t res = write(fd, buf->data, buf->len); + if (res < 0) { + return errno == EINTR || errno == EAGAIN ? 0 : -1; + } + buffer_consume(buf, res); + return res; +}