blob: 3b98f178a1d442d79ee8fa45c7ec4558f24891bf [file] [log] [blame]
Willy Tarreaubaaee002006-06-26 02:48:02 +02001/*
Willy Tarreau7c3c5412009-12-13 15:53:05 +01002 * include/proto/buffers.h
3 * Buffer management definitions, macros and inline functions.
4 *
Willy Tarreau9dab5fc2012-05-07 11:56:55 +02005 * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu
Willy Tarreau7c3c5412009-12-13 15:53:05 +01006 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation, version 2.1
10 * exclusively.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
Willy Tarreaubaaee002006-06-26 02:48:02 +020021
22#ifndef _PROTO_BUFFERS_H
23#define _PROTO_BUFFERS_H
24
Willy Tarreau7341d942007-05-13 19:56:02 +020025#include <stdio.h>
Willy Tarreau0f772532006-12-23 20:51:41 +010026#include <stdlib.h>
Willy Tarreau7341d942007-05-13 19:56:02 +020027#include <string.h>
Willy Tarreau0f772532006-12-23 20:51:41 +010028
Willy Tarreaue3ba5f02006-06-29 18:54:54 +020029#include <common/config.h>
Willy Tarreau7341d942007-05-13 19:56:02 +020030#include <common/memory.h>
Willy Tarreau0c303ee2008-07-07 00:09:58 +020031#include <common/ticks.h>
Willy Tarreaufa645582007-06-03 15:59:52 +020032#include <common/time.h>
33
Willy Tarreaubaaee002006-06-26 02:48:02 +020034#include <types/buffers.h>
Willy Tarreau7c3c5412009-12-13 15:53:05 +010035#include <types/global.h>
Willy Tarreaubaaee002006-06-26 02:48:02 +020036
Willy Tarreau7341d942007-05-13 19:56:02 +020037extern struct pool_head *pool2_buffer;
38
39/* perform minimal intializations, report 0 in case of error, 1 if OK. */
40int init_buffer();
41
Willy Tarreau74b08c92010-09-08 17:04:31 +020042/* SI-to-buffer functions : buffer_{get,put}_{char,block,string,chunk} */
Willy Tarreau9dab5fc2012-05-07 11:56:55 +020043int bo_inject(struct buffer *buf, const char *msg, int len);
44int bi_putblk(struct buffer *buf, const char *str, int len);
45int bi_putchr(struct buffer *buf, char c);
46int bo_getline(struct buffer *buf, char *str, int len);
47int bo_getblk(struct buffer *buf, char *blk, int len, int offset);
Willy Tarreau74b08c92010-09-08 17:04:31 +020048int buffer_replace2(struct buffer *b, char *pos, char *end, const char *str, int len);
49int buffer_insert_line2(struct buffer *b, char *pos, const char *str, int len);
50void buffer_dump(FILE *o, struct buffer *b, int from, int to);
51void buffer_bounce_realign(struct buffer *buf);
Willy Tarreau0bc34932011-03-28 16:25:58 +020052unsigned long long buffer_forward(struct buffer *buf, unsigned long long bytes);
Willy Tarreau74b08c92010-09-08 17:04:31 +020053
Willy Tarreau7c3c5412009-12-13 15:53:05 +010054/* Initialize all fields in the buffer. The BF_OUT_EMPTY flags is set. */
Willy Tarreau54469402006-07-29 16:59:06 +020055static inline void buffer_init(struct buffer *buf)
56{
Willy Tarreau2e046c62012-03-01 16:08:30 +010057 buf->o = 0;
Willy Tarreau02d6cfc2012-03-01 18:19:58 +010058 buf->i = 0;
Willy Tarreau6b66f3e2008-12-14 17:31:54 +010059 buf->to_forward = 0;
Willy Tarreau02d6cfc2012-03-01 18:19:58 +010060 buf->total = 0;
Willy Tarreau3eba98a2009-01-25 13:56:13 +010061 buf->pipe = NULL;
Willy Tarreau2df28e82008-08-17 15:20:19 +020062 buf->analysers = 0;
Willy Tarreaufa7e1022008-10-19 07:30:41 +020063 buf->cons = NULL;
Willy Tarreauba0b63d2009-09-20 08:09:44 +020064 buf->flags = BF_OUT_EMPTY;
Willy Tarreaua458b672012-03-05 11:17:50 +010065 buf->p = buf->data;
Willy Tarreau54469402006-07-29 16:59:06 +020066}
67
Willy Tarreau4b517ca2011-11-25 20:33:58 +010068/*****************************************************************/
69/* These functions are used to compute various buffer area sizes */
70/*****************************************************************/
71
Willy Tarreaucc5cfcb2012-05-04 21:35:27 +020072/* Returns an absolute pointer for a position relative to the current buffer's
73 * pointer. It is written so that it is optimal when <ofs> is a const. It is
74 * written as a macro instead of an inline function so that the compiler knows
75 * when it can optimize out the sign test on <ofs> when passed an unsigned int.
76 */
77#define b_ptr(b, ofs) \
78 ({ \
79 char *__ret = (b)->p + (ofs); \
80 if ((ofs) > 0 && __ret >= (b)->data + (b)->size) \
81 __ret -= (b)->size; \
82 else if ((ofs) < 0 && __ret < (b)->data) \
83 __ret += (b)->size; \
84 __ret; \
85 })
86
87/* Returns the start of the input data in a buffer */
88static inline char *bi_ptr(const struct buffer *b)
89{
90 return b->p;
91}
92
93/* Returns the end of the input data in a buffer (pointer to next
94 * insertion point).
95 */
96static inline char *bi_end(const struct buffer *b)
97{
98 char *ret = b->p + b->i;
99
100 if (ret >= b->data + b->size)
101 ret -= b->size;
102 return ret;
103}
104
105/* Returns the amount of input data that can contiguously be read at once */
106static inline int bi_contig_data(const struct buffer *b)
107{
108 int data = b->data + b->size - b->p;
109
110 if (data > b->i)
111 data = b->i;
112 return data;
113}
114
115/* Returns the start of the output data in a buffer */
116static inline char *bo_ptr(const struct buffer *b)
117{
118 char *ret = b->p - b->o;
119
120 if (ret < b->data)
121 ret += b->size;
122 return ret;
123}
124
125/* Returns the end of the output data in a buffer */
126static inline char *bo_end(const struct buffer *b)
127{
128 return b->p;
129}
130
131/* Returns the amount of output data that can contiguously be read at once */
132static inline int bo_contig_data(const struct buffer *b)
133{
134 char *beg = b->p - b->o;
135
136 if (beg < b->data)
137 return b->data - beg;
138 return b->o;
139}
140
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100141/* Return the buffer's length in bytes by summing the input and the output */
142static inline int buffer_len(const struct buffer *buf)
143{
144 return buf->i + buf->o;
145}
146
147/* Return non-zero only if the buffer is not empty */
148static inline int buffer_not_empty(const struct buffer *buf)
149{
150 return buf->i | buf->o;
151}
152
153/* Return non-zero only if the buffer is empty */
154static inline int buffer_empty(const struct buffer *buf)
155{
156 return !buffer_not_empty(buf);
157}
158
Willy Tarreau7fd758b2012-03-02 10:38:01 +0100159/* Normalizes a pointer after a subtract */
160static inline char *buffer_wrap_sub(const struct buffer *buf, char *ptr)
161{
162 if (ptr < buf->data)
163 ptr += buf->size;
164 return ptr;
165}
166
167/* Normalizes a pointer after an addition */
168static inline char *buffer_wrap_add(const struct buffer *buf, char *ptr)
169{
170 if (ptr - buf->size >= buf->data)
171 ptr -= buf->size;
172 return ptr;
173}
174
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100175/* Return the number of reserved bytes in the buffer, which ensures that once
176 * all pending data are forwarded, the buffer still has global.tune.maxrewrite
177 * bytes free. The result is between 0 and global.maxrewrite, which is itself
178 * smaller than any buf->size.
179 */
180static inline int buffer_reserved(const struct buffer *buf)
181{
Willy Tarreau2e046c62012-03-01 16:08:30 +0100182 int ret = global.tune.maxrewrite - buf->to_forward - buf->o;
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100183
184 if (buf->to_forward == BUF_INFINITE_FORWARD)
185 return 0;
186 if (ret <= 0)
187 return 0;
188 return ret;
189}
190
Willy Tarreau7c3c5412009-12-13 15:53:05 +0100191/* Return the max number of bytes the buffer can contain so that once all the
192 * pending bytes are forwarded, the buffer still has global.tune.maxrewrite
193 * bytes free. The result sits between buf->size - maxrewrite and buf->size.
194 */
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100195static inline int buffer_max_len(const struct buffer *buf)
196{
197 return buf->size - buffer_reserved(buf);
198}
199
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200200/* Returns non-zero if the buffer input is considered full. The reserved space
201 * is taken into account if ->to_forward indicates that an end of transfer is
202 * close to happen. The test is optimized to avoid as many operations as
203 * possible for the fast case and to be used as an "if" condition.
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100204 */
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200205static inline int bi_full(const struct buffer *b)
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100206{
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200207 int rem = b->size;
208
209 rem -= b->o;
210 rem -= b->i;
211 if (!rem)
212 return 1; /* buffer already full */
213
214 if (b->to_forward >= b->size ||
215 (BUF_INFINITE_FORWARD < MAX_RANGE(typeof(b->size)) && // just there to ensure gcc
216 b->to_forward == BUF_INFINITE_FORWARD)) // avoids the useless second
217 return 0; // test whenever possible
218
219 rem -= global.tune.maxrewrite;
220 rem += b->o;
221 rem += b->to_forward;
222 return rem <= 0;
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100223}
224
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200225/* Returns the amount of space available at the input of the buffer, taking the
226 * reserved space into account if ->to_forward indicates that an end of transfer
227 * is close to happen. The test is optimized to avoid as many operations as
228 * possible for the fast case.
229 */
230static inline int bi_avail(const struct buffer *b)
231{
232 int rem = b->size;
233 int rem2;
234
235 rem -= b->o;
236 rem -= b->i;
237 if (!rem)
238 return rem; /* buffer already full */
239
240 if (b->to_forward >= b->size ||
241 (BUF_INFINITE_FORWARD < MAX_RANGE(typeof(b->size)) && // just there to ensure gcc
242 b->to_forward == BUF_INFINITE_FORWARD)) // avoids the useless second
243 return rem; // test whenever possible
244
245 rem2 = rem - global.tune.maxrewrite;
246 rem2 += b->o;
247 rem2 += b->to_forward;
248
249 if (rem > rem2)
250 rem = rem2;
251 if (rem > 0)
252 return rem;
253 return 0;
254}
255
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100256/* Return the maximum amount of bytes that can be written into the buffer,
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200257 * including reserved space which may be overwritten.
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100258 */
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200259static inline int buffer_total_space(const struct buffer *buf)
Willy Tarreau7c3c5412009-12-13 15:53:05 +0100260{
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200261 return buf->size - buffer_len(buf);
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100262}
263
264/* Returns the number of contiguous bytes between <start> and <start>+<count>,
265 * and enforces a limit on buf->data + buf->size. <start> must be within the
266 * buffer.
267 */
268static inline int buffer_contig_area(const struct buffer *buf, const char *start, int count)
269{
270 if (count > buf->data - start + buf->size)
271 count = buf->data - start + buf->size;
272 return count;
273}
274
275/* Return the amount of bytes that can be written into the buffer at once,
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100276 * including reserved space which may be overwritten.
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100277 */
Willy Tarreau18dd41d2012-03-10 08:55:07 +0100278static inline int buffer_contig_space(const struct buffer *buf)
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100279{
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100280 const char *left, *right;
281
282 if (buf->data + buf->o <= buf->p)
283 right = buf->data + buf->size;
284 else
285 right = buf->p + buf->size - buf->o;
286
287 left = buffer_wrap_add(buf, buf->p + buf->i);
288 return right - left;
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100289}
290
Willy Tarreau328582c2012-05-05 23:32:27 +0200291/* Advances the buffer by <adv> bytes, which means that the buffer
292 * pointer advances, and that as many bytes from in are transferred
293 * to out. The caller is responsible for ensuring that adv is always
294 * smaller than or equal to b->i. The BF_OUT_EMPTY flag is updated.
295 */
296static inline void b_adv(struct buffer *b, unsigned int adv)
297{
298 b->i -= adv;
299 b->o += adv;
300 if (b->o)
301 b->flags &= ~BF_OUT_EMPTY;
302 b->p = b_ptr(b, adv);
303}
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100304
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100305/* Return the amount of bytes that can be written into the buffer at once,
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100306 * excluding the amount of reserved space passed in <res>, which is
307 * preserved.
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100308 */
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100309static inline int buffer_contig_space_with_res(const struct buffer *buf, int res)
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100310{
311 /* Proceed differently if the buffer is full, partially used or empty.
312 * The hard situation is when it's partially used and either data or
313 * reserved space wraps at the end.
314 */
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100315 int spare = buf->size - res;
316
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100317 if (buffer_len(buf) >= spare)
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100318 spare = 0;
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100319 else if (buffer_len(buf)) {
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100320 spare = buffer_contig_space(buf) - res;
321 if (spare < 0)
322 spare = 0;
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100323 }
324 return spare;
325}
326
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100327
328/* Return the amount of bytes that can be written into the buffer at once,
329 * excluding reserved space, which is preserved.
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100330 */
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100331static inline int buffer_contig_space_res(const struct buffer *buf)
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100332{
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100333 return buffer_contig_space_with_res(buf, buffer_reserved(buf));
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100334}
335
336/* Normalizes a pointer which is supposed to be relative to the beginning of a
337 * buffer, so that wrapping is correctly handled. The intent is to use this
338 * when increasing a pointer. Note that the wrapping test is only performed
Willy Tarreau71730252011-11-28 16:04:29 +0100339 * once, so the original pointer must be between ->data-size and ->data+2*size-1,
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100340 * otherwise an invalid pointer might be returned.
341 */
Willy Tarreau18dd41d2012-03-10 08:55:07 +0100342static inline const char *buffer_pointer(const struct buffer *buf, const char *ptr)
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100343{
Willy Tarreau71730252011-11-28 16:04:29 +0100344 if (ptr < buf->data)
345 ptr += buf->size;
346 else if (ptr - buf->size >= buf->data)
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100347 ptr -= buf->size;
348 return ptr;
349}
350
351/* Returns the distance between two pointers, taking into account the ability
352 * to wrap around the buffer's end.
353 */
Willy Tarreau18dd41d2012-03-10 08:55:07 +0100354static inline int buffer_count(const struct buffer *buf, const char *from, const char *to)
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100355{
356 int count = to - from;
357 if (count < 0)
358 count += buf->size;
359 return count;
360}
361
362/* returns the amount of pending bytes in the buffer. It is the amount of bytes
363 * that is not scheduled to be sent.
364 */
365static inline int buffer_pending(const struct buffer *buf)
366{
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100367 return buf->i;
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100368}
369
370/* Returns the size of the working area which the caller knows ends at <end>.
371 * If <end> equals buf->r (modulo size), then it means that the free area which
372 * follows is part of the working area. Otherwise, the working area stops at
Willy Tarreau89fa7062012-03-02 16:13:16 +0100373 * <end>. It always starts at buf->p. The work area includes the
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100374 * reserved area.
375 */
Willy Tarreau18dd41d2012-03-10 08:55:07 +0100376static inline int buffer_work_area(const struct buffer *buf, const char *end)
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100377{
378 end = buffer_pointer(buf, end);
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100379 if (end == buffer_wrap_add(buf, buf->p + buf->i))
380 /* pointer exactly at end, lets push forwards */
Willy Tarreau89fa7062012-03-02 16:13:16 +0100381 end = buffer_wrap_sub(buf, buf->p - buf->o);
382 return buffer_count(buf, buf->p, end);
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100383}
384
385/* Return 1 if the buffer has less than 1/4 of its capacity free, otherwise 0 */
386static inline int buffer_almost_full(const struct buffer *buf)
387{
388 if (buffer_total_space(buf) < buf->size / 4)
389 return 1;
390 return 0;
391}
392
Willy Tarreau74b08c92010-09-08 17:04:31 +0200393/* Returns true if the buffer's input is already closed */
394static inline int buffer_input_closed(struct buffer *buf)
395{
396 return ((buf->flags & BF_SHUTR) != 0);
397}
398
399/* Returns true if the buffer's output is already closed */
400static inline int buffer_output_closed(struct buffer *buf)
401{
402 return ((buf->flags & BF_SHUTW) != 0);
403}
404
Willy Tarreau2eb52f02008-09-04 09:14:08 +0200405/* Check buffer timeouts, and set the corresponding flags. The
406 * likely/unlikely have been optimized for fastest normal path.
Willy Tarreaudd80c6f2008-12-13 22:25:59 +0100407 * The read/write timeouts are not set if there was activity on the buffer.
408 * That way, we don't have to update the timeout on every I/O. Note that the
409 * analyser timeout is always checked.
Willy Tarreau2eb52f02008-09-04 09:14:08 +0200410 */
411static inline void buffer_check_timeouts(struct buffer *b)
412{
Willy Tarreau86491c32008-12-14 09:04:47 +0100413 if (likely(!(b->flags & (BF_SHUTR|BF_READ_TIMEOUT|BF_READ_ACTIVITY|BF_READ_NOEXP))) &&
Willy Tarreau2eb52f02008-09-04 09:14:08 +0200414 unlikely(tick_is_expired(b->rex, now_ms)))
415 b->flags |= BF_READ_TIMEOUT;
416
Willy Tarreaudd80c6f2008-12-13 22:25:59 +0100417 if (likely(!(b->flags & (BF_SHUTW|BF_WRITE_TIMEOUT|BF_WRITE_ACTIVITY))) &&
Willy Tarreau2eb52f02008-09-04 09:14:08 +0200418 unlikely(tick_is_expired(b->wex, now_ms)))
419 b->flags |= BF_WRITE_TIMEOUT;
420
421 if (likely(!(b->flags & BF_ANA_TIMEOUT)) &&
422 unlikely(tick_is_expired(b->analyse_exp, now_ms)))
423 b->flags |= BF_ANA_TIMEOUT;
424}
425
Willy Tarreau2e046c62012-03-01 16:08:30 +0100426/* Schedule all remaining buffer data to be sent. ->o is not touched if it
Willy Tarreaue8a28bf2009-03-08 21:12:04 +0100427 * already covers those data. That permits doing a flush even after a forward,
428 * although not recommended.
429 */
430static inline void buffer_flush(struct buffer *buf)
431{
Willy Tarreau363a5bb2012-03-02 20:14:45 +0100432 buf->p = buffer_wrap_add(buf, buf->p + buf->i);
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100433 buf->o += buf->i;
434 buf->i = 0;
Willy Tarreau2e046c62012-03-01 16:08:30 +0100435 if (buf->o)
Willy Tarreauba0b63d2009-09-20 08:09:44 +0200436 buf->flags &= ~BF_OUT_EMPTY;
Willy Tarreaue8a28bf2009-03-08 21:12:04 +0100437}
438
Willy Tarreau6f0aa472009-03-08 20:33:29 +0100439/* Erase any content from buffer <buf> and adjusts flags accordingly. Note
Willy Tarreau0abebcc2009-01-08 00:09:41 +0100440 * that any spliced data is not affected since we may not have any access to
441 * it.
Willy Tarreaue393fe22008-08-16 22:18:07 +0200442 */
Willy Tarreau6f0aa472009-03-08 20:33:29 +0100443static inline void buffer_erase(struct buffer *buf)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200444{
Willy Tarreau2e046c62012-03-01 16:08:30 +0100445 buf->o = 0;
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100446 buf->i = 0;
Willy Tarreau6b66f3e2008-12-14 17:31:54 +0100447 buf->to_forward = 0;
Willy Tarreaua458b672012-03-05 11:17:50 +0100448 buf->p = buf->data;
Willy Tarreauba0b63d2009-09-20 08:09:44 +0200449 buf->flags &= ~(BF_FULL | BF_OUT_EMPTY);
450 if (!buf->pipe)
451 buf->flags |= BF_OUT_EMPTY;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200452}
453
Willy Tarreau9cb8daa2009-09-15 21:22:24 +0200454/* Cut the "tail" of the buffer, which means strip it to the length of unsent
455 * data only, and kill any remaining unsent data. Any scheduled forwarding is
456 * stopped. This is mainly to be used to send error messages after existing
457 * data.
458 */
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200459static inline void bi_erase(struct buffer *buf)
Willy Tarreau9cb8daa2009-09-15 21:22:24 +0200460{
Willy Tarreau2e046c62012-03-01 16:08:30 +0100461 if (!buf->o)
Willy Tarreau9cb8daa2009-09-15 21:22:24 +0200462 return buffer_erase(buf);
463
464 buf->to_forward = 0;
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100465 if (!buf->i)
Willy Tarreau9cb8daa2009-09-15 21:22:24 +0200466 return;
467
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100468 buf->i = 0;
Willy Tarreauba0b63d2009-09-20 08:09:44 +0200469 buf->flags &= ~BF_FULL;
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200470 if (bi_full(buf))
Willy Tarreau9cb8daa2009-09-15 21:22:24 +0200471 buf->flags |= BF_FULL;
472}
473
Willy Tarreauec1bc822012-03-09 15:03:30 +0100474/* Cut the first <n> pending bytes in a contiguous buffer. It is illegal to
475 * call this function with remaining data waiting to be sent (o > 0). The
476 * caller must ensure that <n> is smaller than the actual buffer's length.
477 * This is mainly used to remove empty lines at the beginning of a request
478 * or a response.
Willy Tarreaud21e01c2009-12-27 15:45:38 +0100479 */
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200480static inline void bi_fast_delete(struct buffer *buf, int n)
Willy Tarreaud21e01c2009-12-27 15:45:38 +0100481{
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100482 buf->i -= n;
Willy Tarreauec1bc822012-03-09 15:03:30 +0100483 buf->p += n;
Willy Tarreaud21e01c2009-12-27 15:45:38 +0100484}
485
Willy Tarreaufa7e1022008-10-19 07:30:41 +0200486/* marks the buffer as "shutdown" ASAP for reads */
487static inline void buffer_shutr_now(struct buffer *buf)
488{
Willy Tarreaufe3718a2008-11-30 18:14:12 +0100489 buf->flags |= BF_SHUTR_NOW;
Willy Tarreaufa7e1022008-10-19 07:30:41 +0200490}
491
492/* marks the buffer as "shutdown" ASAP for writes */
493static inline void buffer_shutw_now(struct buffer *buf)
494{
495 buf->flags |= BF_SHUTW_NOW;
496}
497
498/* marks the buffer as "shutdown" ASAP in both directions */
499static inline void buffer_abort(struct buffer *buf)
500{
Willy Tarreaufe3718a2008-11-30 18:14:12 +0100501 buf->flags |= BF_SHUTR_NOW | BF_SHUTW_NOW;
Willy Tarreaue4599762010-03-21 23:25:09 +0100502 buf->flags &= ~BF_AUTO_CONNECT;
Willy Tarreaufa7e1022008-10-19 07:30:41 +0200503}
504
Willy Tarreau01bf8672008-12-07 18:03:29 +0100505/* Installs <func> as a hijacker on the buffer <b> for session <s>. The hijack
506 * flag is set, and the function called once. The function is responsible for
507 * clearing the hijack bit. It is possible that the function clears the flag
508 * during this first call.
509 */
510static inline void buffer_install_hijacker(struct session *s,
511 struct buffer *b,
512 void (*func)(struct session *, struct buffer *))
Willy Tarreau72b179a2008-08-28 16:01:32 +0200513{
Willy Tarreau01bf8672008-12-07 18:03:29 +0100514 b->hijacker = func;
515 b->flags |= BF_HIJACK;
516 func(s, b);
Willy Tarreau72b179a2008-08-28 16:01:32 +0200517}
518
Willy Tarreau01bf8672008-12-07 18:03:29 +0100519/* Releases the buffer from hijacking mode. Often used by the hijack function */
Willy Tarreau72b179a2008-08-28 16:01:32 +0200520static inline void buffer_stop_hijack(struct buffer *buf)
521{
522 buf->flags &= ~BF_HIJACK;
523}
524
Willy Tarreau520d95e2009-09-19 21:04:57 +0200525/* allow the consumer to try to establish a new connection. */
526static inline void buffer_auto_connect(struct buffer *buf)
Willy Tarreau3da77c52008-08-29 09:58:42 +0200527{
Willy Tarreau520d95e2009-09-19 21:04:57 +0200528 buf->flags |= BF_AUTO_CONNECT;
Willy Tarreau3da77c52008-08-29 09:58:42 +0200529}
530
Willy Tarreau520d95e2009-09-19 21:04:57 +0200531/* prevent the consumer from trying to establish a new connection, and also
532 * disable auto shutdown forwarding.
533 */
534static inline void buffer_dont_connect(struct buffer *buf)
Willy Tarreau3da77c52008-08-29 09:58:42 +0200535{
Willy Tarreau520d95e2009-09-19 21:04:57 +0200536 buf->flags &= ~(BF_AUTO_CONNECT|BF_AUTO_CLOSE);
Willy Tarreau3da77c52008-08-29 09:58:42 +0200537}
538
Willy Tarreau520d95e2009-09-19 21:04:57 +0200539/* allow the producer to forward shutdown requests */
540static inline void buffer_auto_close(struct buffer *buf)
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100541{
Willy Tarreau520d95e2009-09-19 21:04:57 +0200542 buf->flags |= BF_AUTO_CLOSE;
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100543}
544
Willy Tarreau520d95e2009-09-19 21:04:57 +0200545/* prevent the producer from forwarding shutdown requests */
546static inline void buffer_dont_close(struct buffer *buf)
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100547{
Willy Tarreau520d95e2009-09-19 21:04:57 +0200548 buf->flags &= ~BF_AUTO_CLOSE;
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100549}
550
Willy Tarreau90deb182010-01-07 00:20:41 +0100551/* allow the producer to read / poll the input */
552static inline void buffer_auto_read(struct buffer *buf)
553{
554 buf->flags &= ~BF_DONT_READ;
555}
556
557/* prevent the producer from read / poll the input */
558static inline void buffer_dont_read(struct buffer *buf)
559{
560 buf->flags |= BF_DONT_READ;
561}
562
Willy Tarreaubaaee002006-06-26 02:48:02 +0200563/*
564 * Tries to realign the given buffer, and returns how many bytes can be written
565 * there at once without overwriting anything.
566 */
567static inline int buffer_realign(struct buffer *buf)
568{
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100569 if (!(buf->i | buf->o)) {
Willy Tarreaubaaee002006-06-26 02:48:02 +0200570 /* let's realign the buffer to optimize I/O */
Willy Tarreaua458b672012-03-05 11:17:50 +0100571 buf->p = buf->data;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200572 }
Willy Tarreau4b517ca2011-11-25 20:33:58 +0100573 return buffer_contig_space(buf);
Willy Tarreau2b7addc2009-08-31 07:37:22 +0200574}
575
576/*
577 * Advance the buffer's read pointer by <len> bytes. This is useful when data
578 * have been read directly from the buffer. It is illegal to call this function
579 * with <len> causing a wrapping at the end of the buffer. It's the caller's
Willy Tarreau2e046c62012-03-01 16:08:30 +0100580 * responsibility to ensure that <len> is never larger than buf->o.
Willy Tarreau2b7addc2009-08-31 07:37:22 +0200581 */
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200582static inline void bo_skip(struct buffer *buf, int len)
Willy Tarreau2b7addc2009-08-31 07:37:22 +0200583{
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100584 buf->o -= len;
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200585 if (!buf->o && !buf->pipe)
586 buf->flags |= BF_OUT_EMPTY;
587
Willy Tarreau02d6cfc2012-03-01 18:19:58 +0100588 if (buffer_len(buf) == 0)
Willy Tarreaua458b672012-03-05 11:17:50 +0100589 buf->p = buf->data;
Willy Tarreau2b7addc2009-08-31 07:37:22 +0200590
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200591 if (!bi_full(buf))
Willy Tarreau2b7addc2009-08-31 07:37:22 +0200592 buf->flags &= ~BF_FULL;
593
Willy Tarreaufb0e9202009-09-23 23:47:55 +0200594 /* notify that some data was written to the SI from the buffer */
595 buf->flags |= BF_WRITE_PARTIAL;
Willy Tarreau2b7addc2009-08-31 07:37:22 +0200596}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200597
Willy Tarreau74b08c92010-09-08 17:04:31 +0200598/* Tries to copy chunk <chunk> into buffer <buf> after length controls.
Willy Tarreau2e046c62012-03-01 16:08:30 +0100599 * The ->o and to_forward pointers are updated. If the buffer's input is
Willy Tarreau74b08c92010-09-08 17:04:31 +0200600 * closed, -2 is returned. If the block is too large for this buffer, -3 is
601 * returned. If there is not enough room left in the buffer, -1 is returned.
602 * Otherwise the number of bytes copied is returned (0 being a valid number).
603 * Buffer flags FULL, EMPTY and READ_PARTIAL are updated if some data can be
604 * transferred. The chunk's length is updated with the number of bytes sent.
Willy Tarreauaeac3192009-08-31 08:09:57 +0200605 */
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200606static inline int bi_putchk(struct buffer *buf, struct chunk *chunk)
Willy Tarreauaeac3192009-08-31 08:09:57 +0200607{
608 int ret;
609
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200610 ret = bi_putblk(buf, chunk->str, chunk->len);
Willy Tarreau74b08c92010-09-08 17:04:31 +0200611 if (ret > 0)
612 chunk->len -= ret;
Willy Tarreauaeac3192009-08-31 08:09:57 +0200613 return ret;
614}
615
Willy Tarreau74b08c92010-09-08 17:04:31 +0200616/* Tries to copy string <str> at once into buffer <buf> after length controls.
Willy Tarreau2e046c62012-03-01 16:08:30 +0100617 * The ->o and to_forward pointers are updated. If the buffer's input is
Willy Tarreau74b08c92010-09-08 17:04:31 +0200618 * closed, -2 is returned. If the block is too large for this buffer, -3 is
619 * returned. If there is not enough room left in the buffer, -1 is returned.
620 * Otherwise the number of bytes copied is returned (0 being a valid number).
621 * Buffer flags FULL, EMPTY and READ_PARTIAL are updated if some data can be
622 * transferred.
623 */
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200624static inline int bi_putstr(struct buffer *buf, const char *str)
Willy Tarreau74b08c92010-09-08 17:04:31 +0200625{
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200626 return bi_putblk(buf, str, strlen(str));
Willy Tarreau74b08c92010-09-08 17:04:31 +0200627}
628
629/*
630 * Return one char from the buffer. If the buffer is empty and closed, return -2.
631 * If the buffer is just empty, return -1. The buffer's pointer is not advanced,
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200632 * it's up to the caller to call bo_skip(buf, 1) when it has consumed the char.
Willy Tarreau2e046c62012-03-01 16:08:30 +0100633 * Also note that this function respects the ->o limit.
Willy Tarreau74b08c92010-09-08 17:04:31 +0200634 */
Willy Tarreau9dab5fc2012-05-07 11:56:55 +0200635static inline int bo_getchr(struct buffer *buf)
Willy Tarreau74b08c92010-09-08 17:04:31 +0200636{
637 /* closed or empty + imminent close = -2; empty = -1 */
638 if (unlikely(buf->flags & (BF_OUT_EMPTY|BF_SHUTW))) {
639 if (buf->flags & (BF_SHUTW|BF_SHUTW_NOW))
640 return -2;
641 return -1;
642 }
Willy Tarreau89fa7062012-03-02 16:13:16 +0100643 return *buffer_wrap_sub(buf, buf->p - buf->o);
Willy Tarreau74b08c92010-09-08 17:04:31 +0200644}
645
Willy Tarreau19ae56b2011-11-28 10:36:13 +0100646/* This function writes the string <str> at position <pos> which must be in
647 * buffer <b>, and moves <end> just after the end of <str>. <b>'s parameters
648 * (l, r, lr) are updated to be valid after the shift. the shift value
649 * (positive or negative) is returned. If there's no space left, the move is
Willy Tarreau2e046c62012-03-01 16:08:30 +0100650 * not done. The function does not adjust ->o nor BF_OUT_EMPTY because
Willy Tarreau19ae56b2011-11-28 10:36:13 +0100651 * it does not make sense to use it on data scheduled to be sent.
652 */
653static inline int buffer_replace(struct buffer *b, char *pos, char *end, const char *str)
654{
655 return buffer_replace2(b, pos, end, str, strlen(str));
656}
657
Willy Tarreau74b08c92010-09-08 17:04:31 +0200658/*
659 *
660 * Functions below are used to manage chunks
661 *
662 */
663
Krzysztof Piotr Oledzki78abe612009-09-27 13:23:20 +0200664static inline void chunk_init(struct chunk *chk, char *str, size_t size) {
665 chk->str = str;
666 chk->len = 0;
667 chk->size = size;
668}
669
670/* report 0 in case of error, 1 if OK. */
Krzysztof Piotr Oledzki6f61b212009-10-04 23:34:15 +0200671static inline int chunk_initlen(struct chunk *chk, char *str, size_t size, int len) {
Krzysztof Piotr Oledzki78abe612009-09-27 13:23:20 +0200672
Krzysztof Piotr Oledzki6f61b212009-10-04 23:34:15 +0200673 if (size && len > size)
Krzysztof Piotr Oledzki78abe612009-09-27 13:23:20 +0200674 return 0;
675
676 chk->str = str;
677 chk->len = len;
678 chk->size = size;
679
680 return 1;
681}
682
683static inline void chunk_initstr(struct chunk *chk, char *str) {
684 chk->str = str;
685 chk->len = strlen(str);
686 chk->size = 0; /* mark it read-only */
687}
688
689static inline int chunk_strcpy(struct chunk *chk, const char *str) {
690 size_t len;
691
692 len = strlen(str);
693
694 if (unlikely(len > chk->size))
695 return 0;
696
697 chk->len = len;
698 memcpy(chk->str, str, len);
699
700 return 1;
701}
702
703int chunk_printf(struct chunk *chk, const char *fmt, ...)
704 __attribute__ ((format(printf, 2, 3)));
705
Krzysztof Piotr Oledzkiba8d7d32009-10-10 21:06:03 +0200706int chunk_htmlencode(struct chunk *dst, struct chunk *src);
707int chunk_asciiencode(struct chunk *dst, struct chunk *src, char qc);
708
Krzysztof Piotr Oledzki78abe612009-09-27 13:23:20 +0200709static inline void chunk_reset(struct chunk *chk) {
710 chk->str = NULL;
711 chk->len = -1;
712 chk->size = 0;
713}
714
715static inline void chunk_destroy(struct chunk *chk) {
716
717 if (!chk->size)
718 return;
719
720 if (chk->str)
721 free(chk->str);
722
723 chunk_reset(chk);
724}
725
Willy Tarreau0f772532006-12-23 20:51:41 +0100726/*
727 * frees the destination chunk if already allocated, allocates a new string,
728 * and copies the source into it. The pointer to the destination string is
729 * returned, or NULL if the allocation fails or if any pointer is NULL..
730 */
731static inline char *chunk_dup(struct chunk *dst, const struct chunk *src) {
732 if (!dst || !src || !src->str)
733 return NULL;
734 if (dst->str)
735 free(dst->str);
736 dst->len = src->len;
737 dst->str = (char *)malloc(dst->len);
738 memcpy(dst->str, src->str, dst->len);
739 return dst->str;
740}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200741
742#endif /* _PROTO_BUFFERS_H */
743
744/*
745 * Local variables:
746 * c-indent-level: 8
747 * c-basic-offset: 8
748 * End:
749 */