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