# HG changeset patch # User Tero Marttila # Date 1237240530 -7200 # Node ID 0a13030f795d3a8f8ffe07cc4b3e0de4c24d7472 # Parent a9a4c5e6aa303b9910209cfa9abb4d6f40334211 implement signal_ignore using sigaction directly, without any libevent in between diff -r a9a4c5e6aa30 -r 0a13030f795d src/error.c --- a/src/error.c Mon Mar 16 23:34:05 2009 +0200 +++ b/src/error.c Mon Mar 16 23:55:30 2009 +0200 @@ -12,6 +12,7 @@ struct error_desc _core_error_desc[] = { { ERR_CALLOC, "calloc", ERR_EXTRA_NONE }, { ERR_STRDUP, "strdup", ERR_EXTRA_NONE }, + { ERR_SIGACTION, "sigaction", ERR_EXTRA_ERRNO }, { ERR_GETADDRINFO, "getaddrinfo", ERR_EXTRA_GAI }, { ERR_GETADDRINFO_EMPTY, "getaddrinfo: no results", ERR_EXTRA_NONE }, { ERR_EVENT_NEW, "event_new", ERR_EXTRA_NONE }, diff -r a9a4c5e6aa30 -r 0a13030f795d src/error.h --- a/src/error.h Mon Mar 16 23:34:05 2009 +0200 +++ b/src/error.h Mon Mar 16 23:55:30 2009 +0200 @@ -44,6 +44,7 @@ _ERR_STDLIB = 0x000100, ERR_CALLOC, ERR_STRDUP, + ERR_SIGACTION, /** DNS resolver */ _ERR_RESOLVER = 0x000200, diff -r a9a4c5e6aa30 -r 0a13030f795d src/nexus.c --- a/src/nexus.c Mon Mar 16 23:34:05 2009 +0200 +++ b/src/nexus.c Mon Mar 16 23:55:30 2009 +0200 @@ -271,6 +271,8 @@ // remove the signal handlers (ourself) signals_free(ctx->signals); + + // now event_base_dispatch should return once everythings' shut down... } int main (int argc, char **argv) @@ -290,11 +292,11 @@ FATAL("signals_create"); // add our signal handlers - if ( - (ERROR_CODE(&err) = signals_add(nexus->signals, SIGPIPE, &signals_ignore, nexus->signals)) - || (ERROR_CODE(&err) = signals_add(nexus->signals, SIGINT, &on_sigint, nexus)) - ) - FATAL_ERROR(&err, "signals_add"); + if (signal_ignore(SIGPIPE, &err)) + FATAL_ERROR(&err, "signals_ignore(SIGPIPE)"); + + if ((ERROR_CODE(&err) = signals_add(nexus->signals, SIGINT, &on_sigint, nexus))) + FATAL_ERROR(&err, "signals_add(SIGINT)"); // initialize sock module if (sock_init(nexus->ev_base, &err)) @@ -311,8 +313,10 @@ // parse args if (parse_args(nexus, argc, argv, &err)) FATAL_ERROR(&err, "parse_args"); - + // run event loop + log_info("entering event loop"); + if (event_base_dispatch(nexus->ev_base)) FATAL("event_base_dispatch"); diff -r a9a4c5e6aa30 -r 0a13030f795d src/signals.c --- a/src/signals.c Mon Mar 16 23:34:05 2009 +0200 +++ b/src/signals.c Mon Mar 16 23:55:30 2009 +0200 @@ -82,26 +82,43 @@ return SUCCESS; } +err_t signal_ignore (int signum, struct error_info *err) +{ + struct sigaction act = { + .sa_handler = SIG_IGN, + }; + + // signall the handler + if (sigaction(signum, &act, NULL)) + RETURN_SET_ERROR_ERRNO(err, ERR_SIGACTION); + + // ok + return SUCCESS; +} + struct signals *signals_default (struct event_base *ev_base) { struct signals *signals = NULL; + struct error_info err; // alloc signals if (signals_create(&signals, ev_base)) return NULL; // add the set of default signals - if ( signals_add(signals, SIGPIPE, &signals_ignore, signals) - || signals_add(signals, SIGINT, &signals_loopexit, signals) - ) + if (signal_ignore(SIGPIPE, &err)) + log_err_info(&err, "signal_ignore(SIGPIPE)"); + + if ((ERROR_CODE(&err) = signals_add(signals, SIGINT, &signals_loopexit, signals))) { + log_err_info(&err, "signals_add(SIGINT)"); goto error; - + } + // ok return signals; error: - if (signals) - signals_free(signals); + signals_free(signals); return NULL; } diff -r a9a4c5e6aa30 -r 0a13030f795d src/signals.h --- a/src/signals.h Mon Mar 16 23:34:05 2009 +0200 +++ b/src/signals.h Mon Mar 16 23:55:30 2009 +0200 @@ -36,21 +36,26 @@ */ err_t signals_create (struct signals **signals_ptr, struct event_base *ev_base); -/* +/** * Add a signal to be handled by the given signals struct with the given handler. */ err_t signals_add (struct signals *signals, int sigval, void (*sig_handler)(evutil_socket_t, short, void *), void *arg); -/* +/** + * Ignore the given sigval. + */ +err_t signal_ignore (int signum, struct error_info *err); + +/** * Add a set of default signals * SIGPIPE signals_ignore * SIGINT signals_loopexit */ struct signals *signals_default (struct event_base *ev_base); -/* +/** * Free the resources/handlers associated with the given signal handler set */ void signals_free (struct signals *signals); -#endif /* LIB_SIGNAL_H */ +#endif /* SIGNALS_H */