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