X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=buffer.c;h=81855fd9c0a53c2ce1387bf246415d5258313c95;hb=9444dcb2ea8e2b24883d3f5740e28ca20d467ad2;hp=a0cf7b809f87aaa48698ad5fac257f660d197950;hpb=b1315f7af90c4d8047cf0c8f3c0a00b703676f84;p=apps%2Fpfixtools.git diff --git a/buffer.c b/buffer.c index a0cf7b8..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 */ /* ~~~~~~~~~ */ /* ________________________________________________________________________ */ /* */ @@ -33,23 +33,41 @@ * 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; +}