Libevent Code Doxygen document
buffer.h
Go to the documentation of this file.
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 
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 
97 struct evbuffer
98 #ifdef EVENT_IN_DOXYGEN_
99 {}
100 #endif
101 ;
102 
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 
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
139  void *iov_base;
141  size_t iov_len;
142 };
143 #endif
144 
151 EVENT2_EXPORT_SYMBOL
152 struct evbuffer *evbuffer_new(void);
158 EVENT2_EXPORT_SYMBOL
159 void evbuffer_free(struct evbuffer *buf);
160 
173 EVENT2_EXPORT_SYMBOL
174 int evbuffer_enable_locking(struct evbuffer *buf, void *lock);
175 
180 EVENT2_EXPORT_SYMBOL
181 void evbuffer_lock(struct evbuffer *buf);
182 
187 EVENT2_EXPORT_SYMBOL
188 void evbuffer_unlock(struct evbuffer *buf);
189 
190 
206 #define EVBUFFER_FLAG_DRAINS_TO_FD 1
207 
215 EVENT2_EXPORT_SYMBOL
216 int evbuffer_set_flags(struct evbuffer *buf, ev_uint64_t flags);
224 EVENT2_EXPORT_SYMBOL
225 int evbuffer_clear_flags(struct evbuffer *buf, ev_uint64_t flags);
226 
233 EVENT2_EXPORT_SYMBOL
234 size_t evbuffer_get_length(const struct evbuffer *buf);
235 
248 EVENT2_EXPORT_SYMBOL
249 size_t evbuffer_get_contiguous_space(const struct evbuffer *buf);
250 
261 EVENT2_EXPORT_SYMBOL
262 int evbuffer_expand(struct evbuffer *buf, size_t datlen);
263 
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 
323 EVENT2_EXPORT_SYMBOL
324 int evbuffer_commit_space(struct evbuffer *buf,
325  struct evbuffer_iovec *vec, int n_vecs);
326 
335 EVENT2_EXPORT_SYMBOL
336 int evbuffer_add(struct evbuffer *buf, const void *data, size_t datlen);
337 
338 
350 EVENT2_EXPORT_SYMBOL
351 int evbuffer_remove(struct evbuffer *buf, void *data, size_t datlen);
352 
364 EVENT2_EXPORT_SYMBOL
365 ev_ssize_t evbuffer_copyout(struct evbuffer *buf, void *data_out, size_t datlen);
366 
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 
395 EVENT2_EXPORT_SYMBOL
396 int evbuffer_remove_buffer(struct evbuffer *src, struct evbuffer *dst,
397  size_t datlen);
398 
401 enum evbuffer_eol_style {
421 };
422 
437 EVENT2_EXPORT_SYMBOL
438 char *evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out,
439  enum evbuffer_eol_style eol_style);
440 
453 EVENT2_EXPORT_SYMBOL
454 int evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf);
455 
469 EVENT2_EXPORT_SYMBOL
470 int evbuffer_add_buffer_reference(struct evbuffer *outbuf,
471  struct evbuffer *inbuf);
472 
479 typedef void (*evbuffer_ref_cleanup_cb)(const void *data,
480  size_t datalen, void *extra);
481 
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 
526 EVENT2_EXPORT_SYMBOL
527 int evbuffer_add_file(struct evbuffer *outbuf, int fd, ev_off_t offset,
528  ev_off_t length);
529 
538 struct evbuffer_file_segment;
539 
545 #define EVBUF_FS_CLOSE_ON_FREE 0x01
550 #define EVBUF_FS_DISABLE_MMAP 0x02
560 #define EVBUF_FS_DISABLE_SENDFILE 0x04
567 #define EVBUF_FS_DISABLE_LOCKING 0x08
568 
573 typedef void (*evbuffer_file_segment_cleanup_cb)(
574  struct evbuffer_file_segment const* seg, int flags, void* arg);
575 
598 EVENT2_EXPORT_SYMBOL
600  int fd, ev_off_t offset, ev_off_t length, unsigned flags);
601 
609 EVENT2_EXPORT_SYMBOL
611 
619 EVENT2_EXPORT_SYMBOL
621  evbuffer_file_segment_cleanup_cb cb, void* arg);
622 
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 
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 
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 
691 EVENT2_EXPORT_SYMBOL
692 int evbuffer_drain(struct evbuffer *buf, size_t len);
693 
694 
705 EVENT2_EXPORT_SYMBOL
706 int evbuffer_write(struct evbuffer *buffer, evutil_socket_t fd);
707 
720 EVENT2_EXPORT_SYMBOL
722  ev_ssize_t howmuch);
723 
734 EVENT2_EXPORT_SYMBOL
735 int evbuffer_read(struct evbuffer *buffer, evutil_socket_t fd, int howmuch);
736 
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 
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 
772 enum evbuffer_ptr_how {
778 };
779 
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 
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 
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 
863 struct evbuffer_cb_info {
866  size_t orig_size;
868  size_t n_added;
870  size_t n_deleted;
871 };
872 
892 typedef void (*evbuffer_cb_func)(struct evbuffer *buffer, const struct evbuffer_cb_info *info, void *arg);
893 
894 struct evbuffer_cb_entry;
906 EVENT2_EXPORT_SYMBOL
907 struct evbuffer_cb_entry *evbuffer_add_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg);
908 
917 EVENT2_EXPORT_SYMBOL
918 int evbuffer_remove_cb_entry(struct evbuffer *buffer,
919  struct evbuffer_cb_entry *ent);
920 
927 EVENT2_EXPORT_SYMBOL
928 int evbuffer_remove_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg);
929 
935 #define EVBUFFER_CB_ENABLED 1
936 
944 EVENT2_EXPORT_SYMBOL
945 int evbuffer_cb_set_flags(struct evbuffer *buffer,
946  struct evbuffer_cb_entry *cb, ev_uint32_t flags);
947 
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
969 EVENT2_EXPORT_SYMBOL
970 void evbuffer_cb_suspend(struct evbuffer *buffer, struct evbuffer_cb_entry *cb);
979 EVENT2_EXPORT_SYMBOL
980 void evbuffer_cb_unsuspend(struct evbuffer *buffer, struct evbuffer_cb_entry *cb);
981 #endif
982 
993 EVENT2_EXPORT_SYMBOL
994 unsigned char *evbuffer_pullup(struct evbuffer *buf, ev_ssize_t size);
995 
1005 EVENT2_EXPORT_SYMBOL
1006 int evbuffer_prepend(struct evbuffer *buf, const void *data, size_t size);
1007 
1016 EVENT2_EXPORT_SYMBOL
1017 int evbuffer_prepend_buffer(struct evbuffer *dst, struct evbuffer* src);
1018 
1033 EVENT2_EXPORT_SYMBOL
1034 int evbuffer_freeze(struct evbuffer *buf, int at_front);
1043 EVENT2_EXPORT_SYMBOL
1044 int evbuffer_unfreeze(struct evbuffer *buf, int at_front);
1045 
1046 struct event_base;
1054 EVENT2_EXPORT_SYMBOL
1055 int evbuffer_defer_callbacks(struct evbuffer *buffer, struct event_base *base);
1056 
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_ */
EVENT2_EXPORT_SYMBOL struct evbuffer_ptr evbuffer_search(struct evbuffer *buffer, const char *what, size_t len, const struct evbuffer_ptr *start)
Definition: buffer.c:2715
EVENT2_EXPORT_SYMBOL int evbuffer_drain(struct evbuffer *buf, size_t len)
Definition: buffer.c:1101
EVENT2_EXPORT_SYMBOL void evbuffer_file_segment_free(struct evbuffer_file_segment *seg)
Definition: buffer.c:3155
EVENT2_EXPORT_SYMBOL int evbuffer_prepend(struct evbuffer *buf, const void *data, size_t size)
Definition: buffer.c:1827
evbuffer_ptr_how
Definition: buffer.h:768
@ EVBUFFER_PTR_ADD
Definition: buffer.h:773
@ EVBUFFER_PTR_SET
Definition: buffer.h:771
EVENT2_EXPORT_SYMBOL int evbuffer_reserve_space(struct evbuffer *buf, ev_ssize_t size, struct evbuffer_iovec *vec, int n_vec)
Definition: buffer.c:671
EVENT2_EXPORT_SYMBOL int evbuffer_prepend_buffer(struct evbuffer *dst, struct evbuffer *src)
Definition: buffer.c:1055
EVENT2_EXPORT_SYMBOL int evbuffer_ptr_set(struct evbuffer *buffer, struct evbuffer_ptr *ptr, size_t position, enum evbuffer_ptr_how how)
Definition: buffer.c:2623
EVENT2_EXPORT_SYMBOL int evbuffer_clear_flags(struct evbuffer *buf, ev_uint64_t flags)
Definition: buffer.c:387
EVENT2_EXPORT_SYMBOL void evbuffer_unlock(struct evbuffer *buf)
Definition: buffer.c:601
EVENT2_EXPORT_SYMBOL int evbuffer_read(struct evbuffer *buffer, evutil_socket_t fd, int howmuch)
Definition: buffer.c:2284
EVENT2_EXPORT_SYMBOL struct evbuffer_ptr evbuffer_search_eol(struct evbuffer *buffer, struct evbuffer_ptr *start, size_t *eol_len_out, enum evbuffer_eol_style eol_style)
Definition: buffer.c:1597
EVENT2_EXPORT_SYMBOL int evbuffer_freeze(struct evbuffer *buf, int at_front)
Definition: buffer.c:3401
EVENT2_EXPORT_SYMBOL int evbuffer_add_file_segment(struct evbuffer *buf, struct evbuffer_file_segment *seg, ev_off_t offset, ev_off_t length)
Definition: buffer.c:3194
EVENT2_EXPORT_SYMBOL int evbuffer_add_reference(struct evbuffer *outbuf, const void *data, size_t datlen, evbuffer_ref_cleanup_cb cleanupfn, void *cleanupfn_arg)
Definition: buffer.c:2921
EVENT2_EXPORT_SYMBOL struct evbuffer_cb_entry * evbuffer_add_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg)
Definition: buffer.c:3334
EVENT2_EXPORT_SYMBOL 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)
Definition: buffer.c:2721
EVENT2_EXPORT_SYMBOL ev_ssize_t evbuffer_copyout_from(struct evbuffer *buf, const struct evbuffer_ptr *pos, void *data_out, size_t datlen)
Definition: buffer.c:1190
EVENT2_EXPORT_SYMBOL size_t evbuffer_get_contiguous_space(const struct evbuffer *buf)
Definition: buffer.c:621
EVENT2_EXPORT_SYMBOL int evbuffer_add_file(struct evbuffer *outbuf, int fd, ev_off_t offset, ev_off_t length)
Definition: buffer.c:3296
EVENT2_EXPORT_SYMBOL int evbuffer_add_buffer_reference(struct evbuffer *outbuf, struct evbuffer *inbuf)
Definition: buffer.c:1012
void(* evbuffer_ref_cleanup_cb)(const void *data, size_t datalen, void *extra)
Definition: buffer.h:475
EVENT2_EXPORT_SYMBOL int evbuffer_write_atmost(struct evbuffer *buffer, evutil_socket_t fd, ev_ssize_t howmuch)
Definition: buffer.c:2524
EVENT2_EXPORT_SYMBOL struct evbuffer * evbuffer_new(void)
Definition: buffer.c:362
EVENT2_EXPORT_SYMBOL int evbuffer_write(struct evbuffer *buffer, evutil_socket_t fd)
Definition: buffer.c:2572
EVENT2_EXPORT_SYMBOL size_t evbuffer_get_length(const struct evbuffer *buf)
Definition: buffer.c:607
EVENT2_EXPORT_SYMBOL int evbuffer_remove_buffer(struct evbuffer *src, struct evbuffer *dst, size_t datlen)
Definition: buffer.c:1260
EVENT2_EXPORT_SYMBOL int evbuffer_set_flags(struct evbuffer *buf, ev_uint64_t flags)
Definition: buffer.c:378
EVENT2_EXPORT_SYMBOL int evbuffer_add(struct evbuffer *buf, const void *data, size_t datlen)
Definition: buffer.c:1730
EVENT2_EXPORT_SYMBOL char * evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out, enum evbuffer_eol_style eol_style)
Definition: buffer.c:1687
EVENT2_EXPORT_SYMBOL int evbuffer_expand(struct evbuffer *buf, size_t datlen)
Definition: buffer.c:2161
void(* evbuffer_cb_func)(struct evbuffer *buffer, const struct evbuffer_cb_info *info, void *arg)
Definition: buffer.h:888
EVENT2_EXPORT_SYMBOL int evbuffer_defer_callbacks(struct evbuffer *buffer, struct event_base *base)
Definition: buffer.c:411
void(* evbuffer_file_segment_cleanup_cb)(struct evbuffer_file_segment const *seg, int flags, void *arg)
Definition: buffer.h:569
EVENT2_EXPORT_SYMBOL struct evbuffer_file_segment * evbuffer_file_segment_new(int fd, ev_off_t offset, ev_off_t length, unsigned flags)
Definition: buffer.c:2964
EVENT2_EXPORT_SYMBOL int evbuffer_remove(struct evbuffer *buf, void *data, size_t datlen)
Definition: buffer.c:1170
EVENT2_EXPORT_SYMBOL int evbuffer_peek(struct evbuffer *buffer, ev_ssize_t len, struct evbuffer_ptr *start_at, struct evbuffer_iovec *vec_out, int n_vec)
Definition: buffer.c:2785
EVENT2_EXPORT_SYMBOL void evbuffer_file_segment_add_cleanup_cb(struct evbuffer_file_segment *seg, evbuffer_file_segment_cleanup_cb cb, void *arg)
Definition: buffer.c:3146
EVENT2_EXPORT_SYMBOL void evbuffer_free(struct evbuffer *buf)
Definition: buffer.c:588
EVENT2_EXPORT_SYMBOL int evbuffer_commit_space(struct evbuffer *buf, struct evbuffer_iovec *vec, int n_vecs)
Definition: buffer.c:724
EVENT2_EXPORT_SYMBOL int evbuffer_add_vprintf(struct evbuffer *buf, const char *fmt, va_list ap)
Definition: buffer.c:2844
EVENT2_EXPORT_SYMBOL int evbuffer_remove_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg)
Definition: buffer.c:3360
EVENT2_EXPORT_SYMBOL int evbuffer_add_printf(struct evbuffer *buf, const char *fmt,...)
Definition: buffer.c:2908
EVENT2_EXPORT_SYMBOL size_t evbuffer_add_iovec(struct evbuffer *buffer, struct evbuffer_iovec *vec, int n_vec)
Definition: buffer.c:635
EVENT2_EXPORT_SYMBOL unsigned char * evbuffer_pullup(struct evbuffer *buf, ev_ssize_t size)
Definition: buffer.c:1350
evbuffer_eol_style
Definition: buffer.h:397
@ EVBUFFER_EOL_CRLF
Definition: buffer.h:410
@ EVBUFFER_EOL_NUL
Definition: buffer.h:416
@ EVBUFFER_EOL_CRLF_STRICT
Definition: buffer.h:412
@ EVBUFFER_EOL_ANY
Definition: buffer.h:407
@ EVBUFFER_EOL_LF
Definition: buffer.h:414
EVENT2_EXPORT_SYMBOL int evbuffer_remove_cb_entry(struct evbuffer *buffer, struct evbuffer_cb_entry *ent)
Definition: buffer.c:3349
EVENT2_EXPORT_SYMBOL int evbuffer_cb_clear_flags(struct evbuffer *buffer, struct evbuffer_cb_entry *cb, ev_uint32_t flags)
Definition: buffer.c:3389
EVENT2_EXPORT_SYMBOL int evbuffer_unfreeze(struct evbuffer *buf, int at_front)
Definition: buffer.c:3413
EVENT2_EXPORT_SYMBOL int evbuffer_cb_set_flags(struct evbuffer *buffer, struct evbuffer_cb_entry *cb, ev_uint32_t flags)
Definition: buffer.c:3377
EVENT2_EXPORT_SYMBOL int evbuffer_enable_locking(struct evbuffer *buf, void *lock)
Definition: buffer.c:424
EVENT2_EXPORT_SYMBOL int evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf)
Definition: buffer.c:966
EVENT2_EXPORT_SYMBOL ev_ssize_t evbuffer_copyout(struct evbuffer *buf, void *data_out, size_t datlen)
Definition: buffer.c:1184
EVENT2_EXPORT_SYMBOL void evbuffer_lock(struct evbuffer *buf)
Definition: buffer.c:595
Definition: evbuffer-internal.h:62
union evbuffer_cb_entry::@1 cb
ev_uint32_t flags
Definition: evbuffer-internal.h:75
void * cbarg
Definition: evbuffer-internal.h:73
Definition: buffer.h:859
size_t orig_size
Definition: buffer.h:862
size_t n_deleted
Definition: buffer.h:866
size_t n_added
Definition: buffer.h:864
Definition: evbuffer-internal.h:235
ev_off_t length
Definition: evbuffer-internal.h:261
unsigned flags
Definition: evbuffer-internal.h:238
int fd
Definition: evbuffer-internal.h:245
Definition: buffer.h:133
size_t iov_len
Definition: buffer.h:137
void * iov_base
Definition: buffer.h:135
Definition: buffer.h:112
Definition: evbuffer-internal.h:80
void * lock
Definition: evbuffer-internal.h:113
ev_uint32_t flags
Definition: evbuffer-internal.h:135
Definition: event-internal.h:208
#define evutil_socket_t
Definition: util.h:310