X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=buffer.c;h=81855fd9c0a53c2ce1387bf246415d5258313c95;hb=6d692d51a497e480ac4b0f4f63e6ce2539419e36;hp=366b7d03bac38001892f6af7146b19c3888df999;hpb=42ea2884f2b8a1b7cb940f4e07d22444c6f61cc6;p=apps%2Fpfixtools.git diff --git a/buffer.c b/buffer.c index 366b7d0..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,23 +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; @@ -58,3 +79,32 @@ void buffer_consume(buffer_t *buf, ssize_t len) { memmove(buf->data, buf->data + len, buf->len + 1 - len); buf->len -= len; } + +ssize_t buffer_read(buffer_t *buf, int fd, ssize_t count) +{ + ssize_t res; + + if (count < 0) + count = BUFSIZ; + + buffer_ensure(buf, count); + + res = read(fd, buf->data + buf->len, count); + if (res < 0) { + buf->data[buf->len] = '\0'; + return res; + } + + 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; +}