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