From b46e3ebeab70df5214fbd9b97401e3499d170312 Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Fri, 4 Oct 2024 16:28:05 -0600 Subject: [PATCH] examples/lib: use a main loop to wait for exit Instead of immediately entering shutdown, use SuricataMainLoop to wait for the end of the pcap. Ticket: #7240 --- examples/lib/custom/main.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/examples/lib/custom/main.c b/examples/lib/custom/main.c index b910b32887..12fb1f6bcb 100644 --- a/examples/lib/custom/main.c +++ b/examples/lib/custom/main.c @@ -88,6 +88,11 @@ static void *SimpleWorker(void *arg) const u_char *packet; while ((packet = pcap_next(fp, &pkthdr)) != NULL) { + /* Have we been asked to stop? */ + if (suricata_ctl_flags & SURICATA_STOP) { + goto done; + } + Packet *p = PacketGetFromQueueOrAlloc(); if (unlikely(p == NULL)) { /* Memory allocation error. */ @@ -125,8 +130,17 @@ static void *SimpleWorker(void *arg) done: pcap_close(fp); - /* Cleanup. */ - SCRunModeLibDestroyWorker(tv); + /* Stop the engine. */ + EngineStop(); + + /* Cleanup. + * + * Note that there is some thread synchronization between this + * function and SuricataShutdown such that they must be run + * concurrently at this time before either will exit. */ + SCTmThreadsSlotPktAcqLoopFinish(tv); + + SCLogNotice("Worker thread exiting"); pthread_exit(NULL); } @@ -211,7 +225,17 @@ int main(int argc, char **argv) SuricataPostInit(); + /* Run the main loop, this just waits for the worker thread to + * call EngineStop signalling Suricata that it is done reading the + * pcap. */ + SuricataMainLoop(); + /* Shutdown engine. */ + SCLogNotice("Shutting down"); + + /* Note that there is some thread synchronization between this + * function and SCTmThreadsSlotPktAcqLoopFinish that require them + * to be run concurrently at this time. */ SuricataShutdown(); GlobalsDestroy(); -- 2.47.2