tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

buffer.h (39189B)


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