1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Event loop 3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2002-2006, Jouni Malinen <j@w1.fi> 4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify 6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as 7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation. 8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license. 11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details. 13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This file defines an event loop interface that supports processing events 15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * from registered timeouts (i.e., do something after N seconds), sockets 16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * (e.g., a new packet available for reading), and signals. eloop.c is an 17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * implementation of this interface using select() and sockets. This is 18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * suitable for most UNIX/POSIX systems. When porting to other operating 19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * systems, it may be necessary to replace that implementation with OS specific 20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * mechanisms. 21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifndef ELOOP_H 24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define ELOOP_H 25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * ELOOP_ALL_CTX - eloop_cancel_timeout() magic number to match all timeouts 28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define ELOOP_ALL_CTX (void *) -1 30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 32526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_event_type - eloop socket event type for eloop_register_sock() 33526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @EVENT_TYPE_READ: Socket has data available for reading 34526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @EVENT_TYPE_WRITE: Socket has room for new data to be written 35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @EVENT_TYPE_EXCEPTION: An exception has been reported 36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidttypedef enum { 38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt EVENT_TYPE_READ = 0, 39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt EVENT_TYPE_WRITE, 40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt EVENT_TYPE_EXCEPTION 41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} eloop_event_type; 42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_sock_handler - eloop socket event callback type 45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sock: File descriptor number for the socket 46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @eloop_ctx: Registered callback context data (eloop_data) 47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sock_ctx: Registered callback context data (user_data) 48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidttypedef void (*eloop_sock_handler)(int sock, void *eloop_ctx, void *sock_ctx); 50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_event_handler - eloop generic event callback type 53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @eloop_ctx: Registered callback context data (eloop_data) 54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sock_ctx: Registered callback context data (user_data) 55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidttypedef void (*eloop_event_handler)(void *eloop_data, void *user_ctx); 57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_timeout_handler - eloop timeout event callback type 60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @eloop_ctx: Registered callback context data (eloop_data) 61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sock_ctx: Registered callback context data (user_data) 62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidttypedef void (*eloop_timeout_handler)(void *eloop_data, void *user_ctx); 64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_signal_handler - eloop signal event callback type 67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sig: Signal number 68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @eloop_ctx: Registered callback context data (global user_data from 69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_init() call) 70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @signal_ctx: Registered callback context data (user_data from 71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_signal(), eloop_register_signal_terminate(), or 72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_signal_reconfig() call) 73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidttypedef void (*eloop_signal_handler)(int sig, void *eloop_ctx, 75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *signal_ctx); 76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_init() - Initialize global event loop data 79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @user_data: Pointer to global data passed as eloop_ctx to signal handlers 80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function must be called before any other eloop_* function. user_data 83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * can be used to configure a global (to the process) pointer that will be 84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * passed as eloop_ctx parameter to signal handlers. 85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_init(void *user_data); 87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_read_sock - Register handler for read events 90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sock: File descriptor number for the socket 91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @handler: Callback function to be called when data is available for reading 92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @eloop_data: Callback context data (eloop_ctx) 93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @user_data: Callback context data (sock_ctx) 94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Register a read socket notifier for the given file descriptor. The handler 97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * function will be called whenever data is available for reading from the 98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * socket. The handler function is responsible for clearing the event after 99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * having processed it in order to avoid eloop from calling the handler again 100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * for the same event. 101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_register_read_sock(int sock, eloop_sock_handler handler, 103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *eloop_data, void *user_data); 104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_unregister_read_sock - Unregister handler for read events 107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sock: File descriptor number for the socket 108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Unregister a read socket notifier that was previously registered with 110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_read_sock(). 111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eloop_unregister_read_sock(int sock); 113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_sock - Register handler for socket events 116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sock: File descriptor number for the socket 117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @type: Type of event to wait for 118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @handler: Callback function to be called when the event is triggered 119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @eloop_data: Callback context data (eloop_ctx) 120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @user_data: Callback context data (sock_ctx) 121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Register an event notifier for the given socket's file descriptor. The 124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * handler function will be called whenever the that event is triggered for the 125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * socket. The handler function is responsible for clearing the event after 126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * having processed it in order to avoid eloop from calling the handler again 127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * for the same event. 128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_register_sock(int sock, eloop_event_type type, 130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eloop_sock_handler handler, 131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *eloop_data, void *user_data); 132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_unregister_sock - Unregister handler for socket events 135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sock: File descriptor number for the socket 136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @type: Type of event for which sock was registered 137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Unregister a socket event notifier that was previously registered with 139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_sock(). 140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eloop_unregister_sock(int sock, eloop_event_type type); 142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_event - Register handler for generic events 145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @event: Event to wait (eloop implementation specific) 146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @event_size: Size of event data 147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @handler: Callback function to be called when event is triggered 148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @eloop_data: Callback context data (eloop_data) 149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @user_data: Callback context data (user_data) 150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Register an event handler for the given event. This function is used to 153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * register eloop implementation specific events which are mainly targetted for 154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * operating system specific code (driver interface and l2_packet) since the 155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * portable code will not be able to use such an OS-specific call. The handler 156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * function will be called whenever the event is triggered. The handler 157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * function is responsible for clearing the event after having processed it in 158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * order to avoid eloop from calling the handler again for the same event. 159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * In case of Windows implementation (eloop_win.c), event pointer is of HANDLE 161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * type, i.e., void*. The callers are likely to have 'HANDLE h' type variable, 162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * and they would call this function with eloop_register_event(h, sizeof(h), 163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * ...). 164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_register_event(void *event, size_t event_size, 166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eloop_event_handler handler, 167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *eloop_data, void *user_data); 168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_unregister_event - Unregister handler for a generic event 171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @event: Event to cancel (eloop implementation specific) 172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @event_size: Size of event data 173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Unregister a generic event notifier that was previously registered with 175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_event(). 176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eloop_unregister_event(void *event, size_t event_size); 178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_timeout - Register timeout 181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @secs: Number of seconds to the timeout 182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @usecs: Number of microseconds to the timeout 183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @handler: Callback function to be called when timeout occurs 184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @eloop_data: Callback context data (eloop_ctx) 185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @user_data: Callback context data (sock_ctx) 186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Register a timeout that will cause the handler function to be called after 189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * given time. 190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_register_timeout(unsigned int secs, unsigned int usecs, 192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt eloop_timeout_handler handler, 193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *eloop_data, void *user_data); 194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_cancel_timeout - Cancel timeouts 197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @handler: Matching callback function 198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @eloop_data: Matching eloop_data or %ELOOP_ALL_CTX to match all 199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @user_data: Matching user_data or %ELOOP_ALL_CTX to match all 200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: Number of cancelled timeouts 201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Cancel matching <handler,eloop_data,user_data> timeouts registered with 203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_timeout(). ELOOP_ALL_CTX can be used as a wildcard for 204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * cancelling all timeouts regardless of eloop_data/user_data. 205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_cancel_timeout(eloop_timeout_handler handler, 207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *eloop_data, void *user_data); 208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_is_timeout_registered - Check if a timeout is already registered 211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @handler: Matching callback function 212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @eloop_data: Matching eloop_data 213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @user_data: Matching user_data 214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 1 if the timeout is registered, 0 if the timeout is not registered 215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Determine if a matching <handler,eloop_data,user_data> timeout is registered 217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * with eloop_register_timeout(). 218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_is_timeout_registered(eloop_timeout_handler handler, 220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *eloop_data, void *user_data); 221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_signal - Register handler for signals 224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sig: Signal number (e.g., SIGHUP) 225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @handler: Callback function to be called when the signal is received 226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @user_data: Callback context data (signal_ctx) 227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Register a callback function that will be called when a signal is received. 230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * The callback function is actually called only after the system signal 231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * handler has returned. This means that the normal limits for sighandlers 232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * (i.e., only "safe functions" allowed) do not apply for the registered 233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * callback. 234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Signals are 'global' events and there is no local eloop_data pointer like 236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * with other handlers. The global user_data pointer registered with 237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_init() will be used as eloop_ctx for signal handlers. 238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_register_signal(int sig, eloop_signal_handler handler, 240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *user_data); 241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_signal_terminate - Register handler for terminate signals 244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @handler: Callback function to be called when the signal is received 245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @user_data: Callback context data (signal_ctx) 246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Register a callback function that will be called when a process termination 249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * signal is received. The callback function is actually called only after the 250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * system signal handler has returned. This means that the normal limits for 251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * sighandlers (i.e., only "safe functions" allowed) do not apply for the 252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * registered callback. 253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Signals are 'global' events and there is no local eloop_data pointer like 255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * with other handlers. The global user_data pointer registered with 256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_init() will be used as eloop_ctx for signal handlers. 257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function is a more portable version of eloop_register_signal() since 259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * the knowledge of exact details of the signals is hidden in eloop 260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * implementation. In case of operating systems using signal(), this function 261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * registers handlers for SIGINT and SIGTERM. 262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_register_signal_terminate(eloop_signal_handler handler, 264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *user_data); 265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_register_signal_reconfig - Register handler for reconfig signals 268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @handler: Callback function to be called when the signal is received 269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @user_data: Callback context data (signal_ctx) 270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Register a callback function that will be called when a reconfiguration / 273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * hangup signal is received. The callback function is actually called only 274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * after the system signal handler has returned. This means that the normal 275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * limits for sighandlers (i.e., only "safe functions" allowed) do not apply 276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * for the registered callback. 277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Signals are 'global' events and there is no local eloop_data pointer like 279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * with other handlers. The global user_data pointer registered with 280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_init() will be used as eloop_ctx for signal handlers. 281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function is a more portable version of eloop_register_signal() since 283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * the knowledge of exact details of the signals is hidden in eloop 284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * implementation. In case of operating systems using signal(), this function 285526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * registers a handler for SIGHUP. 286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_register_signal_reconfig(eloop_signal_handler handler, 288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt void *user_data); 289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_run - Start the event loop 292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Start the event loop and continue running as long as there are any 294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * registered event handlers. This function is run after event loop has been 295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * initialized with event_init() and one or more events have been registered. 296526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eloop_run(void); 298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_terminate - Terminate event loop 301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Terminate event loop even if there are registered events. This can be used 303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * to request the program to be terminated cleanly. 304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eloop_terminate(void); 306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_destroy - Free any resources allocated for the event loop 309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * After calling eloop_destroy(), other eloop_* functions must not be called 311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * before re-running eloop_init(). 312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eloop_destroy(void); 314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_terminated - Check whether event loop has been terminated 317526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 1 = event loop terminate, 0 = event loop still running 318526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 319526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This function can be used to check whether eloop_terminate() has been called 320526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * to request termination of the event loop. This is normally used to abort 321526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * operations that may still be queued to be run when eloop_terminate() was 322526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * called. 323526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 324526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint eloop_terminated(void); 325526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 326526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 327526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_wait_for_read_sock - Wait for a single reader 328526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @sock: File descriptor number for the socket 329526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 330526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Do a blocking wait for a single read socket. 331526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 332526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid eloop_wait_for_read_sock(int sock); 333526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 334526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 335526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * eloop_get_user_data - Get global user data 336526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: user_data pointer that was registered with eloop_init() 337526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 338526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid * eloop_get_user_data(void); 339526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 340526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* ELOOP_H */ 341