16d49e1aeSJan Lentfer /* 26d49e1aeSJan Lentfer * Event loop 36d49e1aeSJan Lentfer * Copyright (c) 2002-2006, Jouni Malinen <j@w1.fi> 46d49e1aeSJan Lentfer * 53ff40c12SJohn Marino * This software may be distributed under the terms of the BSD license. 63ff40c12SJohn Marino * See README for more details. 76d49e1aeSJan Lentfer * 86d49e1aeSJan Lentfer * This file defines an event loop interface that supports processing events 96d49e1aeSJan Lentfer * from registered timeouts (i.e., do something after N seconds), sockets 106d49e1aeSJan Lentfer * (e.g., a new packet available for reading), and signals. eloop.c is an 116d49e1aeSJan Lentfer * implementation of this interface using select() and sockets. This is 126d49e1aeSJan Lentfer * suitable for most UNIX/POSIX systems. When porting to other operating 136d49e1aeSJan Lentfer * systems, it may be necessary to replace that implementation with OS specific 146d49e1aeSJan Lentfer * mechanisms. 156d49e1aeSJan Lentfer */ 166d49e1aeSJan Lentfer 176d49e1aeSJan Lentfer #ifndef ELOOP_H 186d49e1aeSJan Lentfer #define ELOOP_H 196d49e1aeSJan Lentfer 206d49e1aeSJan Lentfer /** 216d49e1aeSJan Lentfer * ELOOP_ALL_CTX - eloop_cancel_timeout() magic number to match all timeouts 226d49e1aeSJan Lentfer */ 236d49e1aeSJan Lentfer #define ELOOP_ALL_CTX (void *) -1 246d49e1aeSJan Lentfer 256d49e1aeSJan Lentfer /** 266d49e1aeSJan Lentfer * eloop_event_type - eloop socket event type for eloop_register_sock() 276d49e1aeSJan Lentfer * @EVENT_TYPE_READ: Socket has data available for reading 286d49e1aeSJan Lentfer * @EVENT_TYPE_WRITE: Socket has room for new data to be written 296d49e1aeSJan Lentfer * @EVENT_TYPE_EXCEPTION: An exception has been reported 306d49e1aeSJan Lentfer */ 316d49e1aeSJan Lentfer typedef enum { 326d49e1aeSJan Lentfer EVENT_TYPE_READ = 0, 336d49e1aeSJan Lentfer EVENT_TYPE_WRITE, 346d49e1aeSJan Lentfer EVENT_TYPE_EXCEPTION 356d49e1aeSJan Lentfer } eloop_event_type; 366d49e1aeSJan Lentfer 376d49e1aeSJan Lentfer /** 386d49e1aeSJan Lentfer * eloop_sock_handler - eloop socket event callback type 396d49e1aeSJan Lentfer * @sock: File descriptor number for the socket 406d49e1aeSJan Lentfer * @eloop_ctx: Registered callback context data (eloop_data) 416d49e1aeSJan Lentfer * @sock_ctx: Registered callback context data (user_data) 426d49e1aeSJan Lentfer */ 436d49e1aeSJan Lentfer typedef void (*eloop_sock_handler)(int sock, void *eloop_ctx, void *sock_ctx); 446d49e1aeSJan Lentfer 456d49e1aeSJan Lentfer /** 466d49e1aeSJan Lentfer * eloop_event_handler - eloop generic event callback type 476d49e1aeSJan Lentfer * @eloop_ctx: Registered callback context data (eloop_data) 48*a1157835SDaniel Fojt * @user_ctx: Registered callback context data (user_data) 496d49e1aeSJan Lentfer */ 50*a1157835SDaniel Fojt typedef void (*eloop_event_handler)(void *eloop_ctx, void *user_ctx); 516d49e1aeSJan Lentfer 526d49e1aeSJan Lentfer /** 536d49e1aeSJan Lentfer * eloop_timeout_handler - eloop timeout event callback type 546d49e1aeSJan Lentfer * @eloop_ctx: Registered callback context data (eloop_data) 55*a1157835SDaniel Fojt * @user_ctx: Registered callback context data (user_data) 566d49e1aeSJan Lentfer */ 57*a1157835SDaniel Fojt typedef void (*eloop_timeout_handler)(void *eloop_ctx, void *user_ctx); 586d49e1aeSJan Lentfer 596d49e1aeSJan Lentfer /** 606d49e1aeSJan Lentfer * eloop_signal_handler - eloop signal event callback type 616d49e1aeSJan Lentfer * @sig: Signal number 626d49e1aeSJan Lentfer * @signal_ctx: Registered callback context data (user_data from 636d49e1aeSJan Lentfer * eloop_register_signal(), eloop_register_signal_terminate(), or 646d49e1aeSJan Lentfer * eloop_register_signal_reconfig() call) 656d49e1aeSJan Lentfer */ 663ff40c12SJohn Marino typedef void (*eloop_signal_handler)(int sig, void *signal_ctx); 676d49e1aeSJan Lentfer 686d49e1aeSJan Lentfer /** 696d49e1aeSJan Lentfer * eloop_init() - Initialize global event loop data 706d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 716d49e1aeSJan Lentfer * 723ff40c12SJohn Marino * This function must be called before any other eloop_* function. 736d49e1aeSJan Lentfer */ 743ff40c12SJohn Marino int eloop_init(void); 756d49e1aeSJan Lentfer 766d49e1aeSJan Lentfer /** 776d49e1aeSJan Lentfer * eloop_register_read_sock - Register handler for read events 786d49e1aeSJan Lentfer * @sock: File descriptor number for the socket 796d49e1aeSJan Lentfer * @handler: Callback function to be called when data is available for reading 806d49e1aeSJan Lentfer * @eloop_data: Callback context data (eloop_ctx) 816d49e1aeSJan Lentfer * @user_data: Callback context data (sock_ctx) 826d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 836d49e1aeSJan Lentfer * 846d49e1aeSJan Lentfer * Register a read socket notifier for the given file descriptor. The handler 856d49e1aeSJan Lentfer * function will be called whenever data is available for reading from the 866d49e1aeSJan Lentfer * socket. The handler function is responsible for clearing the event after 876d49e1aeSJan Lentfer * having processed it in order to avoid eloop from calling the handler again 886d49e1aeSJan Lentfer * for the same event. 896d49e1aeSJan Lentfer */ 906d49e1aeSJan Lentfer int eloop_register_read_sock(int sock, eloop_sock_handler handler, 916d49e1aeSJan Lentfer void *eloop_data, void *user_data); 926d49e1aeSJan Lentfer 936d49e1aeSJan Lentfer /** 946d49e1aeSJan Lentfer * eloop_unregister_read_sock - Unregister handler for read events 956d49e1aeSJan Lentfer * @sock: File descriptor number for the socket 966d49e1aeSJan Lentfer * 976d49e1aeSJan Lentfer * Unregister a read socket notifier that was previously registered with 986d49e1aeSJan Lentfer * eloop_register_read_sock(). 996d49e1aeSJan Lentfer */ 1006d49e1aeSJan Lentfer void eloop_unregister_read_sock(int sock); 1016d49e1aeSJan Lentfer 1026d49e1aeSJan Lentfer /** 1036d49e1aeSJan Lentfer * eloop_register_sock - Register handler for socket events 1046d49e1aeSJan Lentfer * @sock: File descriptor number for the socket 1056d49e1aeSJan Lentfer * @type: Type of event to wait for 1066d49e1aeSJan Lentfer * @handler: Callback function to be called when the event is triggered 1076d49e1aeSJan Lentfer * @eloop_data: Callback context data (eloop_ctx) 1086d49e1aeSJan Lentfer * @user_data: Callback context data (sock_ctx) 1096d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 1106d49e1aeSJan Lentfer * 1116d49e1aeSJan Lentfer * Register an event notifier for the given socket's file descriptor. The 1126d49e1aeSJan Lentfer * handler function will be called whenever the that event is triggered for the 1136d49e1aeSJan Lentfer * socket. The handler function is responsible for clearing the event after 1146d49e1aeSJan Lentfer * having processed it in order to avoid eloop from calling the handler again 1156d49e1aeSJan Lentfer * for the same event. 1166d49e1aeSJan Lentfer */ 1176d49e1aeSJan Lentfer int eloop_register_sock(int sock, eloop_event_type type, 1186d49e1aeSJan Lentfer eloop_sock_handler handler, 1196d49e1aeSJan Lentfer void *eloop_data, void *user_data); 1206d49e1aeSJan Lentfer 1216d49e1aeSJan Lentfer /** 1226d49e1aeSJan Lentfer * eloop_unregister_sock - Unregister handler for socket events 1236d49e1aeSJan Lentfer * @sock: File descriptor number for the socket 1246d49e1aeSJan Lentfer * @type: Type of event for which sock was registered 1256d49e1aeSJan Lentfer * 1266d49e1aeSJan Lentfer * Unregister a socket event notifier that was previously registered with 1276d49e1aeSJan Lentfer * eloop_register_sock(). 1286d49e1aeSJan Lentfer */ 1296d49e1aeSJan Lentfer void eloop_unregister_sock(int sock, eloop_event_type type); 1306d49e1aeSJan Lentfer 1316d49e1aeSJan Lentfer /** 1326d49e1aeSJan Lentfer * eloop_register_event - Register handler for generic events 1336d49e1aeSJan Lentfer * @event: Event to wait (eloop implementation specific) 1346d49e1aeSJan Lentfer * @event_size: Size of event data 1356d49e1aeSJan Lentfer * @handler: Callback function to be called when event is triggered 1366d49e1aeSJan Lentfer * @eloop_data: Callback context data (eloop_data) 1376d49e1aeSJan Lentfer * @user_data: Callback context data (user_data) 1386d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 1396d49e1aeSJan Lentfer * 1406d49e1aeSJan Lentfer * Register an event handler for the given event. This function is used to 1413ff40c12SJohn Marino * register eloop implementation specific events which are mainly targeted for 1426d49e1aeSJan Lentfer * operating system specific code (driver interface and l2_packet) since the 1436d49e1aeSJan Lentfer * portable code will not be able to use such an OS-specific call. The handler 1446d49e1aeSJan Lentfer * function will be called whenever the event is triggered. The handler 1456d49e1aeSJan Lentfer * function is responsible for clearing the event after having processed it in 1466d49e1aeSJan Lentfer * order to avoid eloop from calling the handler again for the same event. 1476d49e1aeSJan Lentfer * 1486d49e1aeSJan Lentfer * In case of Windows implementation (eloop_win.c), event pointer is of HANDLE 1496d49e1aeSJan Lentfer * type, i.e., void*. The callers are likely to have 'HANDLE h' type variable, 1506d49e1aeSJan Lentfer * and they would call this function with eloop_register_event(h, sizeof(h), 1516d49e1aeSJan Lentfer * ...). 1526d49e1aeSJan Lentfer */ 1536d49e1aeSJan Lentfer int eloop_register_event(void *event, size_t event_size, 1546d49e1aeSJan Lentfer eloop_event_handler handler, 1556d49e1aeSJan Lentfer void *eloop_data, void *user_data); 1566d49e1aeSJan Lentfer 1576d49e1aeSJan Lentfer /** 1586d49e1aeSJan Lentfer * eloop_unregister_event - Unregister handler for a generic event 1596d49e1aeSJan Lentfer * @event: Event to cancel (eloop implementation specific) 1606d49e1aeSJan Lentfer * @event_size: Size of event data 1616d49e1aeSJan Lentfer * 1626d49e1aeSJan Lentfer * Unregister a generic event notifier that was previously registered with 1636d49e1aeSJan Lentfer * eloop_register_event(). 1646d49e1aeSJan Lentfer */ 1656d49e1aeSJan Lentfer void eloop_unregister_event(void *event, size_t event_size); 1666d49e1aeSJan Lentfer 1676d49e1aeSJan Lentfer /** 1686d49e1aeSJan Lentfer * eloop_register_timeout - Register timeout 1696d49e1aeSJan Lentfer * @secs: Number of seconds to the timeout 1706d49e1aeSJan Lentfer * @usecs: Number of microseconds to the timeout 1716d49e1aeSJan Lentfer * @handler: Callback function to be called when timeout occurs 1726d49e1aeSJan Lentfer * @eloop_data: Callback context data (eloop_ctx) 1736d49e1aeSJan Lentfer * @user_data: Callback context data (sock_ctx) 1746d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 1756d49e1aeSJan Lentfer * 1766d49e1aeSJan Lentfer * Register a timeout that will cause the handler function to be called after 1776d49e1aeSJan Lentfer * given time. 1786d49e1aeSJan Lentfer */ 1796d49e1aeSJan Lentfer int eloop_register_timeout(unsigned int secs, unsigned int usecs, 1806d49e1aeSJan Lentfer eloop_timeout_handler handler, 1816d49e1aeSJan Lentfer void *eloop_data, void *user_data); 1826d49e1aeSJan Lentfer 1836d49e1aeSJan Lentfer /** 1846d49e1aeSJan Lentfer * eloop_cancel_timeout - Cancel timeouts 1856d49e1aeSJan Lentfer * @handler: Matching callback function 1866d49e1aeSJan Lentfer * @eloop_data: Matching eloop_data or %ELOOP_ALL_CTX to match all 1876d49e1aeSJan Lentfer * @user_data: Matching user_data or %ELOOP_ALL_CTX to match all 1886d49e1aeSJan Lentfer * Returns: Number of cancelled timeouts 1896d49e1aeSJan Lentfer * 1906d49e1aeSJan Lentfer * Cancel matching <handler,eloop_data,user_data> timeouts registered with 1916d49e1aeSJan Lentfer * eloop_register_timeout(). ELOOP_ALL_CTX can be used as a wildcard for 1926d49e1aeSJan Lentfer * cancelling all timeouts regardless of eloop_data/user_data. 1936d49e1aeSJan Lentfer */ 1946d49e1aeSJan Lentfer int eloop_cancel_timeout(eloop_timeout_handler handler, 1956d49e1aeSJan Lentfer void *eloop_data, void *user_data); 1966d49e1aeSJan Lentfer 1976d49e1aeSJan Lentfer /** 1983ff40c12SJohn Marino * eloop_cancel_timeout_one - Cancel a single timeout 1993ff40c12SJohn Marino * @handler: Matching callback function 2003ff40c12SJohn Marino * @eloop_data: Matching eloop_data 2013ff40c12SJohn Marino * @user_data: Matching user_data 2023ff40c12SJohn Marino * @remaining: Time left on the cancelled timer 2033ff40c12SJohn Marino * Returns: Number of cancelled timeouts 2043ff40c12SJohn Marino * 2053ff40c12SJohn Marino * Cancel matching <handler,eloop_data,user_data> timeout registered with 2063ff40c12SJohn Marino * eloop_register_timeout() and return the remaining time left. 2073ff40c12SJohn Marino */ 2083ff40c12SJohn Marino int eloop_cancel_timeout_one(eloop_timeout_handler handler, 2093ff40c12SJohn Marino void *eloop_data, void *user_data, 2103ff40c12SJohn Marino struct os_reltime *remaining); 2113ff40c12SJohn Marino 2123ff40c12SJohn Marino /** 2136d49e1aeSJan Lentfer * eloop_is_timeout_registered - Check if a timeout is already registered 2146d49e1aeSJan Lentfer * @handler: Matching callback function 2156d49e1aeSJan Lentfer * @eloop_data: Matching eloop_data 2166d49e1aeSJan Lentfer * @user_data: Matching user_data 2176d49e1aeSJan Lentfer * Returns: 1 if the timeout is registered, 0 if the timeout is not registered 2186d49e1aeSJan Lentfer * 2196d49e1aeSJan Lentfer * Determine if a matching <handler,eloop_data,user_data> timeout is registered 2206d49e1aeSJan Lentfer * with eloop_register_timeout(). 2216d49e1aeSJan Lentfer */ 2226d49e1aeSJan Lentfer int eloop_is_timeout_registered(eloop_timeout_handler handler, 2236d49e1aeSJan Lentfer void *eloop_data, void *user_data); 2246d49e1aeSJan Lentfer 2256d49e1aeSJan Lentfer /** 2263ff40c12SJohn Marino * eloop_deplete_timeout - Deplete a timeout that is already registered 2273ff40c12SJohn Marino * @req_secs: Requested number of seconds to the timeout 2283ff40c12SJohn Marino * @req_usecs: Requested number of microseconds to the timeout 2293ff40c12SJohn Marino * @handler: Matching callback function 2303ff40c12SJohn Marino * @eloop_data: Matching eloop_data 2313ff40c12SJohn Marino * @user_data: Matching user_data 2323ff40c12SJohn Marino * Returns: 1 if the timeout is depleted, 0 if no change is made, -1 if no 2333ff40c12SJohn Marino * timeout matched 2343ff40c12SJohn Marino * 2353ff40c12SJohn Marino * Find a registered matching <handler,eloop_data,user_data> timeout. If found, 2363ff40c12SJohn Marino * deplete the timeout if remaining time is more than the requested time. 2373ff40c12SJohn Marino */ 2383ff40c12SJohn Marino int eloop_deplete_timeout(unsigned int req_secs, unsigned int req_usecs, 2393ff40c12SJohn Marino eloop_timeout_handler handler, void *eloop_data, 2403ff40c12SJohn Marino void *user_data); 2413ff40c12SJohn Marino 2423ff40c12SJohn Marino /** 2433ff40c12SJohn Marino * eloop_replenish_timeout - Replenish a timeout that is already registered 2443ff40c12SJohn Marino * @req_secs: Requested number of seconds to the timeout 2453ff40c12SJohn Marino * @req_usecs: Requested number of microseconds to the timeout 2463ff40c12SJohn Marino * @handler: Matching callback function 2473ff40c12SJohn Marino * @eloop_data: Matching eloop_data 2483ff40c12SJohn Marino * @user_data: Matching user_data 2493ff40c12SJohn Marino * Returns: 1 if the timeout is replenished, 0 if no change is made, -1 if no 2503ff40c12SJohn Marino * timeout matched 2513ff40c12SJohn Marino * 2523ff40c12SJohn Marino * Find a registered matching <handler,eloop_data,user_data> timeout. If found, 2533ff40c12SJohn Marino * replenish the timeout if remaining time is less than the requested time. 2543ff40c12SJohn Marino */ 2553ff40c12SJohn Marino int eloop_replenish_timeout(unsigned int req_secs, unsigned int req_usecs, 2563ff40c12SJohn Marino eloop_timeout_handler handler, void *eloop_data, 2573ff40c12SJohn Marino void *user_data); 2583ff40c12SJohn Marino 2593ff40c12SJohn Marino /** 2606d49e1aeSJan Lentfer * eloop_register_signal - Register handler for signals 2616d49e1aeSJan Lentfer * @sig: Signal number (e.g., SIGHUP) 2626d49e1aeSJan Lentfer * @handler: Callback function to be called when the signal is received 2636d49e1aeSJan Lentfer * @user_data: Callback context data (signal_ctx) 2646d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 2656d49e1aeSJan Lentfer * 2666d49e1aeSJan Lentfer * Register a callback function that will be called when a signal is received. 2676d49e1aeSJan Lentfer * The callback function is actually called only after the system signal 2686d49e1aeSJan Lentfer * handler has returned. This means that the normal limits for sighandlers 2696d49e1aeSJan Lentfer * (i.e., only "safe functions" allowed) do not apply for the registered 2706d49e1aeSJan Lentfer * callback. 2716d49e1aeSJan Lentfer */ 2726d49e1aeSJan Lentfer int eloop_register_signal(int sig, eloop_signal_handler handler, 2736d49e1aeSJan Lentfer void *user_data); 2746d49e1aeSJan Lentfer 2756d49e1aeSJan Lentfer /** 2766d49e1aeSJan Lentfer * eloop_register_signal_terminate - Register handler for terminate signals 2776d49e1aeSJan Lentfer * @handler: Callback function to be called when the signal is received 2786d49e1aeSJan Lentfer * @user_data: Callback context data (signal_ctx) 2796d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 2806d49e1aeSJan Lentfer * 2816d49e1aeSJan Lentfer * Register a callback function that will be called when a process termination 2826d49e1aeSJan Lentfer * signal is received. The callback function is actually called only after the 2836d49e1aeSJan Lentfer * system signal handler has returned. This means that the normal limits for 2846d49e1aeSJan Lentfer * sighandlers (i.e., only "safe functions" allowed) do not apply for the 2856d49e1aeSJan Lentfer * registered callback. 2866d49e1aeSJan Lentfer * 2876d49e1aeSJan Lentfer * This function is a more portable version of eloop_register_signal() since 2886d49e1aeSJan Lentfer * the knowledge of exact details of the signals is hidden in eloop 2896d49e1aeSJan Lentfer * implementation. In case of operating systems using signal(), this function 2906d49e1aeSJan Lentfer * registers handlers for SIGINT and SIGTERM. 2916d49e1aeSJan Lentfer */ 2926d49e1aeSJan Lentfer int eloop_register_signal_terminate(eloop_signal_handler handler, 2936d49e1aeSJan Lentfer void *user_data); 2946d49e1aeSJan Lentfer 2956d49e1aeSJan Lentfer /** 2966d49e1aeSJan Lentfer * eloop_register_signal_reconfig - Register handler for reconfig signals 2976d49e1aeSJan Lentfer * @handler: Callback function to be called when the signal is received 2986d49e1aeSJan Lentfer * @user_data: Callback context data (signal_ctx) 2996d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 3006d49e1aeSJan Lentfer * 3016d49e1aeSJan Lentfer * Register a callback function that will be called when a reconfiguration / 3026d49e1aeSJan Lentfer * hangup signal is received. The callback function is actually called only 3036d49e1aeSJan Lentfer * after the system signal handler has returned. This means that the normal 3046d49e1aeSJan Lentfer * limits for sighandlers (i.e., only "safe functions" allowed) do not apply 3056d49e1aeSJan Lentfer * for the registered callback. 3066d49e1aeSJan Lentfer * 3076d49e1aeSJan Lentfer * This function is a more portable version of eloop_register_signal() since 3086d49e1aeSJan Lentfer * the knowledge of exact details of the signals is hidden in eloop 3096d49e1aeSJan Lentfer * implementation. In case of operating systems using signal(), this function 3106d49e1aeSJan Lentfer * registers a handler for SIGHUP. 3116d49e1aeSJan Lentfer */ 3126d49e1aeSJan Lentfer int eloop_register_signal_reconfig(eloop_signal_handler handler, 3136d49e1aeSJan Lentfer void *user_data); 3146d49e1aeSJan Lentfer 3156d49e1aeSJan Lentfer /** 316*a1157835SDaniel Fojt * eloop_sock_requeue - Requeue sockets 317*a1157835SDaniel Fojt * 318*a1157835SDaniel Fojt * Requeue sockets after forking because some implementations require this, 319*a1157835SDaniel Fojt * such as epoll and kqueue. 320*a1157835SDaniel Fojt */ 321*a1157835SDaniel Fojt int eloop_sock_requeue(void); 322*a1157835SDaniel Fojt 323*a1157835SDaniel Fojt /** 3246d49e1aeSJan Lentfer * eloop_run - Start the event loop 3256d49e1aeSJan Lentfer * 3266d49e1aeSJan Lentfer * Start the event loop and continue running as long as there are any 3276d49e1aeSJan Lentfer * registered event handlers. This function is run after event loop has been 3286d49e1aeSJan Lentfer * initialized with event_init() and one or more events have been registered. 3296d49e1aeSJan Lentfer */ 3306d49e1aeSJan Lentfer void eloop_run(void); 3316d49e1aeSJan Lentfer 3326d49e1aeSJan Lentfer /** 3336d49e1aeSJan Lentfer * eloop_terminate - Terminate event loop 3346d49e1aeSJan Lentfer * 3356d49e1aeSJan Lentfer * Terminate event loop even if there are registered events. This can be used 3366d49e1aeSJan Lentfer * to request the program to be terminated cleanly. 3376d49e1aeSJan Lentfer */ 3386d49e1aeSJan Lentfer void eloop_terminate(void); 3396d49e1aeSJan Lentfer 3406d49e1aeSJan Lentfer /** 3416d49e1aeSJan Lentfer * eloop_destroy - Free any resources allocated for the event loop 3426d49e1aeSJan Lentfer * 3436d49e1aeSJan Lentfer * After calling eloop_destroy(), other eloop_* functions must not be called 3446d49e1aeSJan Lentfer * before re-running eloop_init(). 3456d49e1aeSJan Lentfer */ 3466d49e1aeSJan Lentfer void eloop_destroy(void); 3476d49e1aeSJan Lentfer 3486d49e1aeSJan Lentfer /** 3496d49e1aeSJan Lentfer * eloop_terminated - Check whether event loop has been terminated 3506d49e1aeSJan Lentfer * Returns: 1 = event loop terminate, 0 = event loop still running 3516d49e1aeSJan Lentfer * 3526d49e1aeSJan Lentfer * This function can be used to check whether eloop_terminate() has been called 3536d49e1aeSJan Lentfer * to request termination of the event loop. This is normally used to abort 3546d49e1aeSJan Lentfer * operations that may still be queued to be run when eloop_terminate() was 3556d49e1aeSJan Lentfer * called. 3566d49e1aeSJan Lentfer */ 3576d49e1aeSJan Lentfer int eloop_terminated(void); 3586d49e1aeSJan Lentfer 3596d49e1aeSJan Lentfer /** 3606d49e1aeSJan Lentfer * eloop_wait_for_read_sock - Wait for a single reader 3616d49e1aeSJan Lentfer * @sock: File descriptor number for the socket 3626d49e1aeSJan Lentfer * 3636d49e1aeSJan Lentfer * Do a blocking wait for a single read socket. 3646d49e1aeSJan Lentfer */ 3656d49e1aeSJan Lentfer void eloop_wait_for_read_sock(int sock); 3666d49e1aeSJan Lentfer 3676d49e1aeSJan Lentfer #endif /* ELOOP_H */ 368