1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * All rights reserved.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Redistribution and use in source and binary forms, with or without
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * modification, are permitted provided that the following conditions
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * are met:
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1. Redistributions of source code must retain the above copyright
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *    notice, this list of conditions and the following disclaimer.
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 2. Redistributions in binary form must reproduce the above copyright
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *    notice, this list of conditions and the following disclaimer in the
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *    documentation and/or other materials provided with the distribution.
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 3. The name of the author may not be used to endorse or promote products
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *    derived from this software without specific prior written permission.
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef _EVENT_H_
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define _EVENT_H_
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/** @mainpage
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @section intro Introduction
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  libevent is an event notification library for developing scalable network
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  servers.  The libevent API provides a mechanism to execute a callback
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  function when a specific event occurs on a file descriptor or after a
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  timeout has been reached. Furthermore, libevent also support callbacks due
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  to signals or regular timeouts.
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  libevent is meant to replace the event loop found in event driven network
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  servers. An application just needs to call event_dispatch() and then add or
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  remove events dynamically without having to change the event loop.
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Currently, libevent supports /dev/poll, kqueue(2), select(2), poll(2) and
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  epoll(4). It also has experimental support for real-time signals. The
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  internal event mechanism is completely independent of the exposed event API,
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  and a simple update of libevent can provide new functionality without having
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  to redesign the applications. As a result, Libevent allows for portable
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  application development and provides the most scalable event notification
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  mechanism available on an operating system. Libevent can also be used for
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  multi-threaded aplications; see Steven Grimm's explanation. Libevent should
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  compile on Linux, *BSD, Mac OS X, Solaris and Windows.
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @section usage Standard usage
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Every program that uses libevent must include the <event.h> header, and pass
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  the -levent flag to the linker.  Before using any of the functions in the
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  library, you must call event_init() or event_base_new() to perform one-time
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  initialization of the libevent library.
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @section event Event notification
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  For each file descriptor that you wish to monitor, you must declare an event
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  structure and call event_set() to initialize the members of the structure.
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  To enable notification, you add the structure to the list of monitored
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  events by calling event_add().  The event structure must remain allocated as
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  long as it is active, so it should be allocated on the heap. Finally, you
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  call event_dispatch() to loop and dispatch events.
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @section bufferevent I/O Buffers
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  libevent provides an abstraction on top of the regular event callbacks. This
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  abstraction is called a buffered event. A buffered event provides input and
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  output buffers that get filled and drained automatically. The user of a
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  buffered event no longer deals directly with the I/O, but instead is reading
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  from input and writing to output buffers.
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Once initialized via bufferevent_new(), the bufferevent structure can be
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  used repeatedly with bufferevent_enable() and bufferevent_disable().
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Instead of reading and writing directly to a socket, you would call
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bufferevent_read() and bufferevent_write().
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  When read enabled the bufferevent will try to read from the file descriptor
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  and call the read callback. The write callback is executed whenever the
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  output buffer is drained below the write low watermark, which is 0 by
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  default.
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @section timers Timers
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  libevent can also be used to create timers that invoke a callback after a
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  certain amount of time has expired. The evtimer_set() function prepares an
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event struct to be used as a timer. To activate the timer, call
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  evtimer_add(). Timers can be deactivated by calling evtimer_del().
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @section timeouts Timeouts
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  In addition to simple timers, libevent can assign timeout events to file
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  descriptors that are triggered whenever a certain amount of time has passed
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  with no activity on a file descriptor.  The timeout_set() function
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  initializes an event struct for use as a timeout. Once initialized, the
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event must be activated by using timeout_add().  To cancel the timeout, call
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  timeout_del().
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @section evdns Asynchronous DNS resolution
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  libevent provides an asynchronous DNS resolver that should be used instead
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  of the standard DNS resolver functions.  These functions can be imported by
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  including the <evdns.h> header in your program. Before using any of the
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  resolver functions, you must call evdns_init() to initialize the library. To
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  convert a hostname to an IP address, you call the evdns_resolve_ipv4()
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  function.  To perform a reverse lookup, you would call the
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  evdns_resolve_reverse() function.  All of these functions use callbacks to
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  avoid blocking while the lookup is performed.
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @section evhttp Event-driven HTTP servers
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  libevent provides a very simple event-driven HTTP server that can be
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  embedded in your program and used to service HTTP requests.
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  To use this capability, you need to include the <evhttp.h> header in your
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  program.  You create the server by calling evhttp_new(). Add addresses and
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ports to listen on with evhttp_bind_socket(). You then register one or more
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  callbacks to handle incoming requests.  Each URI can be assigned a callback
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  via the evhttp_set_cb() function.  A generic callback function can also be
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  registered via evhttp_set_gencb(); this callback will be invoked if no other
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  callbacks have been registered for a given URI.
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @section evrpc A framework for RPC servers and clients
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  libevents provides a framework for creating RPC servers and clients.  It
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  takes care of marshaling and unmarshaling all data structures.
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @section api API Reference
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  To browse the complete documentation of the libevent API, click on any of
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  the following links.
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event.h
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The primary libevent header
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  evdns.h
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Asynchronous DNS resolution
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  evhttp.h
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  An embedded libevent-based HTTP server
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  evrpc.h
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  A framework for creating RPC servers and clients
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/** @file event.h
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  A library for writing event-driven network servers
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef __cplusplus
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottextern "C" {
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "event-config.h"
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_SYS_TYPES_H
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/types.h>
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_SYS_TIME_H
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/time.h>
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_HAVE_STDINT_H
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdint.h>
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdarg.h>
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* For int types. */
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "evutil.h"
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef WIN32
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define WIN32_LEAN_AND_MEAN
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h>
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef WIN32_LEAN_AND_MEAN
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef unsigned char u_char;
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef unsigned short u_short;
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVLIST_TIMEOUT	0x01
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVLIST_INSERTED	0x02
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVLIST_SIGNAL	0x04
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVLIST_ACTIVE	0x08
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVLIST_INTERNAL	0x10
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVLIST_INIT	0x80
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* EVLIST_X_ Private space: 0x1000-0xf000 */
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVLIST_ALL	(0xf000 | 0x9f)
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EV_TIMEOUT	0x01
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EV_READ		0x02
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EV_WRITE	0x04
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EV_SIGNAL	0x08
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EV_PERSIST	0x10	/* Persistant event */
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* Fix so that ppl dont have to run with <sys/queue.h> */
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef TAILQ_ENTRY
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define _EVENT_DEFINED_TQENTRY
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define TAILQ_ENTRY(type)						\
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct {								\
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct type *tqe_next;	/* next element */			\
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct type **tqe_prev;	/* address of previous next element */	\
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* !TAILQ_ENTRY */
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct event_base;
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef EVENT_NO_STRUCT
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct event {
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	TAILQ_ENTRY (event) ev_next;
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	TAILQ_ENTRY (event) ev_active_next;
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	TAILQ_ENTRY (event) ev_signal_next;
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	unsigned int min_heap_idx;	/* for managing timeouts */
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct event_base *ev_base;
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	int ev_fd;
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	short ev_events;
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	short ev_ncalls;
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	short *ev_pncalls;	/* Allows deletes in callback */
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct timeval ev_timeout;
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	int ev_pri;		/* smaller numbers are higher priority */
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	void (*ev_callback)(int, short, void *arg);
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	void *ev_arg;
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	int ev_res;		/* result passed to event callback */
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	int ev_flags;
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct event;
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVENT_SIGNAL(ev)	(int)(ev)->ev_fd
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVENT_FD(ev)		(int)(ev)->ev_fd
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Key-Value pairs.  Can be used for HTTP headers but also for
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * query argument parsing.
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct evkeyval {
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	TAILQ_ENTRY(evkeyval) next;
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	char *key;
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	char *value;
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef _EVENT_DEFINED_TQENTRY
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef TAILQ_ENTRY
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct event_list;
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct evkeyvalq;
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef _EVENT_DEFINED_TQENTRY
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTAILQ_HEAD (event_list, event);
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTAILQ_HEAD (evkeyvalq, evkeyval);
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* _EVENT_DEFINED_TQENTRY */
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Initialize the event API.
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Use event_base_new() to initialize a new event base, but does not set
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  the current_base global.   If using only event_base_new(), each event
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  added must have an event base set with event_base_set()
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_base_set(), event_base_free(), event_init()
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct event_base *event_base_new(void);
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Initialize the event API.
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The event API needs to be initialized with event_init() before it can be
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  used.  Sets the current_base global representing the default base for
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  events that have no base associated with them.
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_base_set(), event_base_new()
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct event_base *event_init(void);
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Reinitialized the event base after a fork
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Some event mechanisms do not survive across fork.   The event base needs
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  to be reinitialized with the event_reinit() function.
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param base the event base that needs to be re-initialized
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if some events could not be re-added.
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_base_new(), event_init()
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott*/
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_reinit(struct event_base *base);
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Loop to process events.
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  In order to process events, an application needs to call
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event_dispatch().  This function only returns on error, and should
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  replace the event core of the application program.
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_base_dispatch()
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_dispatch(void);
308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Threadsafe event dispatching loop.
312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param eb the event_base structure returned by event_init()
314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_init(), event_dispatch()
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_base_dispatch(struct event_base *);
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Get the kernel event notification mechanism used by libevent.
321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott @param eb the event_base structure returned by event_base_new()
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott @return a string identifying the kernel event mechanism (kqueue, epoll, etc.)
324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char *event_base_get_method(struct event_base *);
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Deallocate all memory associated with an event_base, and free the base.
330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Note that this function will not close any fds or free any memory passed
332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  to event_set as the argument to callback.
333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param eb an event_base to be freed
335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid event_base_free(struct event_base *);
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define _EVENT_LOG_DEBUG 0
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define _EVENT_LOG_MSG   1
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define _EVENT_LOG_WARN  2
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define _EVENT_LOG_ERR   3
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef void (*event_log_cb)(int severity, const char *msg);
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Redirect libevent's log messages.
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param cb a function taking two arguments: an integer severity between
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     _EVENT_LOG_DEBUG and _EVENT_LOG_ERR, and a string.  If cb is NULL,
349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	 then the default log is used.
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  */
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid event_set_log_callback(event_log_cb cb);
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Associate a different event base with an event.
355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param eb the event base
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ev the event
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_base_set(struct event_base *, struct event *);
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott event_loop() flags
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*@{*/
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVLOOP_ONCE	0x01	/**< Block at most once. */
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVLOOP_NONBLOCK	0x02	/**< Do not block. */
367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*@}*/
368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Handle events.
371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  This is a more flexible version of event_dispatch().
373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param flags any combination of EVLOOP_ONCE | EVLOOP_NONBLOCK
375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, -1 if an error occurred, or 1 if no events were
376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    registered.
377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_loopexit(), event_base_loop()
378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott*/
379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_loop(int);
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Handle events (threadsafe version).
383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  This is a more flexible version of event_base_dispatch().
385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param eb the event_base structure returned by event_init()
387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param flags any combination of EVLOOP_ONCE | EVLOOP_NONBLOCK
388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, -1 if an error occurred, or 1 if no events were
389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    registered.
390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_loopexit(), event_base_loop()
391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  */
392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_base_loop(struct event_base *, int);
393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Exit the event loop after the specified time.
396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The next event_loop() iteration after the given timer expires will
398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  complete normally (handling all queued events) then exit without
399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  blocking for events again.
400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Subsequent invocations of event_loop() will proceed normally.
402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param tv the amount of time after which the loop should terminate.
404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_loop(), event_base_loop(), event_base_loopexit()
406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  */
407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_loopexit(const struct timeval *);
408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Exit the event loop after the specified time (threadsafe variant).
412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The next event_base_loop() iteration after the given timer expires will
414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  complete normally (handling all queued events) then exit without
415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  blocking for events again.
416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Subsequent invocations of event_base_loop() will proceed normally.
418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param eb the event_base structure returned by event_init()
420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param tv the amount of time after which the loop should terminate.
421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_loopexit()
423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_base_loopexit(struct event_base *, const struct timeval *);
425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Abort the active event_loop() immediately.
428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event_loop() will abort the loop after the next event is completed;
430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event_loopbreak() is typically invoked from this event's callback.
431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  This behavior is analogous to the "break;" statement.
432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Subsequent invocations of event_loop() will proceed normally.
434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_base_loopbreak(), event_loopexit()
437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_loopbreak(void);
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Abort the active event_base_loop() immediately.
442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event_base_loop() will abort the loop after the next event is completed;
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event_base_loopbreak() is typically invoked from this event's callback.
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  This behavior is analogous to the "break;" statement.
446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Subsequent invocations of event_loop() will proceed normally.
448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param eb the event_base structure returned by event_init()
450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_base_loopexit
452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_base_loopbreak(struct event_base *);
454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Add a timer event.
458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ev the event struct
460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param tv timeval struct
461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evtimer_add(ev, tv)		event_add(ev, tv)
463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Define a timer event.
467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ev event struct to be modified
469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param cb callback function
470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param arg argument that will be passed to the callback function
471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evtimer_set(ev, cb, arg)	event_set(ev, -1, 0, cb, arg)
473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Delete a timer event.
477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param ev the event struct to be disabled
479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evtimer_del(ev)			event_del(ev)
481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evtimer_pending(ev, tv)		event_pending(ev, EV_TIMEOUT, tv)
482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define evtimer_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Add a timeout event.
486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param ev the event struct to be disabled
488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param tv the timeout value, in seconds
489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define timeout_add(ev, tv)		event_add(ev, tv)
491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Define a timeout event.
495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param ev the event struct to be defined
497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param cb the callback to be invoked when the timeout expires
498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param arg the argument to be passed to the callback
499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define timeout_set(ev, cb, arg)	event_set(ev, -1, 0, cb, arg)
501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Disable a timeout event.
505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param ev the timeout event to be disabled
507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define timeout_del(ev)			event_del(ev)
509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define timeout_pending(ev, tv)		event_pending(ev, EV_TIMEOUT, tv)
511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define timeout_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define signal_add(ev, tv)		event_add(ev, tv)
514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define signal_set(ev, x, cb, arg)	\
515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	event_set(ev, x, EV_SIGNAL|EV_PERSIST, cb, arg)
516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define signal_del(ev)			event_del(ev)
517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define signal_pending(ev, tv)		event_pending(ev, EV_SIGNAL, tv)
518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define signal_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Prepare an event structure to be added.
522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The function event_set() prepares the event structure ev to be used in
524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  future calls to event_add() and event_del().  The event will be prepared to
525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  call the function specified by the fn argument with an int argument
526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  indicating the file descriptor, a short argument indicating the type of
527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event, and a void * argument given in the arg argument.  The fd indicates
528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  the file descriptor that should be monitored for events.  The events can be
529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  either EV_READ, EV_WRITE, or both.  Indicating that an application can read
530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  or write from the file descriptor respectively without blocking.
531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The function fn will be called with the file descriptor that triggered the
533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event and the type of event which will be either EV_TIMEOUT, EV_SIGNAL,
534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EV_READ, or EV_WRITE.  The additional flag EV_PERSIST makes an event_add()
535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  persistent until event_del() has been called.
536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ev an event struct to be modified
538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param fd the file descriptor to be monitored
539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param event desired events to monitor; can be EV_READ and/or EV_WRITE
540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param fn callback function to be invoked when the event occurs
541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param arg an argument to be passed to the callback function
542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_add(), event_del(), event_once()
544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid event_set(struct event *, int, short, void (*)(int, short, void *), void *);
547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Schedule a one-time event to occur.
550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The function event_once() is similar to event_set().  However, it schedules
552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  a callback to be called exactly once and does not require the caller to
553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  prepare an event structure.
554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param fd a file descriptor to monitor
556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param events event(s) to monitor; can be any of EV_TIMEOUT | EV_READ |
557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         EV_WRITE
558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param callback callback function to be invoked when the event occurs
559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param arg an argument to be passed to the callback function
560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param timeout the maximum amount of time to wait for the event, or NULL
561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         to wait forever
562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_set()
564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_once(int, short, void (*)(int, short, void *), void *,
567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const struct timeval *);
568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Schedule a one-time event (threadsafe variant)
572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The function event_base_once() is similar to event_set().  However, it
574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  schedules a callback to be called exactly once and does not require the
575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  caller to prepare an event structure.
576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param base an event_base returned by event_init()
578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param fd a file descriptor to monitor
579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param events event(s) to monitor; can be any of EV_TIMEOUT | EV_READ |
580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         EV_WRITE
581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param callback callback function to be invoked when the event occurs
582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param arg an argument to be passed to the callback function
583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param timeout the maximum amount of time to wait for the event, or NULL
584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         to wait forever
585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_once()
587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_base_once(struct event_base *base, int fd, short events,
589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    void (*callback)(int, short, void *), void *arg,
590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const struct timeval *timeout);
591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Add an event to the set of monitored events.
595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The function event_add() schedules the execution of the ev event when the
597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event specified in event_set() occurs or in at least the time specified in
598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  the tv.  If tv is NULL, no timeout occurs and the function will only be
599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  called if a matching event occurs on the file descriptor.  The event in the
600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ev argument must be already initialized by event_set() and may not be used
601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  in calls to event_set() until it has timed out or been removed with
602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event_del().  If the event in the ev argument already has a scheduled
603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  timeout, the old timeout will be replaced by the new one.
604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ev an event struct initialized via event_set()
606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param timeout the maximum amount of time to wait for the event, or NULL
607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         to wait forever
608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_del(), event_set()
610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  */
611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_add(struct event *ev, const struct timeval *timeout);
612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Remove an event from the set of monitored events.
616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The function event_del() will cancel the event in the argument ev.  If the
618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event has already executed or has never been added the call will have no
619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  effect.
620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ev an event struct to be removed from the working set
622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_add()
624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_del(struct event *);
626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid event_active(struct event *, int, short);
628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Checks if a specific event is pending or scheduled.
632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ev an event struct previously passed to event_add()
634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param event the requested event type; any of EV_TIMEOUT|EV_READ|
635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         EV_WRITE|EV_SIGNAL
636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param tv an alternate timeout (FIXME - is this true?)
637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 1 if the event is pending, or 0 if the event has not occurred
639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint event_pending(struct event *ev, short event, struct timeval *tv);
642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Test if an event structure has been initialized.
646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The event_initialized() macro can be used to check if an event has been
648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  initialized.
649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ev an event structure to be tested
651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 1 if the structure has been initialized, or 0 if it has not been
652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          initialized
653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef WIN32
655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define event_initialized(ev)		((ev)->ev_flags & EVLIST_INIT && (ev)->ev_fd != (int)INVALID_HANDLE_VALUE)
656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else
657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define event_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Get the libevent version number.
663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return a string containing the version number of libevent
665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char *event_get_version(void);
667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Get the kernel event notification mechanism used by libevent.
671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return a string identifying the kernel event mechanism (kqueue, epoll, etc.)
673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char *event_get_method(void);
675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Set the number of different event priorities.
679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  By default libevent schedules all active events with the same priority.
681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  However, some time it is desirable to process some events with a higher
682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  priority than others.  For that reason, libevent supports strict priority
683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  queues.  Active events with a lower priority are always processed before
684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  events with a higher priority.
685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The number of different priorities can be set initially with the
687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  event_priority_init() function.  This function should be called before the
688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  first call to event_dispatch().  The event_priority_set() function can be
689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  used to assign a priority to an event.  By default, libevent assigns the
690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  middle priority to all events unless their priority is explicitly set.
691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param npriorities the maximum number of priorities
693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_base_priority_init(), event_priority_set()
695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint	event_priority_init(int);
698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Set the number of different event priorities (threadsafe variant).
702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  See the description of event_priority_init() for more information.
704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param eb the event_base structure returned by event_init()
706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param npriorities the maximum number of priorities
707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_priority_init(), event_priority_set()
709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint	event_base_priority_init(struct event_base *, int);
711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Assign a priority to an event.
715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ev an event struct
717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param priority the new priority to be assigned
718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see event_priority_init()
720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  */
721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint	event_priority_set(struct event *, int);
722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* These functions deal with buffering input and output */
725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct evbuffer {
727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	u_char *buffer;
728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	u_char *orig_buffer;
729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	size_t misalign;
731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	size_t totallen;
732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	size_t off;
733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	void (*cb)(struct evbuffer *, size_t, size_t, void *);
735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	void *cbarg;
736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/* Just for error reporting - use other constants otherwise */
739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVBUFFER_READ		0x01
740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVBUFFER_WRITE		0x02
741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVBUFFER_EOF		0x10
742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVBUFFER_ERROR		0x20
743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVBUFFER_TIMEOUT	0x40
744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct bufferevent;
746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef void (*evbuffercb)(struct bufferevent *, void *);
747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef void (*everrorcb)(struct bufferevent *, short what, void *);
748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct event_watermark {
750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	size_t low;
751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	size_t high;
752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef EVENT_NO_STRUCT
755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct bufferevent {
756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct event_base *ev_base;
757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct event ev_read;
759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct event ev_write;
760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct evbuffer *input;
762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct evbuffer *output;
763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct event_watermark wm_read;
765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	struct event_watermark wm_write;
766c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
767c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	evbuffercb readcb;
768c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	evbuffercb writecb;
769c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	everrorcb errorcb;
770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	void *cbarg;
771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	int timeout_read;	/* in seconds */
773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	int timeout_write;	/* in seconds */
774c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott	short enabled;	/* events that are currently enabled */
776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
779c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Create a new bufferevent.
781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  libevent provides an abstraction on top of the regular event callbacks.
783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  This abstraction is called a buffered event.  A buffered event provides
784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  input and output buffers that get filled and drained automatically.  The
785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  user of a buffered event no longer deals directly with the I/O, but
786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  instead is reading from input and writing to output buffers.
787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Once initialized, the bufferevent structure can be used repeatedly with
789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bufferevent_enable() and bufferevent_disable().
790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  When read enabled the bufferevent will try to read from the file descriptor
792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  and call the read callback.  The write callback is executed whenever the
793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  output buffer is drained below the write low watermark, which is 0 by
794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  default.
795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  If multiple bases are in use, bufferevent_base_set() must be called before
797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  enabling the bufferevent for the first time.
798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param fd the file descriptor from which data is read and written to.
800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  		This file descriptor is not allowed to be a pipe(2).
801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param readcb callback to invoke when there is data to be read, or NULL if
802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         no callback is desired
803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param writecb callback to invoke when the file descriptor is ready for
804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         writing, or NULL if no callback is desired
805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param errorcb callback to invoke when there is an error on the file
806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         descriptor
807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param cbarg an argument that will be supplied to each of the callbacks
808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         (readcb, writecb, and errorcb)
809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return a pointer to a newly allocated bufferevent struct, or NULL if an
810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          error occurred
811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see bufferevent_base_set(), bufferevent_free()
812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  */
813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct bufferevent *bufferevent_new(int fd,
814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg);
815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Assign a bufferevent to a specific event_base.
819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param base an event_base returned by event_init()
821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev a bufferevent struct returned by bufferevent_new()
822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see bufferevent_new()
824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint bufferevent_base_set(struct event_base *base, struct bufferevent *bufev);
826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Assign a priority to a bufferevent.
830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev a bufferevent struct
832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param pri the priority to be assigned
833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  */
835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint bufferevent_priority_set(struct bufferevent *bufev, int pri);
836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Deallocate the storage associated with a bufferevent structure.
840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev the bufferevent structure to be freed.
842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  */
843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid bufferevent_free(struct bufferevent *bufev);
844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Changes the callbacks for a bufferevent.
848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev the bufferevent object for which to change callbacks
850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param readcb callback to invoke when there is data to be read, or NULL if
851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         no callback is desired
852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param writecb callback to invoke when the file descriptor is ready for
853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         writing, or NULL if no callback is desired
854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param errorcb callback to invoke when there is an error on the file
855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         descriptor
856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param cbarg an argument that will be supplied to each of the callbacks
857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         (readcb, writecb, and errorcb)
858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see bufferevent_new()
859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  */
860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid bufferevent_setcb(struct bufferevent *bufev,
861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg);
862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Changes the file descriptor on which the bufferevent operates.
865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev the bufferevent object for which to change the file descriptor
867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param fd the file descriptor to operate on
868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott*/
869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid bufferevent_setfd(struct bufferevent *bufev, int fd);
870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Write data to a bufferevent buffer.
873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The bufferevent_write() function can be used to write data to the file
875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  descriptor.  The data is appended to the output buffer and written to the
876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  descriptor automatically as it becomes available for writing.
877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev the bufferevent to be written to
879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param data a pointer to the data to be written
880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param size the length of the data, in bytes
881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see bufferevent_write_buffer()
883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  */
884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint bufferevent_write(struct bufferevent *bufev,
885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const void *data, size_t size);
886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
888c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Write data from an evbuffer to a bufferevent buffer.  The evbuffer is
890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  being drained as a result.
891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev the bufferevent to be written to
893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buf the evbuffer to be written
894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see bufferevent_write()
896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf);
898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Read data from a bufferevent buffer.
902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The bufferevent_read() function is used to read data from the input buffer.
904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev the bufferevent to be read from
906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param data pointer to a buffer that will store the data
907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param size the size of the data buffer, in bytes
908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return the amount of data read, in bytes.
909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsize_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);
911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Enable a bufferevent.
914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev the bufferevent to be enabled
916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param event any combination of EV_READ | EV_WRITE.
917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see bufferevent_disable()
919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint bufferevent_enable(struct bufferevent *bufev, short event);
921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Disable a bufferevent.
925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev the bufferevent to be disabled
927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param event any combination of EV_READ | EV_WRITE.
928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see bufferevent_enable()
930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint bufferevent_disable(struct bufferevent *bufev, short event);
932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
935c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Set the read and write timeout for a buffered event.
936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev the bufferevent to be modified
938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param timeout_read the read timeout
939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param timeout_write the write timeout
940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid bufferevent_settimeout(struct bufferevent *bufev,
942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int timeout_read, int timeout_write);
943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Sets the watermarks for read and write events.
947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  On input, a bufferevent does not invoke the user read callback unless
949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  there is at least low watermark data in the buffer.   If the read buffer
950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  is beyond the high watermark, the buffevent stops reading from the network.
951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  On output, the user write callback is invoked whenever the buffered data
953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  falls below the low watermark.
954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param bufev the bufferevent to be modified
956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param events EV_READ, EV_WRITE or both
957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param lowmark the lower watermark to set
958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param highmark the high watermark to set
959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott*/
960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
961c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid bufferevent_setwatermark(struct bufferevent *bufev, short events,
962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    size_t lowmark, size_t highmark);
963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVBUFFER_LENGTH(x)	(x)->off
965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVBUFFER_DATA(x)	(x)->buffer
966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVBUFFER_INPUT(x)	(x)->input
967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define EVBUFFER_OUTPUT(x)	(x)->output
968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Allocate storage for a new evbuffer.
972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return a pointer to a newly allocated evbuffer struct, or NULL if an error
974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          occurred
975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct evbuffer *evbuffer_new(void);
977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Deallocate storage for an evbuffer.
981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param pointer to the evbuffer to be freed
983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evbuffer_free(struct evbuffer *);
985c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Expands the available space in an event buffer.
989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Expands the available space in the event buffer to at least datlen
991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buf the event buffer to be expanded
993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param datlen the new minimum length requirement
994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott*/
996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evbuffer_expand(struct evbuffer *, size_t);
997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Append data to the end of an evbuffer.
1001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buf the event buffer to be appended to
1003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param data pointer to the beginning of the data buffer
1004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param datlen the number of bytes to be copied from the data buffer
1005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evbuffer_add(struct evbuffer *, const void *, size_t);
1007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Read data from an event buffer and drain the bytes read.
1012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buf the event buffer to be read from
1014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param data the destination buffer to store the result
1015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param datlen the maximum size of the destination buffer
1016c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return the number of bytes read
1017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evbuffer_remove(struct evbuffer *, void *, size_t);
1019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Read a single line from an event buffer.
1023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
1024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Reads a line terminated by either '\r\n', '\n\r' or '\r' or '\n'.
1025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The returned buffer needs to be freed by the caller.
1026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
1027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param buffer the evbuffer to read from
1028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @return pointer to a single line, or NULL if an error occurred
1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottchar *evbuffer_readline(struct evbuffer *);
1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Move data from one evbuffer into another evbuffer.
1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  This is a destructive add.  The data from one buffer moves into
1037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  the other buffer. The destination buffer is expanded as needed.
1038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param outbuf the output buffer
1040c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param inbuf the input buffer
1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return 0 if successful, or -1 if an error occurred
1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evbuffer_add_buffer(struct evbuffer *, struct evbuffer *);
1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Append a formatted string to the end of an evbuffer.
1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buf the evbuffer that will be appended to
1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param fmt a format string
1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ... arguments that will be passed to printf(3)
1052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return The number of bytes added if successful, or -1 if an error occurred.
1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evbuffer_add_printf(struct evbuffer *, const char *fmt, ...)
1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef __GNUC__
1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  __attribute__((format(printf, 2, 3)))
1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott;
1059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Append a va_list formatted string to the end of an evbuffer.
1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buf the evbuffer that will be appended to
1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param fmt a format string
1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param ap a varargs va_list argument array that will be passed to vprintf(3)
1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return The number of bytes added if successful, or -1 if an error occurred.
1068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evbuffer_add_vprintf(struct evbuffer *, const char *fmt, va_list ap);
1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Remove a specified number of bytes data from the beginning of an evbuffer.
1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buf the evbuffer to be drained
1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param len the number of bytes to drain from the beginning of the buffer
1077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evbuffer_drain(struct evbuffer *, size_t);
1079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Write the contents of an evbuffer to a file descriptor.
1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  The evbuffer will be drained after the bytes have been successfully written.
1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buffer the evbuffer to be written and drained
1087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param fd the file descriptor to be written to
1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return the number of bytes written, or -1 if an error occurred
1089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see evbuffer_read()
1090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evbuffer_write(struct evbuffer *, int);
1092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Read from a file descriptor and store the result in an evbuffer.
1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buf the evbuffer to store the result
1098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param fd the file descriptor to read from
1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param howmuch the number of bytes to be read
1100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return the number of bytes read, or -1 if an error occurred
1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @see evbuffer_write()
1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evbuffer_read(struct evbuffer *, int, int);
1104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Find a string within an evbuffer.
1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buffer the evbuffer to be searched
1110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param what the string to be searched for
1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param len the length of the search string
1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @return a pointer to the beginning of the search string, or NULL if the search failed.
1113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottu_char *evbuffer_find(struct evbuffer *, const u_char *, size_t);
1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Set a callback to invoke when the evbuffer is modified.
1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param buffer the evbuffer to be monitored
1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param cb the callback function to invoke when the evbuffer is modified
1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param cbarg an argument to be provided to the callback function
1122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evbuffer_setcb(struct evbuffer *, void (*)(struct evbuffer *, size_t, size_t, void *), void *);
1124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*
1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Marshaling tagged data - We assume that all tags are inserted in their
1127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * numeric order - so that unknown tags will always be higher than the
1128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * known ones - and we can just ignore the end of an event buffer.
1129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evtag_init(void);
1132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evtag_marshal(struct evbuffer *evbuf, ev_uint32_t tag, const void *data,
1134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ev_uint32_t len);
1135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/**
1137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Encode an integer and store it in an evbuffer.
1138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  We encode integer's by nibbles; the first nibble contains the number
1140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  of significant nibbles - 1;  this allows us to encode up to 64-bit
1141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  integers.  This function is byte-order independent.
1142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param evbuf evbuffer to store the encoded number
1144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  @param number a 32-bit integer
1145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
1146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid encode_int(struct evbuffer *evbuf, ev_uint32_t number);
1147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evtag_marshal_int(struct evbuffer *evbuf, ev_uint32_t tag,
1149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ev_uint32_t integer);
1150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evtag_marshal_string(struct evbuffer *buf, ev_uint32_t tag,
1152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char *string);
1153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid evtag_marshal_timeval(struct evbuffer *evbuf, ev_uint32_t tag,
1155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    struct timeval *tv);
1156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_unmarshal(struct evbuffer *src, ev_uint32_t *ptag,
1158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    struct evbuffer *dst);
1159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_peek(struct evbuffer *evbuf, ev_uint32_t *ptag);
1160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_peek_length(struct evbuffer *evbuf, ev_uint32_t *plength);
1161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_payload_length(struct evbuffer *evbuf, ev_uint32_t *plength);
1162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_consume(struct evbuffer *evbuf);
1163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_unmarshal_int(struct evbuffer *evbuf, ev_uint32_t need_tag,
1165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ev_uint32_t *pinteger);
1166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_unmarshal_fixed(struct evbuffer *src, ev_uint32_t need_tag,
1168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    void *data, size_t len);
1169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_unmarshal_string(struct evbuffer *evbuf, ev_uint32_t need_tag,
1171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    char **pstring);
1172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint evtag_unmarshal_timeval(struct evbuffer *evbuf, ev_uint32_t need_tag,
1174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    struct timeval *ptv);
1175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef __cplusplus
1177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
1179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* _EVENT_H_ */
1181