From 6efeb198451a46bb8039d2892986c7f625c92649 Mon Sep 17 00:00:00 2001 From: Hans Dedecker Date: Wed, 18 Oct 2017 10:00:15 +0200 Subject: [PATCH] autofs: register SIGTERM for gracefull exit Register SIGTERM to gracefully terminate mountd. At the same time don't handle the exit in signal handler context but let the main bail out. Signed-off-by: Hans Dedecker Signed-off-by: Rutger Lejeune --- autofs.c | 19 +++++++++++++------ include/signal.h | 2 +- signal.c | 17 +++-------------- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/autofs.c b/autofs.c index 8c69cbe..a898f49 100644 --- a/autofs.c +++ b/autofs.c @@ -32,6 +32,7 @@ static int fdin = 0; /* data coming out of the kernel */ static int fdout = 0;/* data going into the kernel */ +static bool term = false; static dev_t dev; static time_t uci_timeout; @@ -147,7 +148,7 @@ static int autofs_in(union autofs_v5_packet_union *pkt) fds[0].fd = fdout; fds[0].events = POLLIN; - while(1) + while(!term) { res = poll(fds, 1, -1); @@ -163,6 +164,7 @@ static int autofs_in(union autofs_v5_packet_union *pkt) return fullread(pkt, sizeof(*pkt)); } } + return 1; } pid_t autofs_safe_fork(void) @@ -171,24 +173,29 @@ pid_t autofs_safe_fork(void) if(!pid) { close(fdin); - close(fdout); + close(fdout); } return pid; } -static void autofs_cleanup_handler(void) +static void autofs_cleanup(void) { close(fdin); close(fdout); umount_autofs(); } +static void autofs_end_handler(int sig) +{ + term = true; +} + static void autofs_init(void) { int kproto_version; char *p; struct uci_context *ctx; - signal_init(autofs_cleanup_handler); + signal_init(autofs_end_handler); ctx = ucix_init("mountd"); uci_timeout = ucix_get_option_int(ctx, "mountd", "mountd", "timeout", 60); p = ucix_get_option(ctx, "mountd", "mountd", "path"); @@ -226,7 +233,7 @@ int autofs_loop(void) { chdir("/"); autofs_init(); - while(1) + while(!term) { union autofs_v5_packet_union pkt; if(autofs_in(&pkt)) @@ -240,7 +247,7 @@ int autofs_loop(void) log_printf("unknown packet type %d\n", pkt.hdr.type); poll(0, 0, 200); } - umount_autofs(); + autofs_cleanup(); log_printf("... quitting\n"); closelog(); return 0; diff --git a/include/signal.h b/include/signal.h index 6ab3130..b920360 100644 --- a/include/signal.h +++ b/include/signal.h @@ -1,7 +1,7 @@ #ifndef _SIGNAL_H__ #define _SIGNAL_H__ -void signal_init(void (*_crtlc_cb)(void)); +void signal_init(void (*_crtlc_cb)(int)); int signal_usr1(void); int signal_usr2(void); diff --git a/signal.c b/signal.c index 6ab77da..1065641 100644 --- a/signal.c +++ b/signal.c @@ -7,21 +7,10 @@ #include "include/led.h" #include "include/signal.h" -static void (*crtlc_cb)(void) = 0; - -static void handlerINT(int s) -{ - log_printf("caught sig int ... cleaning up\n"); - if(crtlc_cb) - crtlc_cb(); - exit(0); -} - -void signal_init(void (*_crtlc_cb)(void)) +void signal_init(void (*_crtlc_cb)(int)) { struct sigaction s; - crtlc_cb = _crtlc_cb; - s.sa_handler = handlerINT; + s.sa_handler = _crtlc_cb; s.sa_flags = 0; - sigaction(SIGINT, &s, NULL); + sigaction(SIGTERM, &s, NULL); } -- 2.25.1