implement signal_ignore using sigaction directly, without any libevent in between
--- 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 },
--- 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,
--- 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");
--- 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;
}
--- 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 */