From: Willy Tarreau Date: Tue, 15 Sep 2009 19:22:24 +0000 (+0200) Subject: [MINOR] buffers: add buffer_cut_tail() to cut only unsent data X-Git-Tag: v1.4-dev3~22 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9cb8daa20364796816730d17aab86362b0686310;p=thirdparty%2Fhaproxy.git [MINOR] buffers: add buffer_cut_tail() to cut only unsent data This function is used to cut the "tail" of a buffer, which means strip it to the length of unsent data only, and kill any remaining unsent data. Any scheduled forwarding is stopped. This is mainly to be used to send error messages after existing data. It does the same as buffer_erase() for buffers without pending outgoing data. --- diff --git a/include/proto/buffers.h b/include/proto/buffers.h index a1834196a1..3cde209227 100644 --- a/include/proto/buffers.h +++ b/include/proto/buffers.h @@ -135,6 +135,30 @@ static inline void buffer_erase(struct buffer *buf) buf->flags &= ~BF_FULL; } +/* Cut the "tail" of the buffer, which means strip it to the length of unsent + * data only, and kill any remaining unsent data. Any scheduled forwarding is + * stopped. This is mainly to be used to send error messages after existing + * data. + */ +static inline void buffer_cut_tail(struct buffer *buf) +{ + if (!buf->send_max) + return buffer_erase(buf); + + buf->to_forward = 0; + if (buf->l == buf->send_max) + return; + + buf->l = buf->send_max; + buf->r = buf->w + buf->l; + if (buf->r >= buf->data + buf->size) + buf->r -= buf->size; + buf->lr = buf->r; + buf->flags &= ~(BF_EMPTY|BF_FULL); + if (buf->l >= buf->max_len) + buf->flags |= BF_FULL; +} + /* marks the buffer as "shutdown" for reads and cancels the timeout */ static inline void buffer_shutr(struct buffer *buf) {