terom@48: #ifndef SIGNALS_H terom@48: #define SIGNALS_H terom@48: terom@48: /** terom@48: * @file terom@48: * terom@48: * Handle signals in a libevent way terom@48: */ terom@48: #include "error.h" terom@48: #include terom@48: terom@48: /** terom@48: * How many signals we can define actions for terom@48: */ terom@48: #define MAX_SIGNALS 8 terom@48: terom@48: /** terom@48: * State for a set of signals terom@48: */ terom@48: struct signals; terom@48: terom@48: /** terom@48: * Used as a handler for signals that should cause a loopexit. terom@48: */ terom@48: void signals_loopexit (int signal, short event, void *arg); terom@48: terom@48: /** terom@48: * Used to receive signals, but discard them, and continue what we were doing. terom@48: */ terom@48: void signals_ignore (int signal, short event, void *arg); terom@48: terom@48: /** terom@48: * Allocate a signals struct, acting on the given ev_base. terom@48: * terom@48: * Returns NULL on failure terom@48: */ terom@48: err_t signals_create (struct signals **signals_ptr, struct event_base *ev_base); terom@48: terom@71: /** terom@48: * Add a signal to be handled by the given signals struct with the given handler. terom@48: */ terom@48: err_t signals_add (struct signals *signals, int sigval, void (*sig_handler)(evutil_socket_t, short, void *), void *arg); terom@48: terom@71: /** terom@71: * Ignore the given sigval. terom@71: */ terom@71: err_t signal_ignore (int signum, struct error_info *err); terom@71: terom@71: /** terom@48: * Add a set of default signals terom@48: * SIGPIPE signals_ignore terom@48: * SIGINT signals_loopexit terom@48: */ terom@48: struct signals *signals_default (struct event_base *ev_base); terom@48: terom@71: /** terom@70: * Free the resources/handlers associated with the given signal handler set terom@48: */ terom@48: void signals_free (struct signals *signals); terom@48: terom@71: #endif /* SIGNALS_H */