Author: gherzan Date: Mon Nov 16 15:54:57 2009 New Revision: 1691 Log: co: upgrade the signal handling the client The normal switch to sigaction. Modified: trunk/community-operator/co_client.c Modified: trunk/community-operator/co_client.c ============================================================================== --- trunk/community-operator/co_client.c Mon Nov 16 11:30:03 2009 (r1690) +++ trunk/community-operator/co_client.c Mon Nov 16 15:54:57 2009 (r1691) @@ -3,6 +3,7 @@ * All rights reserved. */ +#define _POSIX_C_SOURCE 200112 #define _XOPEN_SOURCE #define _SVID_SOURCE @@ -28,10 +29,10 @@ #define PATH_BUFFER 1000 static int check_certs_dir(void); -static void co_client_check_certs(int sig); +static void co_client_check_certs(int sig, siginfo_t *info, void *ctx); static void co_client_init(void); static void co_client_main(void); -static void co_client_quit(int sig); +static void co_client_quit(int sig, siginfo_t *info, void *ctx); static int copy_cert(const char * source, char * destination); static int create_client_socket(struct sockaddr_in6 *srv_addr); static int is_valid_cert(const char *filename); @@ -218,7 +219,8 @@ * Terminate community-operator client by receiving signal * @param sig signal quit code */ -static void co_client_quit(UNUSED int sig) +static void co_client_quit(UNUSED int sig, UNUSED siginfo_t *info, + UNUSED void *ctx) { PISA_INFO("Shutting down Community-Operator client...\n"); pisa_cfg_cleanup(); @@ -501,7 +503,8 @@ * co_client_config.certs_dir expired. * @param sig signal code */ -static void co_client_check_certs(UNUSED int sigl) +static void co_client_check_certs(UNUSED int sigl, UNUSED siginfo_t *info, + UNUSED void *ctx) { if (co_client_config.save_certs) { PISA_INFO("Checking existing certificates...\n"); @@ -518,21 +521,29 @@ int main(void) { + struct sigaction sigact; - signal(SIGTERM, co_client_quit); - signal(SIGINT, co_client_quit); - signal(SIGQUIT, co_client_quit); - signal(SIGALRM, co_client_check_certs); + sigact.sa_flags = SA_SIGINFO; + sigemptyset(&sigact.sa_mask); + + sigact.sa_sigaction = co_client_quit; + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + + sigact.sa_sigaction = co_client_check_certs; + sigaction(SIGALRM, &sigact, NULL); co_client_init(); - co_client_check_certs(SIGALRM); + co_client_check_certs(SIGALRM, NULL, NULL); // Only enter infinite loop if we periodically check for valid certs if (co_client_config.save_certs) { co_client_main(); } - co_client_quit(0); - return 0; + co_client_quit(0, NULL, NULL); + + return EXIT_SUCCESS; }