implement signal_ignore using sigaction directly, without any libevent in between
authorTero Marttila <terom@fixme.fi>
Mon, 16 Mar 2009 23:55:30 +0200
changeset 71 0a13030f795d
parent 70 a9a4c5e6aa30
child 72 43084f103c2a
implement signal_ignore using sigaction directly, without any libevent in between
src/error.c
src/error.h
src/nexus.c
src/signals.c
src/signals.h
--- 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 */