commit 2d4ea288353c2240c8d13e41c8da1557fc32168b from: Alexander Barton date: Tue Jun 29 20:55:27 2010 UTC Resolver: Implement signal handler and catch TERM signal commit - d4632a727fbee65cb1585c6f6e9968d830f23a19 commit + 2d4ea288353c2240c8d13e41c8da1557fc32168b blob - e64688ec22e1c280c395282b9b7a3ef8d3154650 blob + 295a559f6f14a551c6f66cb89b3036e620511db3 --- src/ngircd/resolve.c +++ src/ngircd/resolve.c @@ -42,6 +42,7 @@ #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 )); @@ -69,7 +70,7 @@ Resolve_Addr(PROC_STAT * s, const ng_ipaddr_t *Addr, i return true; } else if( pid == 0 ) { /* Sub process */ - Log_Init_Resolver(); + Init_Subprocess(); Do_ResolveAddr( Addr, identsock, pipefd[1]); Log_Exit_Resolver( ); exit(0); @@ -98,15 +99,42 @@ Resolve_Name( PROC_STAT *s, const char *Host, void (*c return true; } else if( pid == 0 ) { /* Sub process */ - Log_Init_Resolver(); + Init_Subprocess(); Do_ResolveName(Host, pipefd[1]); Log_Exit_Resolver( ); exit(0); } return false; } /* 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 *