From 9cb8daa20364796816730d17aab86362b0686310 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 15 Sep 2009 21:22:24 +0200 Subject: [PATCH] [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. --- include/proto/buffers.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/include/proto/buffers.h b/include/proto/buffers.h index a1834196a..3cde20922 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) {