From: Angelo Mirabella Date: Wed, 21 Feb 2024 10:05:58 +0000 (-0800) Subject: libsuricata: reorganize SuricataMain code X-Git-Tag: suricata-8.0.0-beta1~1599 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67d23c7b6122063a5fc2dee52fa0928ff81488b0;p=thirdparty%2Fsuricata.git libsuricata: reorganize SuricataMain code Split SuricataMain code in smaller functions. This is a first step towards running as a library. --- diff --git a/src/suricata.c b/src/suricata.c index 462537c14e..cb8c455286 100644 --- a/src/suricata.c +++ b/src/suricata.c @@ -213,6 +213,9 @@ uint16_t g_livedev_mask = 0xffff; * support */ bool g_disable_hashing = false; +/* snapshot of the system's hugepages before system intitialization. */ +SystemHugepageSnapshot *prerun_snap = NULL; + /** Suricata instance */ SCInstance suricata; @@ -2883,14 +2886,17 @@ int InitGlobal(void) return 0; } -int SuricataMain(int argc, char **argv) +void SuricataPreInit(const char *progname) { - SCInstanceInit(&suricata, argv[0]); + SCInstanceInit(&suricata, progname); if (InitGlobal() != 0) { exit(EXIT_FAILURE); } +} +void SuricataInit(int argc, char **argv) +{ #ifdef OS_WIN32 /* service initialization */ if (WindowsInitService(argc, argv) != 0) { @@ -2982,7 +2988,6 @@ int SuricataMain(int argc, char **argv) goto out; } - SystemHugepageSnapshot *prerun_snap = NULL; if (run_mode == RUNMODE_DPDK) prerun_snap = SystemHugepageSnapshotCreate(); @@ -2993,8 +2998,29 @@ int SuricataMain(int argc, char **argv) UnixManagerThreadSpawnNonRunmode(suricata.unix_socket_enabled); } + return; + +out: + GlobalsDestroy(&suricata); + exit(EXIT_SUCCESS); +} + +void SuricataShutdown(void) +{ + /* Update the engine stage/status flag */ + SC_ATOMIC_SET(engine_stage, SURICATA_DEINIT); + + UnixSocketKillSocketThread(); + PostRunDeinit(suricata.run_mode, &suricata.start_time); + /* kill remaining threads */ + TmThreadKillThreads(); +} + +void SuricataPostInit(void) +{ /* Wait till all the threads have been initialized */ if (TmThreadWaitOnThreadInit() == TM_ECODE_FAILED) { + SystemHugepageSnapshotDestroy(prerun_snap); FatalError("Engine initialization failed, " "aborting..."); } @@ -3036,6 +3062,7 @@ int SuricataMain(int argc, char **argv) /* Must ensure all threads are fully operational before continuing with init process */ if (TmThreadWaitOnThreadRunning() != TM_ECODE_OK) { + SystemHugepageSnapshotDestroy(prerun_snap); exit(EXIT_FAILURE); } @@ -3050,17 +3077,23 @@ int SuricataMain(int argc, char **argv) SystemHugepageSnapshotDestroy(postrun_snap); } SCPledge(); - SuricataMainLoop(&suricata); +} - /* Update the engine stage/status flag */ - SC_ATOMIC_SET(engine_stage, SURICATA_DEINIT); +int SuricataMain(int argc, char **argv) +{ + /* Pre-initialization tasks: initialize global context and variables. */ + SuricataPreInit(argv[0]); - UnixSocketKillSocketThread(); - PostRunDeinit(suricata.run_mode, &suricata.start_time); - /* kill remaining threads */ - TmThreadKillThreads(); + /* Initialization tasks: parse command line options, load yaml, start runmode... */ + SuricataInit(argc, argv); -out: + /* Post-initialization tasks: wait on thread start/running and get ready for the main loop. */ + SuricataPostInit(); + + SuricataMainLoop(&suricata); + + /* Shutdown engine. */ + SuricataShutdown(); GlobalsDestroy(&suricata); exit(EXIT_SUCCESS); diff --git a/src/suricata.h b/src/suricata.h index fe95974e11..ec2a25e28d 100644 --- a/src/suricata.h +++ b/src/suricata.h @@ -191,7 +191,11 @@ int SuriHasSigFile(void); extern int run_mode; +void SuricataPreInit(const char *progname); +void SuricataInit(int argc, char **argv); +void SuricataPostInit(void); int SuricataMain(int argc, char **argv); +void SuricataShutdown(void); int InitGlobal(void); int PostConfLoadedSetup(SCInstance *suri); void PostConfLoadedDetectSetup(SCInstance *suri);