18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Event loop 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2002-2006, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This file defines an event loop interface that supports processing events 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * from registered timeouts (i.e., do something after N seconds), sockets 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * (e.g., a new packet available for reading), and signals. eloop.c is an 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * implementation of this interface using select() and sockets. This is 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * suitable for most UNIX/POSIX systems. When porting to other operating 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * systems, it may be necessary to replace that implementation with OS specific 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * mechanisms. 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef ELOOP_H 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ELOOP_H 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * ELOOP_ALL_CTX - eloop_cancel_timeout() magic number to match all timeouts 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ELOOP_ALL_CTX (void *) -1 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_event_type - eloop socket event type for eloop_register_sock() 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @EVENT_TYPE_READ: Socket has data available for reading 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @EVENT_TYPE_WRITE: Socket has room for new data to be written 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @EVENT_TYPE_EXCEPTION: An exception has been reported 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef enum { 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EVENT_TYPE_READ = 0, 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EVENT_TYPE_WRITE, 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EVENT_TYPE_EXCEPTION 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} eloop_event_type; 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_sock_handler - eloop socket event callback type 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_ctx: Registered callback context data (eloop_data) 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock_ctx: Registered callback context data (user_data) 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef void (*eloop_sock_handler)(int sock, void *eloop_ctx, void *sock_ctx); 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_event_handler - eloop generic event callback type 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_ctx: Registered callback context data (eloop_data) 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock_ctx: Registered callback context data (user_data) 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef void (*eloop_event_handler)(void *eloop_data, void *user_ctx); 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_timeout_handler - eloop timeout event callback type 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_ctx: Registered callback context data (eloop_data) 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock_ctx: Registered callback context data (user_data) 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef void (*eloop_timeout_handler)(void *eloop_data, void *user_ctx); 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_signal_handler - eloop signal event callback type 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sig: Signal number 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @signal_ctx: Registered callback context data (user_data from 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_signal(), eloop_register_signal_terminate(), or 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_signal_reconfig() call) 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttypedef void (*eloop_signal_handler)(int sig, void *signal_ctx); 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_init() - Initialize global event loop data 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function must be called before any other eloop_* function. 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_init(void); 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_read_sock - Register handler for read events 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when data is available for reading 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Callback context data (eloop_ctx) 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (sock_ctx) 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register a read socket notifier for the given file descriptor. The handler 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * function will be called whenever data is available for reading from the 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * socket. The handler function is responsible for clearing the event after 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * having processed it in order to avoid eloop from calling the handler again 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * for the same event. 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_read_sock(int sock, eloop_sock_handler handler, 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *eloop_data, void *user_data); 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_unregister_read_sock - Unregister handler for read events 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Unregister a read socket notifier that was previously registered with 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_read_sock(). 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_unregister_read_sock(int sock); 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_sock - Register handler for socket events 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: Type of event to wait for 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when the event is triggered 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Callback context data (eloop_ctx) 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (sock_ctx) 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register an event notifier for the given socket's file descriptor. The 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * handler function will be called whenever the that event is triggered for the 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * socket. The handler function is responsible for clearing the event after 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * having processed it in order to avoid eloop from calling the handler again 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * for the same event. 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_sock(int sock, eloop_event_type type, 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_sock_handler handler, 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *eloop_data, void *user_data); 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_unregister_sock - Unregister handler for socket events 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @type: Type of event for which sock was registered 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Unregister a socket event notifier that was previously registered with 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_sock(). 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_unregister_sock(int sock, eloop_event_type type); 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_event - Register handler for generic events 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @event: Event to wait (eloop implementation specific) 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @event_size: Size of event data 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when event is triggered 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Callback context data (eloop_data) 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (user_data) 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register an event handler for the given event. This function is used to 1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * register eloop implementation specific events which are mainly targeted for 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * operating system specific code (driver interface and l2_packet) since the 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * portable code will not be able to use such an OS-specific call. The handler 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * function will be called whenever the event is triggered. The handler 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * function is responsible for clearing the event after having processed it in 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * order to avoid eloop from calling the handler again for the same event. 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * In case of Windows implementation (eloop_win.c), event pointer is of HANDLE 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * type, i.e., void*. The callers are likely to have 'HANDLE h' type variable, 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * and they would call this function with eloop_register_event(h, sizeof(h), 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * ...). 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_event(void *event, size_t event_size, 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_event_handler handler, 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *eloop_data, void *user_data); 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_unregister_event - Unregister handler for a generic event 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @event: Event to cancel (eloop implementation specific) 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @event_size: Size of event data 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Unregister a generic event notifier that was previously registered with 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_event(). 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_unregister_event(void *event, size_t event_size); 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_timeout - Register timeout 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @secs: Number of seconds to the timeout 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @usecs: Number of microseconds to the timeout 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when timeout occurs 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Callback context data (eloop_ctx) 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (sock_ctx) 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register a timeout that will cause the handler function to be called after 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * given time. 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_timeout(unsigned int secs, unsigned int usecs, 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_timeout_handler handler, 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *eloop_data, void *user_data); 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_cancel_timeout - Cancel timeouts 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Matching callback function 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Matching eloop_data or %ELOOP_ALL_CTX to match all 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Matching user_data or %ELOOP_ALL_CTX to match all 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: Number of cancelled timeouts 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Cancel matching <handler,eloop_data,user_data> timeouts registered with 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_timeout(). ELOOP_ALL_CTX can be used as a wildcard for 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * cancelling all timeouts regardless of eloop_data/user_data. 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_cancel_timeout(eloop_timeout_handler handler, 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *eloop_data, void *user_data); 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_is_timeout_registered - Check if a timeout is already registered 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Matching callback function 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @eloop_data: Matching eloop_data 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Matching user_data 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 1 if the timeout is registered, 0 if the timeout is not registered 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Determine if a matching <handler,eloop_data,user_data> timeout is registered 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * with eloop_register_timeout(). 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_is_timeout_registered(eloop_timeout_handler handler, 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *eloop_data, void *user_data); 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_signal - Register handler for signals 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sig: Signal number (e.g., SIGHUP) 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when the signal is received 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (signal_ctx) 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register a callback function that will be called when a signal is received. 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * The callback function is actually called only after the system signal 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * handler has returned. This means that the normal limits for sighandlers 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * (i.e., only "safe functions" allowed) do not apply for the registered 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * callback. 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_signal(int sig, eloop_signal_handler handler, 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *user_data); 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_signal_terminate - Register handler for terminate signals 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when the signal is received 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (signal_ctx) 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register a callback function that will be called when a process termination 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * signal is received. The callback function is actually called only after the 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * system signal handler has returned. This means that the normal limits for 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * sighandlers (i.e., only "safe functions" allowed) do not apply for the 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * registered callback. 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is a more portable version of eloop_register_signal() since 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the knowledge of exact details of the signals is hidden in eloop 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * implementation. In case of operating systems using signal(), this function 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * registers handlers for SIGINT and SIGTERM. 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_signal_terminate(eloop_signal_handler handler, 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *user_data); 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_register_signal_reconfig - Register handler for reconfig signals 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @handler: Callback function to be called when the signal is received 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @user_data: Callback context data (signal_ctx) 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 0 on success, -1 on failure 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Register a callback function that will be called when a reconfiguration / 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * hangup signal is received. The callback function is actually called only 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * after the system signal handler has returned. This means that the normal 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * limits for sighandlers (i.e., only "safe functions" allowed) do not apply 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * for the registered callback. 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function is a more portable version of eloop_register_signal() since 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the knowledge of exact details of the signals is hidden in eloop 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * implementation. In case of operating systems using signal(), this function 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * registers a handler for SIGHUP. 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_register_signal_reconfig(eloop_signal_handler handler, 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *user_data); 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_run - Start the event loop 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Start the event loop and continue running as long as there are any 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * registered event handlers. This function is run after event loop has been 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * initialized with event_init() and one or more events have been registered. 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_run(void); 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_terminate - Terminate event loop 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Terminate event loop even if there are registered events. This can be used 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * to request the program to be terminated cleanly. 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_terminate(void); 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_destroy - Free any resources allocated for the event loop 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * After calling eloop_destroy(), other eloop_* functions must not be called 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * before re-running eloop_init(). 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_destroy(void); 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_terminated - Check whether event loop has been terminated 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Returns: 1 = event loop terminate, 0 = event loop still running 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This function can be used to check whether eloop_terminate() has been called 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * to request termination of the event loop. This is normally used to abort 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * operations that may still be queued to be run when eloop_terminate() was 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * called. 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint eloop_terminated(void); 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/** 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * eloop_wait_for_read_sock - Wait for a single reader 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * @sock: File descriptor number for the socket 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Do a blocking wait for a single read socket. 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid eloop_wait_for_read_sock(int sock); 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ELOOP_H */ 311