aboutsummaryrefslogtreecommitdiffstats
path: root/extcap/extcap-base.c
diff options
context:
space:
mode:
authorj.novak@netsystem.cz <j.novak@netsystem.cz>2022-08-29 19:46:59 +0000
committerGerald Combs <gerald@wireshark.org>2022-08-29 19:46:59 +0000
commit90143855af7c0c5ffd2ee5374dd7df17a246299c (patch)
tree4aed92f776e046b528974240360e55e23f82ec47 /extcap/extcap-base.c
parent621b94a090173706af429a22335eae8ff4f9e86d (diff)
extcap: Signal processing unified for C based extcaps
Diffstat (limited to 'extcap/extcap-base.c')
-rw-r--r--extcap/extcap-base.c55
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)
{