xref: /minix3/external/bsd/libevent/dist/include/event2/buffer.h (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /*	$NetBSD: buffer.h,v 1.1.1.2 2015/01/29 06:38:28 spz Exp $	*/
2*0a6a1f1dSLionel Sambuc /*	$NetBSD: buffer.h,v 1.1.1.2 2015/01/29 06:38:28 spz Exp $	*/
3e985b929SDavid van Moolenbroek /*
4e985b929SDavid van Moolenbroek  * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
5e985b929SDavid van Moolenbroek  *
6e985b929SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
7e985b929SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
8e985b929SDavid van Moolenbroek  * are met:
9e985b929SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
10e985b929SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
11e985b929SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
12e985b929SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
13e985b929SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
14e985b929SDavid van Moolenbroek  * 3. The name of the author may not be used to endorse or promote products
15e985b929SDavid van Moolenbroek  *    derived from this software without specific prior written permission.
16e985b929SDavid van Moolenbroek  *
17e985b929SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18e985b929SDavid van Moolenbroek  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19e985b929SDavid van Moolenbroek  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20e985b929SDavid van Moolenbroek  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21e985b929SDavid van Moolenbroek  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22e985b929SDavid van Moolenbroek  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23e985b929SDavid van Moolenbroek  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24e985b929SDavid van Moolenbroek  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25e985b929SDavid van Moolenbroek  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26e985b929SDavid van Moolenbroek  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27e985b929SDavid van Moolenbroek  */
28e985b929SDavid van Moolenbroek #ifndef _EVENT2_BUFFER_H_
29e985b929SDavid van Moolenbroek #define _EVENT2_BUFFER_H_
30e985b929SDavid van Moolenbroek 
31e985b929SDavid van Moolenbroek /** @file event2/buffer.h
32e985b929SDavid van Moolenbroek 
33e985b929SDavid van Moolenbroek   Functions for buffering data for network sending or receiving.
34e985b929SDavid van Moolenbroek 
35e985b929SDavid van Moolenbroek   An evbuffer can be used for preparing data before sending it to
36e985b929SDavid van Moolenbroek   the network or conversely for reading data from the network.
37e985b929SDavid van Moolenbroek   Evbuffers try to avoid memory copies as much as possible.  As a
38e985b929SDavid van Moolenbroek   result, evbuffers can be used to pass data around without actually
39e985b929SDavid van Moolenbroek   incurring the overhead of copying the data.
40e985b929SDavid van Moolenbroek 
41e985b929SDavid van Moolenbroek   A new evbuffer can be allocated with evbuffer_new(), and can be
42e985b929SDavid van Moolenbroek   freed with evbuffer_free().  Most users will be using evbuffers via
43e985b929SDavid van Moolenbroek   the bufferevent interface.  To access a bufferevent's evbuffers, use
44e985b929SDavid van Moolenbroek   bufferevent_get_input() and bufferevent_get_output().
45e985b929SDavid van Moolenbroek 
46e985b929SDavid van Moolenbroek   There are several guidelines for using evbuffers.
47e985b929SDavid van Moolenbroek 
48e985b929SDavid van Moolenbroek   - if you already know how much data you are going to add as a result
49e985b929SDavid van Moolenbroek     of calling evbuffer_add() multiple times, it makes sense to use
50e985b929SDavid van Moolenbroek     evbuffer_expand() first to make sure that enough memory is allocated
51e985b929SDavid van Moolenbroek     before hand.
52e985b929SDavid van Moolenbroek 
53e985b929SDavid van Moolenbroek   - evbuffer_add_buffer() adds the contents of one buffer to the other
54e985b929SDavid van Moolenbroek     without incurring any unnecessary memory copies.
55e985b929SDavid van Moolenbroek 
56e985b929SDavid van Moolenbroek   - evbuffer_add() and evbuffer_add_buffer() do not mix very well:
57e985b929SDavid van Moolenbroek     if you use them, you will wind up with fragmented memory in your
58e985b929SDavid van Moolenbroek 	buffer.
59e985b929SDavid van Moolenbroek 
60e985b929SDavid van Moolenbroek   - For high-performance code, you may want to avoid copying data into and out
61e985b929SDavid van Moolenbroek     of buffers.  You can skip the copy step by using
62e985b929SDavid van Moolenbroek     evbuffer_reserve_space()/evbuffer_commit_space() when writing into a
63e985b929SDavid van Moolenbroek     buffer, and evbuffer_peek() when reading.
64e985b929SDavid van Moolenbroek 
65e985b929SDavid van Moolenbroek   In Libevent 2.0 and later, evbuffers are represented using a linked
66e985b929SDavid van Moolenbroek   list of memory chunks, with pointers to the first and last chunk in
67e985b929SDavid van Moolenbroek   the chain.
68e985b929SDavid van Moolenbroek 
69e985b929SDavid van Moolenbroek   As the contents of an evbuffer can be stored in multiple different
70e985b929SDavid van Moolenbroek   memory blocks, it cannot be accessed directly.  Instead, evbuffer_pullup()
71e985b929SDavid van Moolenbroek   can be used to force a specified number of bytes to be contiguous. This
72e985b929SDavid van Moolenbroek   will cause memory reallocation and memory copies if the data is split
73e985b929SDavid van Moolenbroek   across multiple blocks.  It is more efficient, however, to use
74e985b929SDavid van Moolenbroek   evbuffer_peek() if you don't require that the memory to be contiguous.
75e985b929SDavid van Moolenbroek  */
76e985b929SDavid van Moolenbroek 
77e985b929SDavid van Moolenbroek #ifdef __cplusplus
78e985b929SDavid van Moolenbroek extern "C" {
79e985b929SDavid van Moolenbroek #endif
80e985b929SDavid van Moolenbroek 
81e985b929SDavid van Moolenbroek #include <event2/event-config.h>
82e985b929SDavid van Moolenbroek #include <stdarg.h>
83e985b929SDavid van Moolenbroek #ifdef _EVENT_HAVE_SYS_TYPES_H
84e985b929SDavid van Moolenbroek #include <sys/types.h>
85e985b929SDavid van Moolenbroek #endif
86e985b929SDavid van Moolenbroek #ifdef _EVENT_HAVE_SYS_UIO_H
87e985b929SDavid van Moolenbroek #include <sys/uio.h>
88e985b929SDavid van Moolenbroek #endif
89e985b929SDavid van Moolenbroek #include <event2/util.h>
90e985b929SDavid van Moolenbroek 
91e985b929SDavid van Moolenbroek /**
92e985b929SDavid van Moolenbroek    An evbuffer is an opaque data type for efficiently buffering data to be
93e985b929SDavid van Moolenbroek    sent or received on the network.
94e985b929SDavid van Moolenbroek 
95e985b929SDavid van Moolenbroek    @see event2/event.h for more information
96e985b929SDavid van Moolenbroek */
97e985b929SDavid van Moolenbroek struct evbuffer
98e985b929SDavid van Moolenbroek #ifdef _EVENT_IN_DOXYGEN
99e985b929SDavid van Moolenbroek {}
100e985b929SDavid van Moolenbroek #endif
101e985b929SDavid van Moolenbroek ;
102e985b929SDavid van Moolenbroek 
103e985b929SDavid van Moolenbroek /**
104e985b929SDavid van Moolenbroek     Pointer to a position within an evbuffer.
105e985b929SDavid van Moolenbroek 
106e985b929SDavid van Moolenbroek     Used when repeatedly searching through a buffer.  Calling any function
107e985b929SDavid van Moolenbroek     that modifies or re-packs the buffer contents may invalidate all
108e985b929SDavid van Moolenbroek     evbuffer_ptrs for that buffer.  Do not modify these values except with
109e985b929SDavid van Moolenbroek     evbuffer_ptr_set.
110e985b929SDavid van Moolenbroek  */
111e985b929SDavid van Moolenbroek struct evbuffer_ptr {
112e985b929SDavid van Moolenbroek 	ev_ssize_t pos;
113e985b929SDavid van Moolenbroek 
114e985b929SDavid van Moolenbroek 	/* Do not alter the values of fields. */
115e985b929SDavid van Moolenbroek 	struct {
116e985b929SDavid van Moolenbroek 		void *chain;
117e985b929SDavid van Moolenbroek 		size_t pos_in_chain;
118e985b929SDavid van Moolenbroek 	} _internal;
119e985b929SDavid van Moolenbroek };
120e985b929SDavid van Moolenbroek 
121e985b929SDavid van Moolenbroek /** Describes a single extent of memory inside an evbuffer.  Used for
122e985b929SDavid van Moolenbroek     direct-access functions.
123e985b929SDavid van Moolenbroek 
124e985b929SDavid van Moolenbroek     @see evbuffer_reserve_space, evbuffer_commit_space, evbuffer_peek
125e985b929SDavid van Moolenbroek  */
126e985b929SDavid van Moolenbroek #ifdef _EVENT_HAVE_SYS_UIO_H
127e985b929SDavid van Moolenbroek #define evbuffer_iovec iovec
128e985b929SDavid van Moolenbroek /* Internal use -- defined only if we are using the native struct iovec */
129e985b929SDavid van Moolenbroek #define _EVBUFFER_IOVEC_IS_NATIVE
130e985b929SDavid van Moolenbroek #else
131e985b929SDavid van Moolenbroek struct evbuffer_iovec {
132e985b929SDavid van Moolenbroek 	/** The start of the extent of memory. */
133e985b929SDavid van Moolenbroek 	void *iov_base;
134e985b929SDavid van Moolenbroek 	/** The length of the extent of memory. */
135e985b929SDavid van Moolenbroek 	size_t iov_len;
136e985b929SDavid van Moolenbroek };
137e985b929SDavid van Moolenbroek #endif
138e985b929SDavid van Moolenbroek 
139e985b929SDavid van Moolenbroek /**
140e985b929SDavid van Moolenbroek   Allocate storage for a new evbuffer.
141e985b929SDavid van Moolenbroek 
142e985b929SDavid van Moolenbroek   @return a pointer to a newly allocated evbuffer struct, or NULL if an error
143e985b929SDavid van Moolenbroek 	occurred
144e985b929SDavid van Moolenbroek  */
145e985b929SDavid van Moolenbroek struct evbuffer *evbuffer_new(void);
146e985b929SDavid van Moolenbroek /**
147e985b929SDavid van Moolenbroek   Deallocate storage for an evbuffer.
148e985b929SDavid van Moolenbroek 
149e985b929SDavid van Moolenbroek   @param buf pointer to the evbuffer to be freed
150e985b929SDavid van Moolenbroek  */
151e985b929SDavid van Moolenbroek void evbuffer_free(struct evbuffer *buf);
152e985b929SDavid van Moolenbroek 
153e985b929SDavid van Moolenbroek /**
154e985b929SDavid van Moolenbroek    Enable locking on an evbuffer so that it can safely be used by multiple
155e985b929SDavid van Moolenbroek    threads at the same time.
156e985b929SDavid van Moolenbroek 
157e985b929SDavid van Moolenbroek    NOTE: when locking is enabled, the lock will be held when callbacks are
158e985b929SDavid van Moolenbroek    invoked.  This could result in deadlock if you aren't careful.  Plan
159e985b929SDavid van Moolenbroek    accordingly!
160e985b929SDavid van Moolenbroek 
161e985b929SDavid van Moolenbroek    @param buf An evbuffer to make lockable.
162e985b929SDavid van Moolenbroek    @param lock A lock object, or NULL if we should allocate our own.
163e985b929SDavid van Moolenbroek    @return 0 on success, -1 on failure.
164e985b929SDavid van Moolenbroek  */
165e985b929SDavid van Moolenbroek int evbuffer_enable_locking(struct evbuffer *buf, void *lock);
166e985b929SDavid van Moolenbroek 
167e985b929SDavid van Moolenbroek /**
168e985b929SDavid van Moolenbroek    Acquire the lock on an evbuffer.  Has no effect if locking was not enabled
169e985b929SDavid van Moolenbroek    with evbuffer_enable_locking.
170e985b929SDavid van Moolenbroek */
171e985b929SDavid van Moolenbroek void evbuffer_lock(struct evbuffer *buf);
172e985b929SDavid van Moolenbroek 
173e985b929SDavid van Moolenbroek /**
174e985b929SDavid van Moolenbroek    Release the lock on an evbuffer.  Has no effect if locking was not enabled
175e985b929SDavid van Moolenbroek    with evbuffer_enable_locking.
176e985b929SDavid van Moolenbroek */
177e985b929SDavid van Moolenbroek void evbuffer_unlock(struct evbuffer *buf);
178e985b929SDavid van Moolenbroek 
179e985b929SDavid van Moolenbroek 
180e985b929SDavid van Moolenbroek /** If this flag is set, then we will not use evbuffer_peek(),
181e985b929SDavid van Moolenbroek  * evbuffer_remove(), evbuffer_remove_buffer(), and so on to read bytes
182e985b929SDavid van Moolenbroek  * from this buffer: we'll only take bytes out of this buffer by
183e985b929SDavid van Moolenbroek  * writing them to the network (as with evbuffer_write_atmost), by
184e985b929SDavid van Moolenbroek  * removing them without observing them (as with evbuffer_drain),
185e985b929SDavid van Moolenbroek  * or by copying them all out at once (as with evbuffer_add_buffer).
186e985b929SDavid van Moolenbroek  *
187e985b929SDavid van Moolenbroek  * Using this option allows the implementation to use sendfile-based
188e985b929SDavid van Moolenbroek  * operations for evbuffer_add_file(); see that function for more
189e985b929SDavid van Moolenbroek  * information.
190e985b929SDavid van Moolenbroek  *
191e985b929SDavid van Moolenbroek  * This flag is on by default for bufferevents that can take advantage
192e985b929SDavid van Moolenbroek  * of it; you should never actually need to set it on a bufferevent's
193e985b929SDavid van Moolenbroek  * output buffer.
194e985b929SDavid van Moolenbroek  */
195e985b929SDavid van Moolenbroek #define EVBUFFER_FLAG_DRAINS_TO_FD 1
196e985b929SDavid van Moolenbroek 
197e985b929SDavid van Moolenbroek /** Change the flags that are set for an evbuffer by adding more.
198e985b929SDavid van Moolenbroek  *
199e985b929SDavid van Moolenbroek  * @param buffer the evbuffer that the callback is watching.
200e985b929SDavid van Moolenbroek  * @param cb the callback whose status we want to change.
201e985b929SDavid van Moolenbroek  * @param flags One or more EVBUFFER_FLAG_* options
202e985b929SDavid van Moolenbroek  * @return 0 on success, -1 on failure.
203e985b929SDavid van Moolenbroek  */
204e985b929SDavid van Moolenbroek int evbuffer_set_flags(struct evbuffer *buf, ev_uint64_t flags);
205e985b929SDavid van Moolenbroek /** Change the flags that are set for an evbuffer by removing some.
206e985b929SDavid van Moolenbroek  *
207e985b929SDavid van Moolenbroek  * @param buffer the evbuffer that the callback is watching.
208e985b929SDavid van Moolenbroek  * @param cb the callback whose status we want to change.
209e985b929SDavid van Moolenbroek  * @param flags One or more EVBUFFER_FLAG_* options
210e985b929SDavid van Moolenbroek  * @return 0 on success, -1 on failure.
211e985b929SDavid van Moolenbroek  */
212e985b929SDavid van Moolenbroek int evbuffer_clear_flags(struct evbuffer *buf, ev_uint64_t flags);
213e985b929SDavid van Moolenbroek 
214e985b929SDavid van Moolenbroek /**
215e985b929SDavid van Moolenbroek   Returns the total number of bytes stored in the evbuffer
216e985b929SDavid van Moolenbroek 
217e985b929SDavid van Moolenbroek   @param buf pointer to the evbuffer
218e985b929SDavid van Moolenbroek   @return the number of bytes stored in the evbuffer
219e985b929SDavid van Moolenbroek */
220e985b929SDavid van Moolenbroek size_t evbuffer_get_length(const struct evbuffer *buf);
221e985b929SDavid van Moolenbroek 
222e985b929SDavid van Moolenbroek /**
223e985b929SDavid van Moolenbroek    Returns the number of contiguous available bytes in the first buffer chain.
224e985b929SDavid van Moolenbroek 
225e985b929SDavid van Moolenbroek    This is useful when processing data that might be split into multiple
226e985b929SDavid van Moolenbroek    chains, or that might all be in the first chain.  Calls to
227e985b929SDavid van Moolenbroek    evbuffer_pullup() that cause reallocation and copying of data can thus be
228e985b929SDavid van Moolenbroek    avoided.
229e985b929SDavid van Moolenbroek 
230e985b929SDavid van Moolenbroek    @param buf pointer to the evbuffer
231e985b929SDavid van Moolenbroek    @return 0 if no data is available, otherwise the number of available bytes
232e985b929SDavid van Moolenbroek      in the first buffer chain.
233e985b929SDavid van Moolenbroek */
234e985b929SDavid van Moolenbroek size_t evbuffer_get_contiguous_space(const struct evbuffer *buf);
235e985b929SDavid van Moolenbroek 
236e985b929SDavid van Moolenbroek /**
237e985b929SDavid van Moolenbroek   Expands the available space in an evbuffer.
238e985b929SDavid van Moolenbroek 
239e985b929SDavid van Moolenbroek   Expands the available space in the evbuffer to at least datlen, so that
240e985b929SDavid van Moolenbroek   appending datlen additional bytes will not require any new allocations.
241e985b929SDavid van Moolenbroek 
242e985b929SDavid van Moolenbroek   @param buf the evbuffer to be expanded
243e985b929SDavid van Moolenbroek   @param datlen the new minimum length requirement
244e985b929SDavid van Moolenbroek   @return 0 if successful, or -1 if an error occurred
245e985b929SDavid van Moolenbroek */
246e985b929SDavid van Moolenbroek int evbuffer_expand(struct evbuffer *buf, size_t datlen);
247e985b929SDavid van Moolenbroek 
248e985b929SDavid van Moolenbroek /**
249e985b929SDavid van Moolenbroek    Reserves space in the last chain or chains of an evbuffer.
250e985b929SDavid van Moolenbroek 
251e985b929SDavid van Moolenbroek    Makes space available in the last chain or chains of an evbuffer that can
252e985b929SDavid van Moolenbroek    be arbitrarily written to by a user.  The space does not become
253e985b929SDavid van Moolenbroek    available for reading until it has been committed with
254e985b929SDavid van Moolenbroek    evbuffer_commit_space().
255e985b929SDavid van Moolenbroek 
256e985b929SDavid van Moolenbroek    The space is made available as one or more extents, represented by
257e985b929SDavid van Moolenbroek    an initial pointer and a length.  You can force the memory to be
258e985b929SDavid van Moolenbroek    available as only one extent.  Allowing more extents, however, makes the
259e985b929SDavid van Moolenbroek    function more efficient.
260e985b929SDavid van Moolenbroek 
261e985b929SDavid van Moolenbroek    Multiple subsequent calls to this function will make the same space
262e985b929SDavid van Moolenbroek    available until evbuffer_commit_space() has been called.
263e985b929SDavid van Moolenbroek 
264e985b929SDavid van Moolenbroek    It is an error to do anything that moves around the buffer's internal
265e985b929SDavid van Moolenbroek    memory structures before committing the space.
266e985b929SDavid van Moolenbroek 
267e985b929SDavid van Moolenbroek    NOTE: The code currently does not ever use more than two extents.
268e985b929SDavid van Moolenbroek    This may change in future versions.
269e985b929SDavid van Moolenbroek 
270e985b929SDavid van Moolenbroek    @param buf the evbuffer in which to reserve space.
271e985b929SDavid van Moolenbroek    @param size how much space to make available, at minimum.  The
272e985b929SDavid van Moolenbroek       total length of the extents may be greater than the requested
273e985b929SDavid van Moolenbroek       length.
274e985b929SDavid van Moolenbroek    @param vec an array of one or more evbuffer_iovec structures to
275e985b929SDavid van Moolenbroek       hold pointers to the reserved extents of memory.
276e985b929SDavid van Moolenbroek    @param n_vec The length of the vec array.  Must be at least 1;
277e985b929SDavid van Moolenbroek        2 is more efficient.
278e985b929SDavid van Moolenbroek    @return the number of provided extents, or -1 on error.
279e985b929SDavid van Moolenbroek    @see evbuffer_commit_space()
280e985b929SDavid van Moolenbroek */
281e985b929SDavid van Moolenbroek int
282e985b929SDavid van Moolenbroek evbuffer_reserve_space(struct evbuffer *buf, ev_ssize_t size,
283e985b929SDavid van Moolenbroek     struct evbuffer_iovec *vec, int n_vec);
284e985b929SDavid van Moolenbroek 
285e985b929SDavid van Moolenbroek /**
286e985b929SDavid van Moolenbroek    Commits previously reserved space.
287e985b929SDavid van Moolenbroek 
288e985b929SDavid van Moolenbroek    Commits some of the space previously reserved with
289e985b929SDavid van Moolenbroek    evbuffer_reserve_space().  It then becomes available for reading.
290e985b929SDavid van Moolenbroek 
291e985b929SDavid van Moolenbroek    This function may return an error if the pointer in the extents do
292e985b929SDavid van Moolenbroek    not match those returned from evbuffer_reserve_space, or if data
293e985b929SDavid van Moolenbroek    has been added to the buffer since the space was reserved.
294e985b929SDavid van Moolenbroek 
295e985b929SDavid van Moolenbroek    If you want to commit less data than you got reserved space for,
296e985b929SDavid van Moolenbroek    modify the iov_len pointer of the appropriate extent to a smaller
297e985b929SDavid van Moolenbroek    value.  Note that you may have received more space than you
298e985b929SDavid van Moolenbroek    requested if it was available!
299e985b929SDavid van Moolenbroek 
300e985b929SDavid van Moolenbroek    @param buf the evbuffer in which to reserve space.
301e985b929SDavid van Moolenbroek    @param vec one or two extents returned by evbuffer_reserve_space.
302e985b929SDavid van Moolenbroek    @param n_vecs the number of extents.
303e985b929SDavid van Moolenbroek    @return 0 on success, -1 on error
304e985b929SDavid van Moolenbroek    @see evbuffer_reserve_space()
305e985b929SDavid van Moolenbroek */
306e985b929SDavid van Moolenbroek int evbuffer_commit_space(struct evbuffer *buf,
307e985b929SDavid van Moolenbroek     struct evbuffer_iovec *vec, int n_vecs);
308e985b929SDavid van Moolenbroek 
309e985b929SDavid van Moolenbroek /**
310e985b929SDavid van Moolenbroek   Append data to the end of an evbuffer.
311e985b929SDavid van Moolenbroek 
312e985b929SDavid van Moolenbroek   @param buf the evbuffer to be appended to
313e985b929SDavid van Moolenbroek   @param data pointer to the beginning of the data buffer
314e985b929SDavid van Moolenbroek   @param datlen the number of bytes to be copied from the data buffer
315e985b929SDavid van Moolenbroek   @return 0 on success, -1 on failure.
316e985b929SDavid van Moolenbroek  */
317e985b929SDavid van Moolenbroek int evbuffer_add(struct evbuffer *buf, const void *data, size_t datlen);
318e985b929SDavid van Moolenbroek 
319e985b929SDavid van Moolenbroek 
320e985b929SDavid van Moolenbroek /**
321e985b929SDavid van Moolenbroek   Read data from an evbuffer and drain the bytes read.
322e985b929SDavid van Moolenbroek 
323e985b929SDavid van Moolenbroek   If more bytes are requested than are available in the evbuffer, we
324e985b929SDavid van Moolenbroek   only extract as many bytes as were available.
325e985b929SDavid van Moolenbroek 
326e985b929SDavid van Moolenbroek   @param buf the evbuffer to be read from
327e985b929SDavid van Moolenbroek   @param data the destination buffer to store the result
328e985b929SDavid van Moolenbroek   @param datlen the maximum size of the destination buffer
329e985b929SDavid van Moolenbroek   @return the number of bytes read, or -1 if we can't drain the buffer.
330e985b929SDavid van Moolenbroek  */
331e985b929SDavid van Moolenbroek int evbuffer_remove(struct evbuffer *buf, void *data, size_t datlen);
332e985b929SDavid van Moolenbroek 
333e985b929SDavid van Moolenbroek /**
334e985b929SDavid van Moolenbroek   Read data from an evbuffer, and leave the buffer unchanged.
335e985b929SDavid van Moolenbroek 
336e985b929SDavid van Moolenbroek   If more bytes are requested than are available in the evbuffer, we
337e985b929SDavid van Moolenbroek   only extract as many bytes as were available.
338e985b929SDavid van Moolenbroek 
339e985b929SDavid van Moolenbroek   @param buf the evbuffer to be read from
340e985b929SDavid van Moolenbroek   @param data_out the destination buffer to store the result
341e985b929SDavid van Moolenbroek   @param datlen the maximum size of the destination buffer
342e985b929SDavid van Moolenbroek   @return the number of bytes read, or -1 if we can't drain the buffer.
343e985b929SDavid van Moolenbroek  */
344e985b929SDavid van Moolenbroek ev_ssize_t evbuffer_copyout(struct evbuffer *buf, void *data_out, size_t datlen);
345e985b929SDavid van Moolenbroek 
346e985b929SDavid van Moolenbroek /**
347e985b929SDavid van Moolenbroek   Read data from an evbuffer into another evbuffer, draining
348e985b929SDavid van Moolenbroek   the bytes from the source buffer.  This function avoids copy
349e985b929SDavid van Moolenbroek   operations to the extent possible.
350e985b929SDavid van Moolenbroek 
351e985b929SDavid van Moolenbroek   If more bytes are requested than are available in src, the src
352e985b929SDavid van Moolenbroek   buffer is drained completely.
353e985b929SDavid van Moolenbroek 
354e985b929SDavid van Moolenbroek   @param src the evbuffer to be read from
355e985b929SDavid van Moolenbroek   @param dst the destination evbuffer to store the result into
356e985b929SDavid van Moolenbroek   @param datlen the maximum numbers of bytes to transfer
357e985b929SDavid van Moolenbroek   @return the number of bytes read
358e985b929SDavid van Moolenbroek  */
359e985b929SDavid van Moolenbroek int evbuffer_remove_buffer(struct evbuffer *src, struct evbuffer *dst,
360e985b929SDavid van Moolenbroek     size_t datlen);
361e985b929SDavid van Moolenbroek 
362e985b929SDavid van Moolenbroek /** Used to tell evbuffer_readln what kind of line-ending to look for.
363e985b929SDavid van Moolenbroek  */
364e985b929SDavid van Moolenbroek enum evbuffer_eol_style {
365e985b929SDavid van Moolenbroek 	/** Any sequence of CR and LF characters is acceptable as an
366e985b929SDavid van Moolenbroek 	 * EOL.
367e985b929SDavid van Moolenbroek 	 *
368e985b929SDavid van Moolenbroek 	 * Note that this style can produce ambiguous results: the
369e985b929SDavid van Moolenbroek 	 * sequence "CRLF" will be treated as a single EOL if it is
370e985b929SDavid van Moolenbroek 	 * all in the buffer at once, but if you first read a CR from
371e985b929SDavid van Moolenbroek 	 * the network and later read an LF from the network, it will
372e985b929SDavid van Moolenbroek 	 * be treated as two EOLs.
373e985b929SDavid van Moolenbroek 	 */
374e985b929SDavid van Moolenbroek 	EVBUFFER_EOL_ANY,
375e985b929SDavid van Moolenbroek 	/** An EOL is an LF, optionally preceded by a CR.  This style is
376e985b929SDavid van Moolenbroek 	 * most useful for implementing text-based internet protocols. */
377e985b929SDavid van Moolenbroek 	EVBUFFER_EOL_CRLF,
378e985b929SDavid van Moolenbroek 	/** An EOL is a CR followed by an LF. */
379e985b929SDavid van Moolenbroek 	EVBUFFER_EOL_CRLF_STRICT,
380e985b929SDavid van Moolenbroek 	/** An EOL is a LF. */
381e985b929SDavid van Moolenbroek 	EVBUFFER_EOL_LF
382e985b929SDavid van Moolenbroek };
383e985b929SDavid van Moolenbroek 
384e985b929SDavid van Moolenbroek /**
385e985b929SDavid van Moolenbroek  * Read a single line from an evbuffer.
386e985b929SDavid van Moolenbroek  *
387e985b929SDavid van Moolenbroek  * Reads a line terminated by an EOL as determined by the evbuffer_eol_style
388e985b929SDavid van Moolenbroek  * argument.  Returns a newly allocated nul-terminated string; the caller must
389e985b929SDavid van Moolenbroek  * free the returned value.  The EOL is not included in the returned string.
390e985b929SDavid van Moolenbroek  *
391e985b929SDavid van Moolenbroek  * @param buffer the evbuffer to read from
392e985b929SDavid van Moolenbroek  * @param n_read_out if non-NULL, points to a size_t that is set to the
393e985b929SDavid van Moolenbroek  *       number of characters in the returned string.  This is useful for
394e985b929SDavid van Moolenbroek  *       strings that can contain NUL characters.
395e985b929SDavid van Moolenbroek  * @param eol_style the style of line-ending to use.
396e985b929SDavid van Moolenbroek  * @return pointer to a single line, or NULL if an error occurred
397e985b929SDavid van Moolenbroek  */
398e985b929SDavid van Moolenbroek char *evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out,
399e985b929SDavid van Moolenbroek     enum evbuffer_eol_style eol_style);
400e985b929SDavid van Moolenbroek 
401e985b929SDavid van Moolenbroek /**
402e985b929SDavid van Moolenbroek   Move all data from one evbuffer into another evbuffer.
403e985b929SDavid van Moolenbroek 
404e985b929SDavid van Moolenbroek   This is a destructive add.  The data from one buffer moves into
405e985b929SDavid van Moolenbroek   the other buffer.  However, no unnecessary memory copies occur.
406e985b929SDavid van Moolenbroek 
407e985b929SDavid van Moolenbroek   @param outbuf the output buffer
408e985b929SDavid van Moolenbroek   @param inbuf the input buffer
409e985b929SDavid van Moolenbroek   @return 0 if successful, or -1 if an error occurred
410e985b929SDavid van Moolenbroek 
411e985b929SDavid van Moolenbroek   @see evbuffer_remove_buffer()
412e985b929SDavid van Moolenbroek  */
413e985b929SDavid van Moolenbroek int evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf);
414e985b929SDavid van Moolenbroek 
415e985b929SDavid van Moolenbroek /**
416e985b929SDavid van Moolenbroek    A cleanup function for a piece of memory added to an evbuffer by
417e985b929SDavid van Moolenbroek    reference.
418e985b929SDavid van Moolenbroek 
419e985b929SDavid van Moolenbroek    @see evbuffer_add_reference()
420e985b929SDavid van Moolenbroek  */
421e985b929SDavid van Moolenbroek typedef void (*evbuffer_ref_cleanup_cb)(const void *data,
422e985b929SDavid van Moolenbroek     size_t datalen, void *extra);
423e985b929SDavid van Moolenbroek 
424e985b929SDavid van Moolenbroek /**
425e985b929SDavid van Moolenbroek   Reference memory into an evbuffer without copying.
426e985b929SDavid van Moolenbroek 
427e985b929SDavid van Moolenbroek   The memory needs to remain valid until all the added data has been
428e985b929SDavid van Moolenbroek   read.  This function keeps just a reference to the memory without
429e985b929SDavid van Moolenbroek   actually incurring the overhead of a copy.
430e985b929SDavid van Moolenbroek 
431e985b929SDavid van Moolenbroek   @param outbuf the output buffer
432e985b929SDavid van Moolenbroek   @param data the memory to reference
433e985b929SDavid van Moolenbroek   @param datlen how memory to reference
434e985b929SDavid van Moolenbroek   @param cleanupfn callback to be invoked when the memory is no longer
435e985b929SDavid van Moolenbroek 	referenced by this evbuffer.
436e985b929SDavid van Moolenbroek   @param cleanupfn_arg optional argument to the cleanup callback
437e985b929SDavid van Moolenbroek   @return 0 if successful, or -1 if an error occurred
438e985b929SDavid van Moolenbroek  */
439e985b929SDavid van Moolenbroek int evbuffer_add_reference(struct evbuffer *outbuf,
440e985b929SDavid van Moolenbroek     const void *data, size_t datlen,
441e985b929SDavid van Moolenbroek     evbuffer_ref_cleanup_cb cleanupfn, void *cleanupfn_arg);
442e985b929SDavid van Moolenbroek 
443e985b929SDavid van Moolenbroek /**
444e985b929SDavid van Moolenbroek   Copy data from a file into the evbuffer for writing to a socket.
445e985b929SDavid van Moolenbroek 
446e985b929SDavid van Moolenbroek   This function avoids unnecessary data copies between userland and
447e985b929SDavid van Moolenbroek   kernel.  If sendfile is available and the EVBUFFER_FLAG_DRAINS_TO_FD
448e985b929SDavid van Moolenbroek   flag is set, it uses those functions.  Otherwise, it tries to use
449e985b929SDavid van Moolenbroek   mmap (or CreateFileMapping on Windows).
450e985b929SDavid van Moolenbroek 
451e985b929SDavid van Moolenbroek   The function owns the resulting file descriptor and will close it
452e985b929SDavid van Moolenbroek   when finished transferring data.
453e985b929SDavid van Moolenbroek 
454e985b929SDavid van Moolenbroek   The results of using evbuffer_remove() or evbuffer_pullup() on
455e985b929SDavid van Moolenbroek   evbuffers whose data was added using this function are undefined.
456e985b929SDavid van Moolenbroek 
457e985b929SDavid van Moolenbroek   @param outbuf the output buffer
458e985b929SDavid van Moolenbroek   @param fd the file descriptor
459e985b929SDavid van Moolenbroek   @param offset the offset from which to read data
460e985b929SDavid van Moolenbroek   @param length how much data to read
461e985b929SDavid van Moolenbroek   @return 0 if successful, or -1 if an error occurred
462e985b929SDavid van Moolenbroek */
463e985b929SDavid van Moolenbroek 
464e985b929SDavid van Moolenbroek int evbuffer_add_file(struct evbuffer *outbuf, int fd, ev_off_t offset,
465e985b929SDavid van Moolenbroek     ev_off_t length);
466e985b929SDavid van Moolenbroek 
467e985b929SDavid van Moolenbroek /**
468e985b929SDavid van Moolenbroek   Append a formatted string to the end of an evbuffer.
469e985b929SDavid van Moolenbroek 
470e985b929SDavid van Moolenbroek   The string is formated as printf.
471e985b929SDavid van Moolenbroek 
472e985b929SDavid van Moolenbroek   @param buf the evbuffer that will be appended to
473e985b929SDavid van Moolenbroek   @param fmt a format string
474e985b929SDavid van Moolenbroek   @param ... arguments that will be passed to printf(3)
475e985b929SDavid van Moolenbroek   @return The number of bytes added if successful, or -1 if an error occurred.
476e985b929SDavid van Moolenbroek 
477e985b929SDavid van Moolenbroek   @see evutil_printf(), evbuffer_add_vprintf()
478e985b929SDavid van Moolenbroek  */
479e985b929SDavid van Moolenbroek int evbuffer_add_printf(struct evbuffer *buf, const char *fmt, ...)
480e985b929SDavid van Moolenbroek #ifdef __GNUC__
481e985b929SDavid van Moolenbroek   __attribute__((format(printf, 2, 3)))
482e985b929SDavid van Moolenbroek #endif
483e985b929SDavid van Moolenbroek ;
484e985b929SDavid van Moolenbroek 
485e985b929SDavid van Moolenbroek /**
486e985b929SDavid van Moolenbroek   Append a va_list formatted string to the end of an evbuffer.
487e985b929SDavid van Moolenbroek 
488e985b929SDavid van Moolenbroek   @param buf the evbuffer that will be appended to
489e985b929SDavid van Moolenbroek   @param fmt a format string
490e985b929SDavid van Moolenbroek   @param ap a varargs va_list argument array that will be passed to vprintf(3)
491e985b929SDavid van Moolenbroek   @return The number of bytes added if successful, or -1 if an error occurred.
492e985b929SDavid van Moolenbroek  */
493e985b929SDavid van Moolenbroek int evbuffer_add_vprintf(struct evbuffer *buf, const char *fmt, va_list ap)
494e985b929SDavid van Moolenbroek #ifdef __GNUC__
495e985b929SDavid van Moolenbroek 	__attribute__((format(printf, 2, 0)))
496e985b929SDavid van Moolenbroek #endif
497e985b929SDavid van Moolenbroek ;
498e985b929SDavid van Moolenbroek 
499e985b929SDavid van Moolenbroek 
500e985b929SDavid van Moolenbroek /**
501e985b929SDavid van Moolenbroek   Remove a specified number of bytes data from the beginning of an evbuffer.
502e985b929SDavid van Moolenbroek 
503e985b929SDavid van Moolenbroek   @param buf the evbuffer to be drained
504e985b929SDavid van Moolenbroek   @param len the number of bytes to drain from the beginning of the buffer
505e985b929SDavid van Moolenbroek   @return 0 on success, -1 on failure.
506e985b929SDavid van Moolenbroek  */
507e985b929SDavid van Moolenbroek int evbuffer_drain(struct evbuffer *buf, size_t len);
508e985b929SDavid van Moolenbroek 
509e985b929SDavid van Moolenbroek 
510e985b929SDavid van Moolenbroek /**
511e985b929SDavid van Moolenbroek   Write the contents of an evbuffer to a file descriptor.
512e985b929SDavid van Moolenbroek 
513e985b929SDavid van Moolenbroek   The evbuffer will be drained after the bytes have been successfully written.
514e985b929SDavid van Moolenbroek 
515e985b929SDavid van Moolenbroek   @param buffer the evbuffer to be written and drained
516e985b929SDavid van Moolenbroek   @param fd the file descriptor to be written to
517e985b929SDavid van Moolenbroek   @return the number of bytes written, or -1 if an error occurred
518e985b929SDavid van Moolenbroek   @see evbuffer_read()
519e985b929SDavid van Moolenbroek  */
520e985b929SDavid van Moolenbroek int evbuffer_write(struct evbuffer *buffer, evutil_socket_t fd);
521e985b929SDavid van Moolenbroek 
522e985b929SDavid van Moolenbroek /**
523e985b929SDavid van Moolenbroek   Write some of the contents of an evbuffer to a file descriptor.
524e985b929SDavid van Moolenbroek 
525e985b929SDavid van Moolenbroek   The evbuffer will be drained after the bytes have been successfully written.
526e985b929SDavid van Moolenbroek 
527e985b929SDavid van Moolenbroek   @param buffer the evbuffer to be written and drained
528e985b929SDavid van Moolenbroek   @param fd the file descriptor to be written to
529e985b929SDavid van Moolenbroek   @param howmuch the largest allowable number of bytes to write, or -1
530e985b929SDavid van Moolenbroek 	to write as many bytes as we can.
531e985b929SDavid van Moolenbroek   @return the number of bytes written, or -1 if an error occurred
532e985b929SDavid van Moolenbroek   @see evbuffer_read()
533e985b929SDavid van Moolenbroek  */
534e985b929SDavid van Moolenbroek int evbuffer_write_atmost(struct evbuffer *buffer, evutil_socket_t fd,
535e985b929SDavid van Moolenbroek 						  ev_ssize_t howmuch);
536e985b929SDavid van Moolenbroek 
537e985b929SDavid van Moolenbroek /**
538e985b929SDavid van Moolenbroek   Read from a file descriptor and store the result in an evbuffer.
539e985b929SDavid van Moolenbroek 
540e985b929SDavid van Moolenbroek   @param buffer the evbuffer to store the result
541e985b929SDavid van Moolenbroek   @param fd the file descriptor to read from
542e985b929SDavid van Moolenbroek   @param howmuch the number of bytes to be read
543e985b929SDavid van Moolenbroek   @return the number of bytes read, or -1 if an error occurred
544e985b929SDavid van Moolenbroek   @see evbuffer_write()
545e985b929SDavid van Moolenbroek  */
546e985b929SDavid van Moolenbroek int evbuffer_read(struct evbuffer *buffer, evutil_socket_t fd, int howmuch);
547e985b929SDavid van Moolenbroek 
548e985b929SDavid van Moolenbroek /**
549e985b929SDavid van Moolenbroek    Search for a string within an evbuffer.
550e985b929SDavid van Moolenbroek 
551e985b929SDavid van Moolenbroek    @param buffer the evbuffer to be searched
552e985b929SDavid van Moolenbroek    @param what the string to be searched for
553e985b929SDavid van Moolenbroek    @param len the length of the search string
554e985b929SDavid van Moolenbroek    @param start NULL or a pointer to a valid struct evbuffer_ptr.
555e985b929SDavid van Moolenbroek    @return a struct evbuffer_ptr whose 'pos' field has the offset of the
556e985b929SDavid van Moolenbroek      first occurrence of the string in the buffer after 'start'.  The 'pos'
557e985b929SDavid van Moolenbroek      field of the result is -1 if the string was not found.
558e985b929SDavid van Moolenbroek  */
559e985b929SDavid van Moolenbroek struct evbuffer_ptr evbuffer_search(struct evbuffer *buffer, const char *what, size_t len, const struct evbuffer_ptr *start);
560e985b929SDavid van Moolenbroek 
561e985b929SDavid van Moolenbroek /**
562e985b929SDavid van Moolenbroek    Search for a string within part of an evbuffer.
563e985b929SDavid van Moolenbroek 
564e985b929SDavid van Moolenbroek    @param buffer the evbuffer to be searched
565e985b929SDavid van Moolenbroek    @param what the string to be searched for
566e985b929SDavid van Moolenbroek    @param len the length of the search string
567e985b929SDavid van Moolenbroek    @param start NULL or a pointer to a valid struct evbuffer_ptr that
568e985b929SDavid van Moolenbroek      indicates where we should start searching.
569e985b929SDavid van Moolenbroek    @param end NULL or a pointer to a valid struct evbuffer_ptr that
570e985b929SDavid van Moolenbroek      indicates where we should stop searching.
571e985b929SDavid van Moolenbroek    @return a struct evbuffer_ptr whose 'pos' field has the offset of the
572e985b929SDavid van Moolenbroek      first occurrence of the string in the buffer after 'start'.  The 'pos'
573e985b929SDavid van Moolenbroek      field of the result is -1 if the string was not found.
574e985b929SDavid van Moolenbroek  */
575e985b929SDavid van Moolenbroek struct evbuffer_ptr evbuffer_search_range(struct evbuffer *buffer, const char *what, size_t len, const struct evbuffer_ptr *start, const struct evbuffer_ptr *end);
576e985b929SDavid van Moolenbroek 
577e985b929SDavid van Moolenbroek /**
578e985b929SDavid van Moolenbroek    Defines how to adjust an evbuffer_ptr by evbuffer_ptr_set()
579e985b929SDavid van Moolenbroek 
580e985b929SDavid van Moolenbroek    @see evbuffer_ptr_set() */
581e985b929SDavid van Moolenbroek enum evbuffer_ptr_how {
582e985b929SDavid van Moolenbroek 	/** Sets the pointer to the position; can be called on with an
583e985b929SDavid van Moolenbroek 	    uninitialized evbuffer_ptr. */
584e985b929SDavid van Moolenbroek 	EVBUFFER_PTR_SET,
585e985b929SDavid van Moolenbroek 	/** Advances the pointer by adding to the current position. */
586e985b929SDavid van Moolenbroek 	EVBUFFER_PTR_ADD
587e985b929SDavid van Moolenbroek };
588e985b929SDavid van Moolenbroek 
589e985b929SDavid van Moolenbroek /**
590e985b929SDavid van Moolenbroek    Sets the search pointer in the buffer to position.
591e985b929SDavid van Moolenbroek 
592e985b929SDavid van Moolenbroek    If evbuffer_ptr is not initialized.  This function can only be called
593e985b929SDavid van Moolenbroek    with EVBUFFER_PTR_SET.
594e985b929SDavid van Moolenbroek 
595e985b929SDavid van Moolenbroek    @param buffer the evbuffer to be search
596e985b929SDavid van Moolenbroek    @param ptr a pointer to a struct evbuffer_ptr
597e985b929SDavid van Moolenbroek    @param position the position at which to start the next search
598e985b929SDavid van Moolenbroek    @param how determines how the pointer should be manipulated.
599e985b929SDavid van Moolenbroek    @returns 0 on success or -1 otherwise
600e985b929SDavid van Moolenbroek */
601e985b929SDavid van Moolenbroek int
602e985b929SDavid van Moolenbroek evbuffer_ptr_set(struct evbuffer *buffer, struct evbuffer_ptr *ptr,
603e985b929SDavid van Moolenbroek     size_t position, enum evbuffer_ptr_how how);
604e985b929SDavid van Moolenbroek 
605e985b929SDavid van Moolenbroek /**
606e985b929SDavid van Moolenbroek    Search for an end-of-line string within an evbuffer.
607e985b929SDavid van Moolenbroek 
608e985b929SDavid van Moolenbroek    @param buffer the evbuffer to be searched
609e985b929SDavid van Moolenbroek    @param start NULL or a pointer to a valid struct evbuffer_ptr to start
610e985b929SDavid van Moolenbroek       searching at.
611e985b929SDavid van Moolenbroek    @param eol_len_out If non-NULL, the pointed-to value will be set to
612e985b929SDavid van Moolenbroek       the length of the end-of-line string.
613e985b929SDavid van Moolenbroek    @param eol_style The kind of EOL to look for; see evbuffer_readln() for
614e985b929SDavid van Moolenbroek       more information
615e985b929SDavid van Moolenbroek    @return a struct evbuffer_ptr whose 'pos' field has the offset of the
616e985b929SDavid van Moolenbroek      first occurrence EOL in the buffer after 'start'.  The 'pos'
617e985b929SDavid van Moolenbroek      field of the result is -1 if the string was not found.
618e985b929SDavid van Moolenbroek  */
619e985b929SDavid van Moolenbroek struct evbuffer_ptr evbuffer_search_eol(struct evbuffer *buffer,
620e985b929SDavid van Moolenbroek     struct evbuffer_ptr *start, size_t *eol_len_out,
621e985b929SDavid van Moolenbroek     enum evbuffer_eol_style eol_style);
622e985b929SDavid van Moolenbroek 
623e985b929SDavid van Moolenbroek /** Function to peek at data inside an evbuffer without removing it or
624e985b929SDavid van Moolenbroek     copying it out.
625e985b929SDavid van Moolenbroek 
626e985b929SDavid van Moolenbroek     Pointers to the data are returned by filling the 'vec_out' array
627e985b929SDavid van Moolenbroek     with pointers to one or more extents of data inside the buffer.
628e985b929SDavid van Moolenbroek 
629e985b929SDavid van Moolenbroek     The total data in the extents that you get back may be more than
630e985b929SDavid van Moolenbroek     you requested (if there is more data last extent than you asked
631e985b929SDavid van Moolenbroek     for), or less (if you do not provide enough evbuffer_iovecs, or if
632e985b929SDavid van Moolenbroek     the buffer does not have as much data as you asked to see).
633e985b929SDavid van Moolenbroek 
634e985b929SDavid van Moolenbroek     @param buffer the evbuffer to peek into,
635e985b929SDavid van Moolenbroek     @param len the number of bytes to try to peek.  If len is negative, we
636e985b929SDavid van Moolenbroek        will try to fill as much of vec_out as we can.  If len is negative
637e985b929SDavid van Moolenbroek        and vec_out is not provided, we return the number of evbuffer_iovecs
638e985b929SDavid van Moolenbroek        that would be needed to get all the data in the buffer.
639e985b929SDavid van Moolenbroek     @param start_at an evbuffer_ptr indicating the point at which we
640e985b929SDavid van Moolenbroek        should start looking for data.  NULL means, "At the start of the
641e985b929SDavid van Moolenbroek        buffer."
642e985b929SDavid van Moolenbroek     @param vec_out an array of evbuffer_iovec
643e985b929SDavid van Moolenbroek     @param n_vec the length of vec_out.  If 0, we only count how many
644e985b929SDavid van Moolenbroek        extents would be necessary to point to the requested amount of
645e985b929SDavid van Moolenbroek        data.
646e985b929SDavid van Moolenbroek     @return The number of extents needed.  This may be less than n_vec
647e985b929SDavid van Moolenbroek        if we didn't need all the evbuffer_iovecs we were given, or more
648e985b929SDavid van Moolenbroek        than n_vec if we would need more to return all the data that was
649e985b929SDavid van Moolenbroek        requested.
650e985b929SDavid van Moolenbroek  */
651e985b929SDavid van Moolenbroek int evbuffer_peek(struct evbuffer *buffer, ev_ssize_t len,
652e985b929SDavid van Moolenbroek     struct evbuffer_ptr *start_at,
653e985b929SDavid van Moolenbroek     struct evbuffer_iovec *vec_out, int n_vec);
654e985b929SDavid van Moolenbroek 
655e985b929SDavid van Moolenbroek 
656e985b929SDavid van Moolenbroek /** Structure passed to an evbuffer_cb_func evbuffer callback
657e985b929SDavid van Moolenbroek 
658e985b929SDavid van Moolenbroek     @see evbuffer_cb_func, evbuffer_add_cb()
659e985b929SDavid van Moolenbroek  */
660e985b929SDavid van Moolenbroek struct evbuffer_cb_info {
661e985b929SDavid van Moolenbroek 	/** The number of bytes in this evbuffer when callbacks were last
662e985b929SDavid van Moolenbroek 	 * invoked. */
663e985b929SDavid van Moolenbroek 	size_t orig_size;
664e985b929SDavid van Moolenbroek 	/** The number of bytes added since callbacks were last invoked. */
665e985b929SDavid van Moolenbroek 	size_t n_added;
666e985b929SDavid van Moolenbroek 	/** The number of bytes removed since callbacks were last invoked. */
667e985b929SDavid van Moolenbroek 	size_t n_deleted;
668e985b929SDavid van Moolenbroek };
669e985b929SDavid van Moolenbroek 
670e985b929SDavid van Moolenbroek /** Type definition for a callback that is invoked whenever data is added or
671e985b929SDavid van Moolenbroek     removed from an evbuffer.
672e985b929SDavid van Moolenbroek 
673e985b929SDavid van Moolenbroek     An evbuffer may have one or more callbacks set at a time.  The order
674e985b929SDavid van Moolenbroek     in which they are executed is undefined.
675e985b929SDavid van Moolenbroek 
676e985b929SDavid van Moolenbroek     A callback function may add more callbacks, or remove itself from the
677e985b929SDavid van Moolenbroek     list of callbacks, or add or remove data from the buffer.  It may not
678e985b929SDavid van Moolenbroek     remove another callback from the list.
679e985b929SDavid van Moolenbroek 
680e985b929SDavid van Moolenbroek     If a callback adds or removes data from the buffer or from another
681e985b929SDavid van Moolenbroek     buffer, this can cause a recursive invocation of your callback or
682e985b929SDavid van Moolenbroek     other callbacks.  If you ask for an infinite loop, you might just get
683e985b929SDavid van Moolenbroek     one: watch out!
684e985b929SDavid van Moolenbroek 
685e985b929SDavid van Moolenbroek     @param buffer the buffer whose size has changed
686e985b929SDavid van Moolenbroek     @param info a structure describing how the buffer changed.
687e985b929SDavid van Moolenbroek     @param arg a pointer to user data
688e985b929SDavid van Moolenbroek */
689e985b929SDavid van Moolenbroek typedef void (*evbuffer_cb_func)(struct evbuffer *buffer, const struct evbuffer_cb_info *info, void *arg);
690e985b929SDavid van Moolenbroek 
691e985b929SDavid van Moolenbroek struct evbuffer_cb_entry;
692e985b929SDavid van Moolenbroek /** Add a new callback to an evbuffer.
693e985b929SDavid van Moolenbroek 
694e985b929SDavid van Moolenbroek   Subsequent calls to evbuffer_add_cb() add new callbacks.  To remove this
695e985b929SDavid van Moolenbroek   callback, call evbuffer_remove_cb or evbuffer_remove_cb_entry.
696e985b929SDavid van Moolenbroek 
697e985b929SDavid van Moolenbroek   @param buffer the evbuffer to be monitored
698e985b929SDavid van Moolenbroek   @param cb the callback function to invoke when the evbuffer is modified,
699e985b929SDavid van Moolenbroek 	or NULL to remove all callbacks.
700e985b929SDavid van Moolenbroek   @param cbarg an argument to be provided to the callback function
701e985b929SDavid van Moolenbroek   @return a handle to the callback on success, or NULL on failure.
702e985b929SDavid van Moolenbroek  */
703e985b929SDavid van Moolenbroek struct evbuffer_cb_entry *evbuffer_add_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg);
704e985b929SDavid van Moolenbroek 
705e985b929SDavid van Moolenbroek /** Remove a callback from an evbuffer, given a handle returned from
706e985b929SDavid van Moolenbroek     evbuffer_add_cb.
707e985b929SDavid van Moolenbroek 
708e985b929SDavid van Moolenbroek     Calling this function invalidates the handle.
709e985b929SDavid van Moolenbroek 
710e985b929SDavid van Moolenbroek     @return 0 if a callback was removed, or -1 if no matching callback was
711e985b929SDavid van Moolenbroek     found.
712e985b929SDavid van Moolenbroek  */
713e985b929SDavid van Moolenbroek int evbuffer_remove_cb_entry(struct evbuffer *buffer,
714e985b929SDavid van Moolenbroek 			     struct evbuffer_cb_entry *ent);
715e985b929SDavid van Moolenbroek 
716e985b929SDavid van Moolenbroek /** Remove a callback from an evbuffer, given the function and argument
717e985b929SDavid van Moolenbroek     used to add it.
718e985b929SDavid van Moolenbroek 
719e985b929SDavid van Moolenbroek     @return 0 if a callback was removed, or -1 if no matching callback was
720e985b929SDavid van Moolenbroek     found.
721e985b929SDavid van Moolenbroek  */
722e985b929SDavid van Moolenbroek int evbuffer_remove_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg);
723e985b929SDavid van Moolenbroek 
724e985b929SDavid van Moolenbroek /** If this flag is not set, then a callback is temporarily disabled, and
725e985b929SDavid van Moolenbroek  * should not be invoked.
726e985b929SDavid van Moolenbroek  *
727e985b929SDavid van Moolenbroek  * @see evbuffer_cb_set_flags(), evbuffer_cb_clear_flags()
728e985b929SDavid van Moolenbroek  */
729e985b929SDavid van Moolenbroek #define EVBUFFER_CB_ENABLED 1
730e985b929SDavid van Moolenbroek 
731e985b929SDavid van Moolenbroek /** Change the flags that are set for a callback on a buffer by adding more.
732e985b929SDavid van Moolenbroek 
733e985b929SDavid van Moolenbroek     @param buffer the evbuffer that the callback is watching.
734e985b929SDavid van Moolenbroek     @param cb the callback whose status we want to change.
735e985b929SDavid van Moolenbroek     @param flags EVBUFFER_CB_ENABLED to re-enable the callback.
736e985b929SDavid van Moolenbroek     @return 0 on success, -1 on failure.
737e985b929SDavid van Moolenbroek  */
738e985b929SDavid van Moolenbroek int evbuffer_cb_set_flags(struct evbuffer *buffer,
739e985b929SDavid van Moolenbroek 			  struct evbuffer_cb_entry *cb, ev_uint32_t flags);
740e985b929SDavid van Moolenbroek 
741e985b929SDavid van Moolenbroek /** Change the flags that are set for a callback on a buffer by removing some
742e985b929SDavid van Moolenbroek 
743e985b929SDavid van Moolenbroek     @param buffer the evbuffer that the callback is watching.
744e985b929SDavid van Moolenbroek     @param cb the callback whose status we want to change.
745e985b929SDavid van Moolenbroek     @param flags EVBUFFER_CB_ENABLED to disable the callback.
746e985b929SDavid van Moolenbroek     @return 0 on success, -1 on failure.
747e985b929SDavid van Moolenbroek  */
748e985b929SDavid van Moolenbroek int evbuffer_cb_clear_flags(struct evbuffer *buffer,
749e985b929SDavid van Moolenbroek 			  struct evbuffer_cb_entry *cb, ev_uint32_t flags);
750e985b929SDavid van Moolenbroek 
751e985b929SDavid van Moolenbroek #if 0
752e985b929SDavid van Moolenbroek /** Postpone calling a given callback until unsuspend is called later.
753e985b929SDavid van Moolenbroek 
754e985b929SDavid van Moolenbroek     This is different from disabling the callback, since the callback will get
755e985b929SDavid van Moolenbroek 	invoked later if the buffer size changes between now and when we unsuspend
756e985b929SDavid van Moolenbroek 	it.
757e985b929SDavid van Moolenbroek 
758e985b929SDavid van Moolenbroek 	@param the buffer that the callback is watching.
759e985b929SDavid van Moolenbroek 	@param cb the callback we want to suspend.
760e985b929SDavid van Moolenbroek  */
761e985b929SDavid van Moolenbroek void evbuffer_cb_suspend(struct evbuffer *buffer, struct evbuffer_cb_entry *cb);
762e985b929SDavid van Moolenbroek /** Stop postponing a callback that we postponed with evbuffer_cb_suspend.
763e985b929SDavid van Moolenbroek 
764e985b929SDavid van Moolenbroek 	If data was added to or removed from the buffer while the callback was
765e985b929SDavid van Moolenbroek 	suspended, the callback will get called once now.
766e985b929SDavid van Moolenbroek 
767e985b929SDavid van Moolenbroek 	@param the buffer that the callback is watching.
768e985b929SDavid van Moolenbroek 	@param cb the callback we want to stop suspending.
769e985b929SDavid van Moolenbroek  */
770e985b929SDavid van Moolenbroek void evbuffer_cb_unsuspend(struct evbuffer *buffer, struct evbuffer_cb_entry *cb);
771e985b929SDavid van Moolenbroek #endif
772e985b929SDavid van Moolenbroek 
773e985b929SDavid van Moolenbroek /**
774*0a6a1f1dSLionel Sambuc   Makes the data at the beginning of an evbuffer contiguous.
775e985b929SDavid van Moolenbroek 
776e985b929SDavid van Moolenbroek   @param buf the evbuffer to make contiguous
777e985b929SDavid van Moolenbroek   @param size the number of bytes to make contiguous, or -1 to make the
778e985b929SDavid van Moolenbroek 	entire buffer contiguous.
779e985b929SDavid van Moolenbroek   @return a pointer to the contiguous memory array
780e985b929SDavid van Moolenbroek */
781e985b929SDavid van Moolenbroek 
782e985b929SDavid van Moolenbroek unsigned char *evbuffer_pullup(struct evbuffer *buf, ev_ssize_t size);
783e985b929SDavid van Moolenbroek 
784e985b929SDavid van Moolenbroek /**
785e985b929SDavid van Moolenbroek   Prepends data to the beginning of the evbuffer
786e985b929SDavid van Moolenbroek 
787e985b929SDavid van Moolenbroek   @param buf the evbuffer to which to prepend data
788e985b929SDavid van Moolenbroek   @param data a pointer to the memory to prepend
789e985b929SDavid van Moolenbroek   @param size the number of bytes to prepend
790e985b929SDavid van Moolenbroek   @return 0 if successful, or -1 otherwise
791e985b929SDavid van Moolenbroek */
792e985b929SDavid van Moolenbroek 
793e985b929SDavid van Moolenbroek int evbuffer_prepend(struct evbuffer *buf, const void *data, size_t size);
794e985b929SDavid van Moolenbroek 
795e985b929SDavid van Moolenbroek /**
796e985b929SDavid van Moolenbroek   Prepends all data from the src evbuffer to the beginning of the dst
797e985b929SDavid van Moolenbroek   evbuffer.
798e985b929SDavid van Moolenbroek 
799e985b929SDavid van Moolenbroek   @param dst the evbuffer to which to prepend data
800e985b929SDavid van Moolenbroek   @param src the evbuffer to prepend; it will be emptied as a result
801e985b929SDavid van Moolenbroek   @return 0 if successful, or -1 otherwise
802e985b929SDavid van Moolenbroek */
803e985b929SDavid van Moolenbroek int evbuffer_prepend_buffer(struct evbuffer *dst, struct evbuffer* src);
804e985b929SDavid van Moolenbroek 
805e985b929SDavid van Moolenbroek /**
806e985b929SDavid van Moolenbroek    Prevent calls that modify an evbuffer from succeeding. A buffer may
807e985b929SDavid van Moolenbroek    frozen at the front, at the back, or at both the front and the back.
808e985b929SDavid van Moolenbroek 
809e985b929SDavid van Moolenbroek    If the front of a buffer is frozen, operations that drain data from
810e985b929SDavid van Moolenbroek    the front of the buffer, or that prepend data to the buffer, will
811e985b929SDavid van Moolenbroek    fail until it is unfrozen.   If the back a buffer is frozen, operations
812e985b929SDavid van Moolenbroek    that append data from the buffer will fail until it is unfrozen.
813e985b929SDavid van Moolenbroek 
814e985b929SDavid van Moolenbroek    @param buf The buffer to freeze
815e985b929SDavid van Moolenbroek    @param at_front If true, we freeze the front of the buffer.  If false,
816e985b929SDavid van Moolenbroek       we freeze the back.
817e985b929SDavid van Moolenbroek    @return 0 on success, -1 on failure.
818e985b929SDavid van Moolenbroek */
819e985b929SDavid van Moolenbroek int evbuffer_freeze(struct evbuffer *buf, int at_front);
820e985b929SDavid van Moolenbroek /**
821e985b929SDavid van Moolenbroek    Re-enable calls that modify an evbuffer.
822e985b929SDavid van Moolenbroek 
823e985b929SDavid van Moolenbroek    @param buf The buffer to un-freeze
824e985b929SDavid van Moolenbroek    @param at_front If true, we unfreeze the front of the buffer.  If false,
825e985b929SDavid van Moolenbroek       we unfreeze the back.
826e985b929SDavid van Moolenbroek    @return 0 on success, -1 on failure.
827e985b929SDavid van Moolenbroek  */
828e985b929SDavid van Moolenbroek int evbuffer_unfreeze(struct evbuffer *buf, int at_front);
829e985b929SDavid van Moolenbroek 
830e985b929SDavid van Moolenbroek struct event_base;
831e985b929SDavid van Moolenbroek /**
832e985b929SDavid van Moolenbroek    Force all the callbacks on an evbuffer to be run, not immediately after
833e985b929SDavid van Moolenbroek    the evbuffer is altered, but instead from inside the event loop.
834e985b929SDavid van Moolenbroek 
835e985b929SDavid van Moolenbroek    This can be used to serialize all the callbacks to a single thread
836e985b929SDavid van Moolenbroek    of execution.
837e985b929SDavid van Moolenbroek  */
838e985b929SDavid van Moolenbroek int evbuffer_defer_callbacks(struct evbuffer *buffer, struct event_base *base);
839e985b929SDavid van Moolenbroek 
840e985b929SDavid van Moolenbroek #ifdef __cplusplus
841e985b929SDavid van Moolenbroek }
842e985b929SDavid van Moolenbroek #endif
843e985b929SDavid van Moolenbroek 
844e985b929SDavid van Moolenbroek #endif /* _EVENT2_BUFFER_H_ */
845