blob: c25e8f648538595aa4eb39efc58d51a881555234 [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 Tarreaue09e0ce2007-03-18 16:31:29 +01005 Copyright (C) 2000-2007 Willy Tarreau - w@1wt.eu
Willy Tarreaubaaee002006-06-26 02:48:02 +02006
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*/
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 Tarreau54469402006-07-29 16:59:06 +020041/* Initializes all fields in the buffer. The ->rlim field is initialized last
42 * so that the compiler can optimize it away if changed immediately after the
43 * call to this function.
44 */
45static inline void buffer_init(struct buffer *buf)
46{
47 buf->l = buf->total = buf->flags = 0;
Willy Tarreaue09e0ce2007-03-18 16:31:29 +010048 buf->rlim = buf->r = buf->lr = buf->w = buf->data;
Willy Tarreau54469402006-07-29 16:59:06 +020049}
50
Willy Tarreaubaaee002006-06-26 02:48:02 +020051/* returns 1 if the buffer is empty, 0 otherwise */
Willy Tarreaub17916e2006-10-15 15:17:57 +020052static inline int buffer_isempty(const struct buffer *buf)
Willy Tarreaubaaee002006-06-26 02:48:02 +020053{
54 return buf->l == 0;
55}
56
57/* returns 1 if the buffer is full, 0 otherwise */
Willy Tarreaub17916e2006-10-15 15:17:57 +020058static inline int buffer_isfull(const struct buffer *buf) {
Willy Tarreaubaaee002006-06-26 02:48:02 +020059 return buf->l == BUFSIZE;
60}
61
62/* flushes any content from buffer <buf> */
63static inline void buffer_flush(struct buffer *buf)
64{
Willy Tarreaue09e0ce2007-03-18 16:31:29 +010065 buf->r = buf->lr = buf->w = buf->data;
Willy Tarreaubaaee002006-06-26 02:48:02 +020066 buf->l = 0;
67}
68
Willy Tarreaufa645582007-06-03 15:59:52 +020069/* marks the buffer as "shutdown pending" for reads and cancels the timeout */
70static inline void buffer_shutr(struct buffer *buf)
71{
Willy Tarreau0c303ee2008-07-07 00:09:58 +020072 buf->rex = TICK_ETERNITY;
Willy Tarreaufa645582007-06-03 15:59:52 +020073 buf->flags |= BF_SHUTR_PENDING;
74}
75
76/* marks the buffer as "shutdown pending" for writes and cancels the timeout */
77static inline void buffer_shutw(struct buffer *buf)
78{
Willy Tarreau0c303ee2008-07-07 00:09:58 +020079 buf->wex = TICK_ETERNITY;
Willy Tarreaufa645582007-06-03 15:59:52 +020080 buf->flags |= BF_SHUTW_PENDING;
81}
82
Willy Tarreaubaaee002006-06-26 02:48:02 +020083
84/* returns the maximum number of bytes writable at once in this buffer */
Willy Tarreaub17916e2006-10-15 15:17:57 +020085static inline int buffer_max(const struct buffer *buf)
Willy Tarreaubaaee002006-06-26 02:48:02 +020086{
87 if (buf->l == BUFSIZE)
88 return 0;
89 else if (buf->r >= buf->w)
90 return buf->data + BUFSIZE - buf->r;
91 else
92 return buf->w - buf->r;
93}
94
95
96/*
97 * Tries to realign the given buffer, and returns how many bytes can be written
98 * there at once without overwriting anything.
99 */
100static inline int buffer_realign(struct buffer *buf)
101{
102 if (buf->l == 0) {
103 /* let's realign the buffer to optimize I/O */
Willy Tarreaue09e0ce2007-03-18 16:31:29 +0100104 buf->r = buf->w = buf->lr = buf->data;
Willy Tarreaubaaee002006-06-26 02:48:02 +0200105 }
106 return buffer_max(buf);
107}
108
109
110int buffer_write(struct buffer *buf, const char *msg, int len);
Willy Tarreauc0dde7a2007-01-01 21:38:07 +0100111int buffer_write_chunk(struct buffer *buf, struct chunk *chunk);
Willy Tarreau4af6f3a2007-03-18 22:36:26 +0100112int buffer_replace(struct buffer *b, char *pos, char *end, const char *str);
113int buffer_replace2(struct buffer *b, char *pos, char *end, const char *str, int len);
114int buffer_insert_line2(struct buffer *b, char *pos, const char *str, int len);
Willy Tarreauc0dde7a2007-01-01 21:38:07 +0100115int chunk_printf(struct chunk *chk, int size, const char *fmt, ...);
Willy Tarreau8d5d7f22007-01-21 19:16:41 +0100116void buffer_dump(FILE *o, struct buffer *b, int from, int to);
Willy Tarreaubaaee002006-06-26 02:48:02 +0200117
Willy Tarreau0f772532006-12-23 20:51:41 +0100118/*
119 * frees the destination chunk if already allocated, allocates a new string,
120 * and copies the source into it. The pointer to the destination string is
121 * returned, or NULL if the allocation fails or if any pointer is NULL..
122 */
123static inline char *chunk_dup(struct chunk *dst, const struct chunk *src) {
124 if (!dst || !src || !src->str)
125 return NULL;
126 if (dst->str)
127 free(dst->str);
128 dst->len = src->len;
129 dst->str = (char *)malloc(dst->len);
130 memcpy(dst->str, src->str, dst->len);
131 return dst->str;
132}
Willy Tarreaubaaee002006-06-26 02:48:02 +0200133
134#endif /* _PROTO_BUFFERS_H */
135
136/*
137 * Local variables:
138 * c-indent-level: 8
139 * c-basic-offset: 8
140 * End:
141 */