diff options
author | j.novak@netsystem.cz <j.novak@netsystem.cz> | 2022-08-29 19:46:59 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2022-08-29 19:46:59 +0000 |
commit | 90143855af7c0c5ffd2ee5374dd7df17a246299c (patch) | |
tree | 4aed92f776e046b528974240360e55e23f82ec47 /extcap/extcap-base.c | |
parent | 621b94a090173706af429a22335eae8ff4f9e86d (diff) |
extcap: Signal processing unified for C based extcaps
Diffstat (limited to 'extcap/extcap-base.c')
-rw-r--r-- | extcap/extcap-base.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/extcap/extcap-base.c b/extcap/extcap-base.c index 2a1cb7c1f6..bb4615d47b 100644 --- a/extcap/extcap-base.c +++ b/extcap/extcap-base.c @@ -46,8 +46,31 @@ typedef struct _extcap_option { static FILE *custom_log = NULL; +/* used to inform to extcap application that end of application is requested */ +gboolean extcap_end_application = FALSE; +/* graceful shutdown callback, can be null */ +void (*extcap_graceful_shutdown_cb)(void) = NULL; + static void extcap_init_log_file(const char *filename); +/* Called from signals */ +#ifdef _WIN32 +static BOOL WINAPI +extcap_exit_from_loop(DWORD dwCtrlType _U_) +#else +static void extcap_exit_from_loop(int signo _U_) +#endif /* _WIN32 */ +{ + ws_debug("Exiting from main loop by signal"); + extcap_end_application = TRUE; + if (extcap_graceful_shutdown_cb != NULL) { + extcap_graceful_shutdown_cb(); + } +#ifdef _WIN32 + return TRUE; +#endif /* _WIN32 */ +} + void extcap_base_register_interface(extcap_parameters * extcap, const char * interface, const char * ifdescription, uint16_t dlt, const char * dltdescription ) { extcap_base_register_interface_ext(extcap, interface, ifdescription, dlt, NULL, dltdescription ); @@ -73,6 +96,38 @@ void extcap_base_register_interface_ext(extcap_parameters * extcap, extcap->interfaces = g_list_append(extcap->interfaces, (gpointer) iface); } +gboolean extcap_base_register_graceful_shutdown_cb(extcap_parameters * extcap _U_, void (*callback)(void)) +{ +#ifndef _WIN32 + struct sigaction sig_handler = { .sa_handler = extcap_exit_from_loop }; +#endif + + extcap_end_application = FALSE; + extcap_graceful_shutdown_cb = callback; +#ifdef _WIN32 + if (!SetConsoleCtrlHandler(extcap_exit_from_loop, TRUE)) { + ws_warning("Can't set console handler"); + return FALSE; + } +#else + /* Catch signals to be able to cleanup config later */ + if (sigaction(SIGINT, &sig_handler, NULL)) { + ws_warning("Can't set SIGINT signal handler"); + return FALSE; + } + if (sigaction(SIGTERM, &sig_handler, NULL)) { + ws_warning("Can't set SIGTERM signal handler"); + return FALSE; + } + if (sigaction(SIGPIPE, &sig_handler, NULL)) { + ws_warning("Can't set SIGPIPE signal handler"); + return FALSE; + } +#endif /* _WIN32 */ + + return TRUE; +} + void extcap_base_set_util_info(extcap_parameters * extcap, const char * exename, const char * major, const char * minor, const char * release, const char * helppage) { |