blob: ab47b4f7cbbb0877d977feacd5e1878dd78346cc [file] [log] [blame]
Willy Tarreaubaaee002006-06-26 02:48:02 +02001/*
2 include/proto/buffers.h
3 Buffer management definitions, macros and inline functions.
4
Willy Tarreau2b7addc2009-08-31 07:37:22 +02005 Copyright (C) 2000-2009 Willy Tarreau - w@1wt.eu
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +01006
Willy Tarreaubaaee002006-06-26 02:48:02 +02007 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*/
21
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>
35
Willy Tarreau7341d942007-05-13 19:56:02 +020036extern struct pool_head *pool2_buffer;
37
38/* perform minimal intializations, report 0 in case of error, 1 if OK. */
39int init_buffer();
40
Willy Tarreau03d60bb2009-01-09 11:13:00 +010041/* Initializes all fields in the buffer. The ->max_len field is initialized last
Willy Tarreau54469402006-07-29 16:59:06 +020042 * so that the compiler can optimize it away if changed immediately after the
Willy Tarreaue393fe22008-08-16 22:18:07 +020043 * call to this function. By default, it is set to the full size of the buffer.
Willy Tarreaua07a34e2009-08-16 23:27:46 +020044 * This implies that buffer_init() must only be called once ->size is set !
Willy Tarreauba0b63d2009-09-20 08:09:44 +020045 * The BF_OUT_EMPTY flags is set.
Willy Tarreau54469402006-07-29 16:59:06 +020046 */
47static inline void buffer_init(struct buffer *buf)
48{
Willy Tarreauf890dc92008-12-13 21:12:26 +010049 buf->send_max = 0;
Willy Tarreau6b66f3e2008-12-14 17:31:54 +010050 buf->to_forward = 0;
Willy Tarreaue393fe22008-08-16 22:18:07 +020051 buf->l = buf->total = 0;
Willy Tarreau3eba98a2009-01-25 13:56:13 +010052 buf->pipe = NULL;
Willy Tarreau2df28e82008-08-17 15:20:19 +020053 buf->analysers = 0;
Willy Tarreaufa7e1022008-10-19 07:30:41 +020054 buf->cons = NULL;
Willy Tarreauba0b63d2009-09-20 08:09:44 +020055 buf->flags = BF_OUT_EMPTY;
Willy Tarreau2df28e82008-08-17 15:20:19 +020056 buf->r = buf->lr = buf->w = buf->data;
Willy Tarreaua07a34e2009-08-16 23:27:46 +020057 buf->max_len = buf->size;
Willy Tarreau54469402006-07-29 16:59:06 +020058}
59
Willy Tarreau2eb52f02008-09-04 09:14:08 +020060/* Check buffer timeouts, and set the corresponding flags. The
61 * likely/unlikely have been optimized for fastest normal path.
Willy Tarreaudd80c6f2008-12-13 22:25:59 +010062 * The read/write timeouts are not set if there was activity on the buffer.
63 * That way, we don't have to update the timeout on every I/O. Note that the
64 * analyser timeout is always checked.
Willy Tarreau2eb52f02008-09-04 09:14:08 +020065 */
66static inline void buffer_check_timeouts(struct buffer *b)
67{
Willy Tarreau86491c32008-12-14 09:04:47 +010068 if (likely(!(b->flags & (BF_SHUTR|BF_READ_TIMEOUT|BF_READ_ACTIVITY|BF_READ_NOEXP))) &&
Willy Tarreau2eb52f02008-09-04 09:14:08 +020069 unlikely(tick_is_expired(b->rex, now_ms)))
70 b->flags |= BF_READ_TIMEOUT;
71
Willy Tarreaudd80c6f2008-12-13 22:25:59 +010072 if (likely(!(b->flags & (BF_SHUTW|BF_WRITE_TIMEOUT|BF_WRITE_ACTIVITY))) &&
Willy Tarreau2eb52f02008-09-04 09:14:08 +020073 unlikely(tick_is_expired(b->wex, now_ms)))
74 b->flags |= BF_WRITE_TIMEOUT;
75
76 if (likely(!(b->flags & BF_ANA_TIMEOUT)) &&
77 unlikely(tick_is_expired(b->analyse_exp, now_ms)))
78 b->flags |= BF_ANA_TIMEOUT;
79}
80
Willy Tarreau0abebcc2009-01-08 00:09:41 +010081/* Schedule <bytes> more bytes to be forwarded by the buffer without notifying
82 * the task. Any pending data in the buffer is scheduled to be sent as well,
83 * in the limit of the number of bytes to forward. This must be the only method
84 * to use to schedule bytes to be sent. Directly touching ->to_forward will
85 * cause lockups when send_max goes down to zero if nobody is ready to push the
86 * remaining data.
87 */
Willy Tarreau31971e52009-09-20 12:07:52 +020088static inline void buffer_forward(struct buffer *buf, unsigned long bytes)
Willy Tarreau0abebcc2009-01-08 00:09:41 +010089{
Willy Tarreau31971e52009-09-20 12:07:52 +020090 unsigned long data_left;
Willy Tarreau0abebcc2009-01-08 00:09:41 +010091
Willy Tarreauba0b63d2009-09-20 08:09:44 +020092 if (!bytes)
93 return;
Willy Tarreau0abebcc2009-01-08 00:09:41 +010094 data_left = buf->l - buf->send_max;
Willy Tarreau91aa5772009-09-15 20:32:30 +020095 if (data_left >= bytes) {
96 buf->send_max += bytes;
Willy Tarreau2d028db2009-09-20 22:56:25 +020097 buf->flags &= ~BF_OUT_EMPTY;
Willy Tarreau91aa5772009-09-15 20:32:30 +020098 return;
99 }
Willy Tarreau0abebcc2009-01-08 00:09:41 +0100100
Willy Tarreau0abebcc2009-01-08 00:09:41 +0100101 buf->send_max += data_left;
Willy Tarreau2d028db2009-09-20 22:56:25 +0200102 if (buf->send_max)
103 buf->flags &= ~BF_OUT_EMPTY;
104
Willy Tarreau31971e52009-09-20 12:07:52 +0200105 if (buf->to_forward == BUF_INFINITE_FORWARD)
106 return;
107
108 buf->to_forward += bytes - data_left;
109 if (bytes == BUF_INFINITE_FORWARD)
110 buf->to_forward = bytes;
Willy Tarreau0abebcc2009-01-08 00:09:41 +0100111}
112
Willy Tarreaue8a28bf2009-03-08 21:12:04 +0100113/* Schedule all remaining buffer data to be sent. send_max is not touched if it
114 * already covers those data. That permits doing a flush even after a forward,
115 * although not recommended.
116 */
117static inline void buffer_flush(struct buffer *buf)
118{
119 if (buf->send_max < buf->l)
120 buf->send_max = buf->l;
Willy Tarreauba0b63d2009-09-20 08:09:44 +0200121 if (buf->send_max)
122 buf->flags &= ~BF_OUT_EMPTY;
Willy Tarreaue8a28bf2009-03-08 21:12:04 +0100123}
124
Willy Tarreau6f0aa472009-03-08 20:33:29 +0100125/* Erase any content from buffer <buf> and adjusts flags accordingly. Note
Willy Tarreau0abebcc2009-01-08 00:09:41 +0100126 * that any spliced data is not affected since we may not have any access to
127 * it.
Willy Tarreaue393fe22008-08-16 22:18:07 +0200128 */
Willy Tarreau6f0aa472009-03-08 20:33:29 +0100129static inline void buffer_erase(struct buffer *buf)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200130{
Willy Tarreauf890dc92008-12-13 21:12:26 +0100131 buf->send_max = 0;
Willy Tarreau6b66f3e2008-12-14 17:31:54 +0100132 buf->to_forward = 0;
Willy Tarreaue09e0ce2007-03-18 16:31:29 +0100133 buf->r = buf->lr = buf->w = buf->data;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200134 buf->l = 0;
Willy Tarreauba0b63d2009-09-20 08:09:44 +0200135 buf->flags &= ~(BF_FULL | BF_OUT_EMPTY);
136 if (!buf->pipe)
137 buf->flags |= BF_OUT_EMPTY;
138 if (!buf->max_len)
139 buf->flags |= BF_FULL;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200140}
141
Willy Tarreau9cb8daa2009-09-15 21:22:24 +0200142/* Cut the "tail" of the buffer, which means strip it to the length of unsent
143 * data only, and kill any remaining unsent data. Any scheduled forwarding is
144 * stopped. This is mainly to be used to send error messages after existing
145 * data.
146 */
147static inline void buffer_cut_tail(struct buffer *buf)
148{
149 if (!buf->send_max)
150 return buffer_erase(buf);
151
152 buf->to_forward = 0;
153 if (buf->l == buf->send_max)
154 return;
155
156 buf->l = buf->send_max;
157 buf->r = buf->w + buf->l;
158 if (buf->r >= buf->data + buf->size)
159 buf->r -= buf->size;
160 buf->lr = buf->r;
Willy Tarreauba0b63d2009-09-20 08:09:44 +0200161 buf->flags &= ~BF_FULL;
Willy Tarreau9cb8daa2009-09-15 21:22:24 +0200162 if (buf->l >= buf->max_len)
163 buf->flags |= BF_FULL;
164}
165
Willy Tarreauba392ce2008-08-16 21:13:23 +0200166/* marks the buffer as "shutdown" for reads and cancels the timeout */
Willy Tarreaufa645582007-06-03 15:59:52 +0200167static inline void buffer_shutr(struct buffer *buf)
168{
Willy Tarreau0c303ee2008-07-07 00:09:58 +0200169 buf->rex = TICK_ETERNITY;
Willy Tarreauba392ce2008-08-16 21:13:23 +0200170 buf->flags |= BF_SHUTR;
Willy Tarreaufa645582007-06-03 15:59:52 +0200171}
172
Willy Tarreauba392ce2008-08-16 21:13:23 +0200173/* marks the buffer as "shutdown" for writes and cancels the timeout */
Willy Tarreaufa645582007-06-03 15:59:52 +0200174static inline void buffer_shutw(struct buffer *buf)
175{
Willy Tarreau0c303ee2008-07-07 00:09:58 +0200176 buf->wex = TICK_ETERNITY;
Willy Tarreauba392ce2008-08-16 21:13:23 +0200177 buf->flags |= BF_SHUTW;
Willy Tarreaufa645582007-06-03 15:59:52 +0200178}
179
Willy Tarreaufa7e1022008-10-19 07:30:41 +0200180/* marks the buffer as "shutdown" ASAP for reads */
181static inline void buffer_shutr_now(struct buffer *buf)
182{
Willy Tarreaufe3718a2008-11-30 18:14:12 +0100183 buf->flags |= BF_SHUTR_NOW;
Willy Tarreaufa7e1022008-10-19 07:30:41 +0200184}
185
186/* marks the buffer as "shutdown" ASAP for writes */
187static inline void buffer_shutw_now(struct buffer *buf)
188{
189 buf->flags |= BF_SHUTW_NOW;
190}
191
192/* marks the buffer as "shutdown" ASAP in both directions */
193static inline void buffer_abort(struct buffer *buf)
194{
Willy Tarreaufe3718a2008-11-30 18:14:12 +0100195 buf->flags |= BF_SHUTR_NOW | BF_SHUTW_NOW;
Willy Tarreaufa7e1022008-10-19 07:30:41 +0200196}
197
Willy Tarreau01bf8672008-12-07 18:03:29 +0100198/* Installs <func> as a hijacker on the buffer <b> for session <s>. The hijack
199 * flag is set, and the function called once. The function is responsible for
200 * clearing the hijack bit. It is possible that the function clears the flag
201 * during this first call.
202 */
203static inline void buffer_install_hijacker(struct session *s,
204 struct buffer *b,
205 void (*func)(struct session *, struct buffer *))
Willy Tarreau72b179a2008-08-28 16:01:32 +0200206{
Willy Tarreau01bf8672008-12-07 18:03:29 +0100207 b->hijacker = func;
208 b->flags |= BF_HIJACK;
209 func(s, b);
Willy Tarreau72b179a2008-08-28 16:01:32 +0200210}
211
Willy Tarreau01bf8672008-12-07 18:03:29 +0100212/* Releases the buffer from hijacking mode. Often used by the hijack function */
Willy Tarreau72b179a2008-08-28 16:01:32 +0200213static inline void buffer_stop_hijack(struct buffer *buf)
214{
215 buf->flags &= ~BF_HIJACK;
216}
217
Willy Tarreau520d95e2009-09-19 21:04:57 +0200218/* allow the consumer to try to establish a new connection. */
219static inline void buffer_auto_connect(struct buffer *buf)
Willy Tarreau3da77c52008-08-29 09:58:42 +0200220{
Willy Tarreau520d95e2009-09-19 21:04:57 +0200221 buf->flags |= BF_AUTO_CONNECT;
Willy Tarreau3da77c52008-08-29 09:58:42 +0200222}
223
Willy Tarreau520d95e2009-09-19 21:04:57 +0200224/* prevent the consumer from trying to establish a new connection, and also
225 * disable auto shutdown forwarding.
226 */
227static inline void buffer_dont_connect(struct buffer *buf)
Willy Tarreau3da77c52008-08-29 09:58:42 +0200228{
Willy Tarreau520d95e2009-09-19 21:04:57 +0200229 buf->flags &= ~(BF_AUTO_CONNECT|BF_AUTO_CLOSE);
Willy Tarreau3da77c52008-08-29 09:58:42 +0200230}
231
Willy Tarreau520d95e2009-09-19 21:04:57 +0200232/* allow the producer to forward shutdown requests */
233static inline void buffer_auto_close(struct buffer *buf)
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100234{
Willy Tarreau520d95e2009-09-19 21:04:57 +0200235 buf->flags |= BF_AUTO_CLOSE;
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100236}
237
Willy Tarreau520d95e2009-09-19 21:04:57 +0200238/* prevent the producer from forwarding shutdown requests */
239static inline void buffer_dont_close(struct buffer *buf)
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100240{
Willy Tarreau520d95e2009-09-19 21:04:57 +0200241 buf->flags &= ~BF_AUTO_CLOSE;
Willy Tarreau0a5d5dd2008-11-23 19:31:35 +0100242}
243
Willy Tarreaubaaee002006-06-26 02:48:02 +0200244/* returns the maximum number of bytes writable at once in this buffer */
Willy Tarreaub17916e2006-10-15 15:17:57 +0200245static inline int buffer_max(const struct buffer *buf)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200246{
Willy Tarreaua07a34e2009-08-16 23:27:46 +0200247 if (buf->l == buf->size)
Willy Tarreaubaaee002006-06-26 02:48:02 +0200248 return 0;
249 else if (buf->r >= buf->w)
Willy Tarreaua07a34e2009-08-16 23:27:46 +0200250 return buf->data + buf->size - buf->r;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200251 else
252 return buf->w - buf->r;
253}
254
Willy Tarreaue393fe22008-08-16 22:18:07 +0200255/* sets the buffer read limit to <size> bytes, and adjusts the FULL
256 * flag accordingly.
257 */
258static inline void buffer_set_rlim(struct buffer *buf, int size)
259{
Willy Tarreau03d60bb2009-01-09 11:13:00 +0100260 buf->max_len = size;
Willy Tarreaue393fe22008-08-16 22:18:07 +0200261 if (buf->l < size)
262 buf->flags &= ~BF_FULL;
263 else
264 buf->flags |= BF_FULL;
265}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200266
267/*
268 * Tries to realign the given buffer, and returns how many bytes can be written
269 * there at once without overwriting anything.
270 */
271static inline int buffer_realign(struct buffer *buf)
272{
273 if (buf->l == 0) {
274 /* let's realign the buffer to optimize I/O */
Willy Tarreaue09e0ce2007-03-18 16:31:29 +0100275 buf->r = buf->w = buf->lr = buf->data;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200276 }
277 return buffer_max(buf);
278}
279
Willy Tarreau2b7addc2009-08-31 07:37:22 +0200280/*
281 * Return the max amount of bytes that can be stuffed into the buffer at once.
282 * Note that this may be lower than the actual buffer size when the free space
283 * wraps after the end, so it's preferable to call this function again after
284 * writing. Also note that this function respects max_len.
285 */
286static inline int buffer_contig_space(struct buffer *buf)
287{
288 int ret;
289
290 if (buf->l == 0) {
291 buf->r = buf->w = buf->lr = buf->data;
292 ret = buf->max_len;
293 }
294 else if (buf->r > buf->w) {
295 ret = buf->data + buf->max_len - buf->r;
296 }
297 else {
298 ret = buf->w - buf->r;
299 if (ret > buf->max_len)
300 ret = buf->max_len;
301 }
302 return ret;
303}
304
305/*
306 * Return the max amount of bytes that can be read from the buffer at once.
307 * Note that this may be lower than the actual buffer length when the data
308 * wrap after the end, so it's preferable to call this function again after
309 * reading. Also note that this function respects the send_max limit.
310 */
311static inline int buffer_contig_data(struct buffer *buf)
312{
313 int ret;
314
315 if (!buf->send_max || !buf->l)
316 return 0;
317
318 if (buf->r > buf->w)
319 ret = buf->r - buf->w;
320 else
321 ret = buf->data + buf->size - buf->w;
322
323 /* limit the amount of outgoing data if required */
324 if (ret > buf->send_max)
325 ret = buf->send_max;
326
327 return ret;
328}
329
330/*
331 * Advance the buffer's read pointer by <len> bytes. This is useful when data
332 * have been read directly from the buffer. It is illegal to call this function
333 * with <len> causing a wrapping at the end of the buffer. It's the caller's
334 * responsibility to ensure that <len> is never larger than buffer_contig_data.
335 */
336static inline void buffer_skip(struct buffer *buf, int len)
337{
338 buf->w += len;
339 if (buf->w == buf->data + buf->size)
340 buf->w = buf->data; /* wrap around the buffer */
341
342 buf->l -= len;
Willy Tarreauba0b63d2009-09-20 08:09:44 +0200343 if (!buf->l)
Willy Tarreau2b7addc2009-08-31 07:37:22 +0200344 buf->r = buf->w = buf->lr = buf->data;
Willy Tarreau2b7addc2009-08-31 07:37:22 +0200345
346 if (buf->l < buf->max_len)
347 buf->flags &= ~BF_FULL;
348
349 buf->send_max -= len;
Willy Tarreauba0b63d2009-09-20 08:09:44 +0200350 if (!buf->send_max && !buf->pipe)
351 buf->flags |= BF_OUT_EMPTY;
Willy Tarreaufb0e9202009-09-23 23:47:55 +0200352
353 /* notify that some data was written to the SI from the buffer */
354 buf->flags |= BF_WRITE_PARTIAL;
Willy Tarreau2b7addc2009-08-31 07:37:22 +0200355}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200356
Willy Tarreau4fe7a2e2009-09-01 06:41:32 +0200357/*
358 * Return one char from the buffer. If the buffer is empty and closed, return -1.
359 * If the buffer is just empty, return -2. The buffer's pointer is not advanced,
360 * it's up to the caller to call buffer_skip(buf, 1) when it has consumed the char.
361 * Also note that this function respects the send_max limit.
362 */
363static inline int buffer_si_peekchar(struct buffer *buf)
364{
365 if (buf->send_max)
366 return *buf->w;
367
368 if (buf->flags & (BF_SHUTW|BF_SHUTW_NOW))
369 return -1;
370 else
371 return -2;
372}
373
Willy Tarreauc77e7612009-09-13 14:58:00 +0200374/* Try to write character <c> into buffer <buf> after length controls. This
375 * work like buffer_feed(buf, &c, 1).
376 * Returns non-zero in case of success, 0 if the buffer was full.
377 * The send limit is automatically adjusted with the amount of data written.
378 */
379static inline int buffer_si_putchar(struct buffer *buf, char c)
380{
381 if (buf->flags & BF_FULL)
382 return 0;
383
Willy Tarreauc77e7612009-09-13 14:58:00 +0200384 *buf->r = c;
385
386 buf->l++;
387 if (buf->l >= buf->max_len)
388 buf->flags |= BF_FULL;
389
390 buf->r++;
391 if (buf->r - buf->data == buf->size)
392 buf->r -= buf->size;
393
Willy Tarreau31971e52009-09-20 12:07:52 +0200394 if (buf->to_forward >= 1) {
395 if (buf->to_forward != BUF_INFINITE_FORWARD)
396 buf->to_forward--;
Willy Tarreauc77e7612009-09-13 14:58:00 +0200397 buf->send_max++;
Willy Tarreauba0b63d2009-09-20 08:09:44 +0200398 buf->flags &= ~BF_OUT_EMPTY;
Willy Tarreauc77e7612009-09-13 14:58:00 +0200399 }
400
401 buf->total++;
402 return 1;
403}
404
Willy Tarreaubaaee002006-06-26 02:48:02 +0200405int buffer_write(struct buffer *buf, const char *msg, int len);
Willy Tarreauaeac3192009-08-31 08:09:57 +0200406int buffer_feed(struct buffer *buf, const char *str, int len);
Willy Tarreau36a5c532009-09-03 07:13:50 +0200407int buffer_si_putchar(struct buffer *buf, char c);
Willy Tarreau4fe7a2e2009-09-01 06:41:32 +0200408int buffer_si_peekline(struct buffer *buf, char *str, int len);
Willy Tarreau4af6f3a2007-03-18 22:36:26 +0100409int buffer_replace(struct buffer *b, char *pos, char *end, const char *str);
410int buffer_replace2(struct buffer *b, char *pos, char *end, const char *str, int len);
411int buffer_insert_line2(struct buffer *b, char *pos, const char *str, int len);
Willy Tarreau40d25162009-04-03 12:01:47 +0200412int chunk_printf(struct chunk *chk, int size, const char *fmt, ...)
413 __attribute__ ((format(printf, 3, 4)));
Willy Tarreau8d5d7f22007-01-21 19:16:41 +0100414void buffer_dump(FILE *o, struct buffer *b, int from, int to);
Willy Tarreaubaaee002006-06-26 02:48:02 +0200415
Willy Tarreauaeac3192009-08-31 08:09:57 +0200416
417/* writes the chunk <chunk> to buffer <buf>. Returns -1 in case of success,
418 * -2 if it is larger than the buffer size, or the number of bytes available
419 * otherwise. If the chunk has been written, its size is automatically reset
420 * to zero. The send limit is automatically adjusted with the amount of data
421 * written.
422 */
423static inline int buffer_write_chunk(struct buffer *buf, struct chunk *chunk)
424{
425 int ret;
426
427 ret = buffer_write(buf, chunk->str, chunk->len);
428 if (ret == -1)
429 chunk->len = 0;
430 return ret;
431}
432
433/* Try to write chunk <chunk> into buffer <buf> after length controls. This is
434 * the equivalent of buffer_write_chunk() except that to_forward and send_max
435 * are updated and that max_len is respected. Returns -1 in case of success,
436 * -2 if it is larger than the buffer size, or the number of bytes available
437 * otherwise. If the chunk has been written, its size is automatically reset
438 * to zero. The send limit is automatically adjusted with the amount of data
439 * written.
440 */
441static inline int buffer_feed_chunk(struct buffer *buf, struct chunk *chunk)
442{
443 int ret;
444
445 ret = buffer_feed(buf, chunk->str, chunk->len);
446 if (ret == -1)
447 chunk->len = 0;
448 return ret;
449}
450
Willy Tarreau0f772532006-12-23 20:51:41 +0100451/*
452 * frees the destination chunk if already allocated, allocates a new string,
453 * and copies the source into it. The pointer to the destination string is
454 * returned, or NULL if the allocation fails or if any pointer is NULL..
455 */
456static inline char *chunk_dup(struct chunk *dst, const struct chunk *src) {
457 if (!dst || !src || !src->str)
458 return NULL;
459 if (dst->str)
460 free(dst->str);
461 dst->len = src->len;
462 dst->str = (char *)malloc(dst->len);
463 memcpy(dst->str, src->str, dst->len);
464 return dst->str;
465}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200466
467#endif /* _PROTO_BUFFERS_H */
468
469/*
470 * Local variables:
471 * c-indent-level: 8
472 * c-basic-offset: 8
473 * End:
474 */