Annotation of embedaddon/libevent/event.h, revision 1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>