1.\" $OpenBSD: event.3,v 1.4 2002/07/12 18:50:48 provos Exp $ 2.\" 3.\" Copyright (c) 2000 Artur Grabowski <art@openbsd.org> 4.\" All rights reserved. 5.\" 6.\" Redistribution and use in source and binary forms, with or without 7.\" modification, are permitted provided that the following conditions 8.\" are met: 9.\" 10.\" 1. Redistributions of source code must retain the above copyright 11.\" notice, this list of conditions and the following disclaimer. 12.\" 2. Redistributions in binary form must reproduce the above copyright 13.\" notice, this list of conditions and the following disclaimer in the 14.\" documentation and/or other materials provided with the distribution. 15.\" 3. The name of the author may not be used to endorse or promote products 16.\" derived from this software without specific prior written permission. 17.\" 18.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 19.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 20.\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 21.\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 22.\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 23.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 24.\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 27.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28.\" 29.Dd August 8, 2000 30.Dt EVENT 3 31.Os 32.Sh NAME 33.Nm event_init , 34.Nm event_dispatch , 35.Nm event_loop , 36.Nm event_loopexit , 37.Nm event_loopbreak , 38.Nm event_set , 39.Nm event_base_dispatch , 40.Nm event_base_loop , 41.Nm event_base_loopexit , 42.Nm event_base_loopbreak , 43.Nm event_base_set , 44.Nm event_base_free , 45.Nm event_add , 46.Nm event_del , 47.Nm event_once , 48.Nm event_base_once , 49.Nm event_pending , 50.Nm event_initialized , 51.Nm event_priority_init , 52.Nm event_priority_set , 53.Nm evtimer_set , 54.Nm evtimer_add , 55.Nm evtimer_del , 56.Nm evtimer_pending , 57.Nm evtimer_initialized , 58.Nm signal_set , 59.Nm signal_add , 60.Nm signal_del , 61.Nm signal_pending , 62.Nm signal_initialized , 63.Nm bufferevent_new , 64.Nm bufferevent_free , 65.Nm bufferevent_write , 66.Nm bufferevent_write_buffer , 67.Nm bufferevent_read , 68.Nm bufferevent_enable , 69.Nm bufferevent_disable , 70.Nm bufferevent_settimeout , 71.Nm bufferevent_base_set , 72.Nm evbuffer_new , 73.Nm evbuffer_free , 74.Nm evbuffer_add , 75.Nm evbuffer_add_buffer , 76.Nm evbuffer_add_printf , 77.Nm evbuffer_add_vprintf , 78.Nm evbuffer_drain , 79.Nm evbuffer_write , 80.Nm evbuffer_read , 81.Nm evbuffer_find , 82.Nm evbuffer_readline , 83.Nm evhttp_new , 84.Nm evhttp_bind_socket , 85.Nm evhttp_free 86.Nd execute a function when a specific event occurs 87.Sh SYNOPSIS 88.Fd #include <sys/time.h> 89.Fd #include <event.h> 90.Ft "struct event_base *" 91.Fn "event_init" "void" 92.Ft int 93.Fn "event_dispatch" "void" 94.Ft int 95.Fn "event_loop" "int flags" 96.Ft int 97.Fn "event_loopexit" "struct timeval *tv" 98.Ft int 99.Fn "event_loopbreak" "void" 100.Ft void 101.Fn "event_set" "struct event *ev" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg" 102.Ft int 103.Fn "event_base_dispatch" "struct event_base *base" 104.Ft int 105.Fn "event_base_loop" "struct event_base *base" "int flags" 106.Ft int 107.Fn "event_base_loopexit" "struct event_base *base" "struct timeval *tv" 108.Ft int 109.Fn "event_base_loopbreak" "struct event_base *base" 110.Ft int 111.Fn "event_base_set" "struct event_base *base" "struct event *" 112.Ft void 113.Fn "event_base_free" "struct event_base *base" 114.Ft int 115.Fn "event_add" "struct event *ev" "struct timeval *tv" 116.Ft int 117.Fn "event_del" "struct event *ev" 118.Ft int 119.Fn "event_once" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg" "struct timeval *tv" 120.Ft int 121.Fn "event_base_once" "struct event_base *base" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg" "struct timeval *tv" 122.Ft int 123.Fn "event_pending" "struct event *ev" "short event" "struct timeval *tv" 124.Ft int 125.Fn "event_initialized" "struct event *ev" 126.Ft int 127.Fn "event_priority_init" "int npriorities" 128.Ft int 129.Fn "event_priority_set" "struct event *ev" "int priority" 130.Ft void 131.Fn "evtimer_set" "struct event *ev" "void (*fn)(int, short, void *)" "void *arg" 132.Ft void 133.Fn "evtimer_add" "struct event *ev" "struct timeval *" 134.Ft void 135.Fn "evtimer_del" "struct event *ev" 136.Ft int 137.Fn "evtimer_pending" "struct event *ev" "struct timeval *tv" 138.Ft int 139.Fn "evtimer_initialized" "struct event *ev" 140.Ft void 141.Fn "signal_set" "struct event *ev" "int signal" "void (*fn)(int, short, void *)" "void *arg" 142.Ft void 143.Fn "signal_add" "struct event *ev" "struct timeval *" 144.Ft void 145.Fn "signal_del" "struct event *ev" 146.Ft int 147.Fn "signal_pending" "struct event *ev" "struct timeval *tv" 148.Ft int 149.Fn "signal_initialized" "struct event *ev" 150.Ft "struct bufferevent *" 151.Fn "bufferevent_new" "int fd" "evbuffercb readcb" "evbuffercb writecb" "everrorcb" "void *cbarg" 152.Ft void 153.Fn "bufferevent_free" "struct bufferevent *bufev" 154.Ft int 155.Fn "bufferevent_write" "struct bufferevent *bufev" "void *data" "size_t size" 156.Ft int 157.Fn "bufferevent_write_buffer" "struct bufferevent *bufev" "struct evbuffer *buf" 158.Ft size_t 159.Fn "bufferevent_read" "struct bufferevent *bufev" "void *data" "size_t size" 160.Ft int 161.Fn "bufferevent_enable" "struct bufferevent *bufev" "short event" 162.Ft int 163.Fn "bufferevent_disable" "struct bufferevent *bufev" "short event" 164.Ft void 165.Fn "bufferevent_settimeout" "struct bufferevent *bufev" "int timeout_read" "int timeout_write" 166.Ft int 167.Fn "bufferevent_base_set" "struct event_base *base" "struct bufferevent *bufev" 168.Ft "struct evbuffer *" 169.Fn "evbuffer_new" "void" 170.Ft void 171.Fn "evbuffer_free" "struct evbuffer *buf" 172.Ft int 173.Fn "evbuffer_add" "struct evbuffer *buf" "const void *data" "size_t size" 174.Ft int 175.Fn "evbuffer_add_buffer" "struct evbuffer *dst" "struct evbuffer *src" 176.Ft int 177.Fn "evbuffer_add_printf" "struct evbuffer *buf" "const char *fmt" "..." 178.Ft int 179.Fn "evbuffer_add_vprintf" "struct evbuffer *buf" "const char *fmt" "va_list ap" 180.Ft void 181.Fn "evbuffer_drain" "struct evbuffer *buf" "size_t size" 182.Ft int 183.Fn "evbuffer_write" "struct evbuffer *buf" "int fd" 184.Ft int 185.Fn "evbuffer_read" "struct evbuffer *buf" "int fd" "int size" 186.Ft "u_char *" 187.Fn "evbuffer_find" "struct evbuffer *buf" "const u_char *data" "size_t size" 188.Ft "char *" 189.Fn "evbuffer_readline" "struct evbuffer *buf" 190.Ft "struct evhttp *" 191.Fn "evhttp_new" "struct event_base *base" 192.Ft int 193.Fn "evhttp_bind_socket" "struct evhttp *http" "const char *address" "u_short port" 194.Ft "void" 195.Fn "evhttp_free" "struct evhttp *http" 196.Ft int 197.Fa (*event_sigcb)(void) ; 198.Ft volatile sig_atomic_t 199.Fa event_gotsig ; 200.Sh DESCRIPTION 201The 202.Nm event 203API provides a mechanism to execute a function when a specific event 204on a file descriptor occurs or after a given time has passed. 205.Pp 206The 207.Nm event 208API needs to be initialized with 209.Fn event_init 210before it can be used. 211.Pp 212In order to process events, an application needs to call 213.Fn event_dispatch . 214This function only returns on error, and should replace the event core 215of the application program. 216.Pp 217The function 218.Fn event_set 219prepares the event structure 220.Fa ev 221to be used in future calls to 222.Fn event_add 223and 224.Fn event_del . 225The event will be prepared to call the function specified by the 226.Fa fn 227argument with an 228.Fa int 229argument indicating the file descriptor, a 230.Fa short 231argument indicating the type of event, and a 232.Fa void * 233argument given in the 234.Fa arg 235argument. 236The 237.Fa fd 238indicates the file descriptor that should be monitored for events. 239The events can be either 240.Va EV_READ , 241.Va EV_WRITE , 242or both, 243indicating that an application can read or write from the file descriptor 244respectively without blocking. 245.Pp 246The function 247.Fa fn 248will be called with the file descriptor that triggered the event and 249the type of event which will be either 250.Va EV_TIMEOUT , 251.Va EV_SIGNAL , 252.Va EV_READ , 253or 254.Va EV_WRITE . 255Additionally, an event which has registered interest in more than one of the 256preceeding events, via bitwise-OR to 257.Fn event_set , 258can provide its callback function with a bitwise-OR of more than one triggered 259event. 260The additional flag 261.Va EV_PERSIST 262makes an 263.Fn event_add 264persistent until 265.Fn event_del 266has been called. 267.Pp 268Once initialized, the 269.Fa ev 270structure can be used repeatedly with 271.Fn event_add 272and 273.Fn event_del 274and does not need to be reinitialized unless the function called and/or 275the argument to it are to be changed. 276However, when an 277.Fa ev 278structure has been added to libevent using 279.Fn event_add 280the structure must persist until the event occurs (assuming 281.Fa EV_PERSIST 282is not set) or is removed 283using 284.Fn event_del . 285You may not reuse the same 286.Fa ev 287structure for multiple monitored descriptors; each descriptor 288needs its own 289.Fa ev . 290.Pp 291The function 292.Fn event_add 293schedules the execution of the 294.Fa ev 295event when the event specified in 296.Fn event_set 297occurs or in at least the time specified in the 298.Fa tv . 299If 300.Fa tv 301is 302.Dv NULL , 303no timeout occurs and the function will only be called 304if a matching event occurs on the file descriptor. 305The event in the 306.Fa ev 307argument must be already initialized by 308.Fn event_set 309and may not be used in calls to 310.Fn event_set 311until it has timed out or been removed with 312.Fn event_del . 313If the event in the 314.Fa ev 315argument already has a scheduled timeout, the old timeout will be 316replaced by the new one. 317.Pp 318The function 319.Fn event_del 320will cancel the event in the argument 321.Fa ev . 322If the event has already executed or has never been added 323the call will have no effect. 324.Pp 325The functions 326.Fn evtimer_set , 327.Fn evtimer_add , 328.Fn evtimer_del , 329.Fn evtimer_initialized , 330and 331.Fn evtimer_pending 332are abbreviations for common situations where only a timeout is required. 333The file descriptor passed will be \-1, and the event type will be 334.Va EV_TIMEOUT . 335.Pp 336The functions 337.Fn signal_set , 338.Fn signal_add , 339.Fn signal_del , 340.Fn signal_initialized , 341and 342.Fn signal_pending 343are abbreviations. 344The event type will be a persistent 345.Va EV_SIGNAL . 346That means 347.Fn signal_set 348adds 349.Va EV_PERSIST . 350.Pp 351In order to avoid races in signal handlers, the 352.Nm event 353API provides two variables: 354.Va event_sigcb 355and 356.Va event_gotsig . 357A signal handler 358sets 359.Va event_gotsig 360to indicate that a signal has been received. 361The application sets 362.Va event_sigcb 363to a callback function. 364After the signal handler sets 365.Va event_gotsig , 366.Nm event_dispatch 367will execute the callback function to process received signals. 368The callback returns 1 when no events are registered any more. 369It can return \-1 to indicate an error to the 370.Nm event 371library, causing 372.Fn event_dispatch 373to terminate with 374.Va errno 375set to 376.Er EINTR . 377.Pp 378The function 379.Fn event_once 380is similar to 381.Fn event_set . 382However, it schedules a callback to be called exactly once and does not 383require the caller to prepare an 384.Fa event 385structure. 386This function supports 387.Fa EV_TIMEOUT , 388.Fa EV_READ , 389and 390.Fa EV_WRITE . 391.Pp 392The 393.Fn event_pending 394function can be used to check if the event specified by 395.Fa event 396is pending to run. 397If 398.Va EV_TIMEOUT 399was specified and 400.Fa tv 401is not 402.Dv NULL , 403the expiration time of the event will be returned in 404.Fa tv . 405.Pp 406The 407.Fn event_initialized 408macro can be used to check if an event has been initialized. 409.Pp 410The 411.Nm event_loop 412function provides an interface for single pass execution of pending 413events. 414The flags 415.Va EVLOOP_ONCE 416and 417.Va EVLOOP_NONBLOCK 418are recognized. 419The 420.Nm event_loopexit 421function exits from the event loop. The next 422.Fn event_loop 423iteration after the 424given timer expires will complete normally (handling all queued events) then 425exit without blocking for events again. Subsequent invocations of 426.Fn event_loop 427will proceed normally. 428The 429.Nm event_loopbreak 430function exits from the event loop immediately. 431.Fn event_loop 432will abort after the next event is completed; 433.Fn event_loopbreak 434is typically invoked from this event's callback. This behavior is analogous 435to the "break;" statement. Subsequent invocations of 436.Fn event_loop 437will proceed normally. 438.Pp 439It is the responsibility of the caller to provide these functions with 440pre-allocated event structures. 441.Pp 442.Sh EVENT PRIORITIES 443By default 444.Nm libevent 445schedules all active events with the same priority. 446However, sometimes it is desirable to process some events with a higher 447priority than others. 448For that reason, 449.Nm libevent 450supports strict priority queues. 451Active events with a lower priority are always processed before events 452with a higher priority. 453.Pp 454The number of different priorities can be set initially with the 455.Fn event_priority_init 456function. 457This function should be called before the first call to 458.Fn event_dispatch . 459The 460.Fn event_priority_set 461function can be used to assign a priority to an event. 462By default, 463.Nm libevent 464assigns the middle priority to all events unless their priority 465is explicitly set. 466.Sh THREAD SAFE EVENTS 467.Nm Libevent 468has experimental support for thread-safe events. 469When initializing the library via 470.Fn event_init , 471an event base is returned. 472This event base can be used in conjunction with calls to 473.Fn event_base_set , 474.Fn event_base_dispatch , 475.Fn event_base_loop , 476.Fn event_base_loopexit , 477.Fn bufferevent_base_set 478and 479.Fn event_base_free . 480.Fn event_base_set 481should be called after preparing an event with 482.Fn event_set , 483as 484.Fn event_set 485assigns the provided event to the most recently created event base. 486.Fn bufferevent_base_set 487should be called after preparing a bufferevent with 488.Fn bufferevent_new . 489.Fn event_base_free 490should be used to free memory associated with the event base 491when it is no longer needed. 492.Sh BUFFERED EVENTS 493.Nm libevent 494provides an abstraction on top of the regular event callbacks. 495This abstraction is called a 496.Va "buffered event" . 497A buffered event provides input and output buffers that get filled 498and drained automatically. 499The user of a buffered event no longer deals directly with the IO, 500but instead is reading from input and writing to output buffers. 501.Pp 502A new bufferevent is created by 503.Fn bufferevent_new . 504The parameter 505.Fa fd 506specifies the file descriptor from which data is read and written to. 507This file descriptor is not allowed to be a 508.Xr pipe 2 . 509The next three parameters are callbacks. 510The read and write callback have the following form: 511.Ft void 512.Fn "(*cb)" "struct bufferevent *bufev" "void *arg" . 513The error callback has the following form: 514.Ft void 515.Fn "(*cb)" "struct bufferevent *bufev" "short what" "void *arg" . 516The argument is specified by the fourth parameter 517.Fa "cbarg" . 518A 519.Fa bufferevent struct 520pointer is returned on success, NULL on error. 521Both the read and the write callback may be NULL. 522The error callback has to be always provided. 523.Pp 524Once initialized, the bufferevent structure can be used repeatedly with 525bufferevent_enable() and bufferevent_disable(). 526The flags parameter can be a combination of 527.Va EV_READ 528and 529.Va EV_WRITE . 530When read enabled the bufferevent will try to read from the file 531descriptor and call the read callback. 532The write callback is executed 533whenever the output buffer is drained below the write low watermark, 534which is 535.Va 0 536by default. 537.Pp 538The 539.Fn bufferevent_write 540function can be used to write data to the file descriptor. 541The data is appended to the output buffer and written to the descriptor 542automatically as it becomes available for writing. 543.Fn bufferevent_write 544returns 0 on success or \-1 on failure. 545The 546.Fn bufferevent_read 547function is used to read data from the input buffer, 548returning the amount of data read. 549.Pp 550If multiple bases are in use, bufferevent_base_set() must be called before 551enabling the bufferevent for the first time. 552.Sh NON-BLOCKING HTTP SUPPORT 553.Nm libevent 554provides a very thin HTTP layer that can be used both to host an HTTP 555server and also to make HTTP requests. 556An HTTP server can be created by calling 557.Fn evhttp_new . 558It can be bound to any port and address with the 559.Fn evhttp_bind_socket 560function. 561When the HTTP server is no longer used, it can be freed via 562.Fn evhttp_free . 563.Pp 564To be notified of HTTP requests, a user needs to register callbacks with the 565HTTP server. 566This can be done by calling 567.Fn evhttp_set_cb . 568The second argument is the URI for which a callback is being registered. 569The corresponding callback will receive an 570.Va struct evhttp_request 571object that contains all information about the request. 572.Pp 573This section does not document all the possible function calls; please 574check 575.Va event.h 576for the public interfaces. 577.Sh ADDITIONAL NOTES 578It is possible to disable support for 579.Va epoll , kqueue , devpoll , poll 580or 581.Va select 582by setting the environment variable 583.Va EVENT_NOEPOLL , EVENT_NOKQUEUE , EVENT_NODEVPOLL , EVENT_NOPOLL 584or 585.Va EVENT_NOSELECT , 586respectively. 587By setting the environment variable 588.Va EVENT_SHOW_METHOD , 589.Nm libevent 590displays the kernel notification method that it uses. 591.Sh RETURN VALUES 592Upon successful completion 593.Fn event_add 594and 595.Fn event_del 596return 0. 597Otherwise, \-1 is returned and the global variable errno is 598set to indicate the error. 599.Sh SEE ALSO 600.Xr kqueue 2 , 601.Xr poll 2 , 602.Xr select 2 , 603.Xr evdns 3 , 604.Xr timeout 9 605.Sh HISTORY 606The 607.Nm event 608API manpage is based on the 609.Xr timeout 9 610manpage by Artur Grabowski. 611The port of 612.Nm libevent 613to Windows is due to Michael A. Davis. 614Support for real-time signals is due to Taral. 615.Sh AUTHORS 616The 617.Nm event 618library was written by Niels Provos. 619.Sh BUGS 620This documentation is neither complete nor authoritative. 621If you are in doubt about the usage of this API then 622check the source code to find out how it works, write 623up the missing piece of documentation and send it to 624me for inclusion in this man page. 625