]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Resolver: Implement signal handler and catch TERM signal
authorAlexander Barton <alex@barton.de>
Fri, 21 May 2010 21:53:48 +0000 (23:53 +0200)
committerAlexander Barton <alex@barton.de>
Tue, 29 Jun 2010 20:55:27 +0000 (22:55 +0200)
src/ngircd/resolve.c

index e64688ec22e1c280c395282b9b7a3ef8d3154650..295a559f6f14a551c6f66cb89b3036e620511db3 100644 (file)
@@ -42,6 +42,7 @@
 #include "io.h"
 
 
 #include "io.h"
 
 
+static void Init_Subprocess PARAMS(( void ));
 static void Do_ResolveAddr PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd ));
 static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
 
 static void Do_ResolveAddr PARAMS(( const ng_ipaddr_t *Addr, int Sock, int w_fd ));
 static void Do_ResolveName PARAMS(( const char *Host, int w_fd ));
 
@@ -69,7 +70,7 @@ Resolve_Addr(PROC_STAT * s, const ng_ipaddr_t *Addr, int identsock,
                return true;
        } else if( pid == 0 ) {
                /* Sub process */
                return true;
        } else if( pid == 0 ) {
                /* Sub process */
-               Log_Init_Resolver();
+               Init_Subprocess();
                Do_ResolveAddr( Addr, identsock, pipefd[1]);
                Log_Exit_Resolver( );
                exit(0);
                Do_ResolveAddr( Addr, identsock, pipefd[1]);
                Log_Exit_Resolver( );
                exit(0);
@@ -98,7 +99,7 @@ Resolve_Name( PROC_STAT *s, const char *Host, void (*cbfunc)(int, short))
                return true;
        } else if( pid == 0 ) {
                /* Sub process */
                return true;
        } else if( pid == 0 ) {
                /* Sub process */
-               Log_Init_Resolver();
+               Init_Subprocess();
                Do_ResolveName(Host, pipefd[1]);
                Log_Exit_Resolver( );
                exit(0);
                Do_ResolveName(Host, pipefd[1]);
                Log_Exit_Resolver( );
                exit(0);
@@ -107,6 +108,33 @@ Resolve_Name( PROC_STAT *s, const char *Host, void (*cbfunc)(int, short))
 } /* Resolve_Name */
 
 
 } /* Resolve_Name */
 
 
+/**
+ * Signal handler for the forked resolver subprocess.
+ */
+static void
+Signal_Handler(int Signal)
+{
+       switch(Signal) {
+       case SIGTERM:
+#ifdef DEBUG
+               Log_Resolver(LOG_DEBUG, "Resolver: Got TERM signal, exiting.");
+#endif
+               exit(1);
+       }
+}
+
+
+/**
+ * Initialize forked resolver subprocess.
+ */
+static void
+Init_Subprocess(void)
+{
+       signal(SIGTERM, Signal_Handler);
+       Log_Init_Resolver();
+}
+
+
 #if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
 #if !defined(WANT_IPV6) && defined(h_errno)
 static char *
 #if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
 #if !defined(WANT_IPV6) && defined(h_errno)
 static char *