From 958f694b6f4527ac8220a3a2b46f9ec383c708d2 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 14 Jun 2016 21:36:08 -0700 Subject: [PATCH] dll: fuse: Cygwin signal handling support --- inc/fuse/fuse_common.h | 3 ++- inc/fuse/winfsp_fuse.h | 36 +++++++++++++++++++++++++++--------- src/dll/fuse/fuse.c | 15 +++++++++++++++ src/dll/fuse/fuse_main.c | 4 ++-- 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/inc/fuse/fuse_common.h b/inc/fuse/fuse_common.h index c14e1c14..32a0040d 100644 --- a/inc/fuse/fuse_common.h +++ b/inc/fuse/fuse_common.h @@ -126,7 +126,8 @@ static inline int fuse_set_signal_handlers(struct fuse_session *se) static inline void fuse_remove_signal_handlers(struct fuse_session *se) { - fsp_fuse_remove_signal_handlers(se); + (void)se; + fsp_fuse_set_signal_handlers(0); } #ifdef __cplusplus diff --git a/inc/fuse/winfsp_fuse.h b/inc/fuse/winfsp_fuse.h index 75d4a614..80392aa5 100644 --- a/inc/fuse/winfsp_fuse.h +++ b/inc/fuse/winfsp_fuse.h @@ -19,6 +19,7 @@ #ifndef FUSE_WINFSP_FUSE_H_INCLUDED #define FUSE_WINFSP_FUSE_H_INCLUDED +#include #include #if !defined(WINFSP_DLL_INTERNAL) #include @@ -158,7 +159,6 @@ struct fuse_flock MemAlloc, MemFree, \ fsp_fuse_daemonize, \ fsp_fuse_set_signal_handlers, \ - fsp_fuse_remove_signal_handlers,\ } #else #define FSP_FUSE_ENV_INIT \ @@ -167,13 +167,12 @@ struct fuse_flock malloc, free, \ fsp_fuse_daemonize, \ fsp_fuse_set_signal_handlers, \ - fsp_fuse_remove_signal_handlers,\ } #endif #elif defined(__CYGWIN__) -#include +#include #include #include #include @@ -207,7 +206,6 @@ struct fuse_flock malloc, free, \ fsp_fuse_daemonize, \ fsp_fuse_set_signal_handlers, \ - fsp_fuse_remove_signal_handlers,\ } /* @@ -226,9 +224,11 @@ struct fsp_fuse_env void (*memfree)(void *); int (*daemonize)(int); int (*set_signal_handlers)(void *); - void (*remove_signal_handlers)(void *); }; +FSP_FUSE_API void fsp_fuse_signal_handler(int sig); +FSP_FUSE_API void fsp_fuse_set_signal_arg(void *se); + static inline int fsp_fuse_daemonize(int foreground) { #if defined(_WIN64) || defined(_WIN32) @@ -250,13 +250,31 @@ static inline int fsp_fuse_daemonize(int foreground) static inline int fsp_fuse_set_signal_handlers(void *se) { +#if defined(_WIN64) || defined(_WIN32) (void)se; return 0; -} +#elif defined(__CYGWIN__) -static inline void fsp_fuse_remove_signal_handlers(void *se) -{ - (void)se; +#define FSP_FUSE_SET_SIGNAL_HANDLER(sig, newha)\ + newsa.sa_handler = se ? (newha) : SIG_DFL;\ + if (-1 == sigaction((sig), 0, &oldsa) ||\ + (oldsa.sa_handler == (se ? SIG_DFL : (newha)) && -1 == sigaction((sig), &newsa, 0)))\ + return -1; + + struct sigaction oldsa, newsa = { 0 }; + + FSP_FUSE_SET_SIGNAL_HANDLER(SIGHUP, fsp_fuse_signal_handler); + FSP_FUSE_SET_SIGNAL_HANDLER(SIGINT, fsp_fuse_signal_handler); + FSP_FUSE_SET_SIGNAL_HANDLER(SIGTERM, fsp_fuse_signal_handler); + FSP_FUSE_SET_SIGNAL_HANDLER(SIGTERM, SIG_IGN); + + fsp_fuse_set_signal_arg(se); + + return 0; + +#undef FSP_FUSE_SET_SIGNAL_HANDLER + +#endif } static inline struct fsp_fuse_env *fsp_fuse_env(void) diff --git a/src/dll/fuse/fuse.c b/src/dll/fuse/fuse.c index afcc9168..ede7894d 100644 --- a/src/dll/fuse/fuse.c +++ b/src/dll/fuse/fuse.c @@ -661,3 +661,18 @@ FSP_FUSE_API int32_t fsp_fuse_ntstatus_from_errno(struct fsp_fuse_env *env, return STATUS_ACCESS_DENIED; } } + +/* Cygwin signal support */ + +static struct fuse *fsp_fuse_signal_arg; + +FSP_FUSE_API void fsp_fuse_signal_handler(int sig) +{ + if (0 != fsp_fuse_signal_arg && 0 != fsp_fuse_signal_arg->Service) + FspServiceStop(fsp_fuse_signal_arg->Service); +} + +FSP_FUSE_API void fsp_fuse_set_signal_arg(void *se) +{ + fsp_fuse_signal_arg = se; +} diff --git a/src/dll/fuse/fuse_main.c b/src/dll/fuse/fuse_main.c index a53ae446..b72f0f00 100644 --- a/src/dll/fuse/fuse_main.c +++ b/src/dll/fuse/fuse_main.c @@ -153,7 +153,7 @@ FSP_FUSE_API int fsp_fuse_main_real(struct fsp_fuse_env *env, if (-1 == result) goto exit; - result = env->set_signal_handlers(f/* !!!: REVISIT */); + result = env->set_signal_handlers(f); if (-1 == result) goto exit; signal_handlers = 1; @@ -162,7 +162,7 @@ FSP_FUSE_API int fsp_fuse_main_real(struct fsp_fuse_env *env, exit: if (signal_handlers) - env->remove_signal_handlers(f/* !!!: REVISIT */); + env->set_signal_handlers(0); if (0 != f) fsp_fuse_destroy(env, f);