Bug #74 ยป 0001-Fix-issue-74.patch
| src/runmodes.c | ||
|---|---|---|
|
#include "output.h"
|
||
|
/**
|
||
|
* Define a linked list to use as a registry of LogFileCtx shutdown hooks.
|
||
|
* A list of output modules that will be active for the run mode.
|
||
|
*/
|
||
|
typedef struct LogFileCtxShutDownHook_ {
|
||
|
typedef struct RunModeOutput_ {
|
||
|
TmModule *tm_module;
|
||
|
LogFileCtx *logfile_ctx;
|
||
|
TAILQ_ENTRY(LogFileCtxShutDownHook_) entries;
|
||
|
} LogFileCtxShutDownHook;
|
||
|
TAILQ_HEAD(, LogFileCtxShutDownHook_) LogFileCtxShutDownHooks =
|
||
|
TAILQ_HEAD_INITIALIZER(LogFileCtxShutDownHooks);
|
||
|
TAILQ_ENTRY(RunModeOutput_) entries;
|
||
|
} RunModeOutput;
|
||
|
TAILQ_HEAD(, RunModeOutput_) RunModeOutputs =
|
||
|
TAILQ_HEAD_INITIALIZER(RunModeOutputs);
|
||
|
/**
|
||
|
* \brief Register a LogFileCtx for shutdown cleanup.
|
||
|
*
|
||
|
* \param logfile_ctx A point to the LogFileCtx to free on shutdown.
|
||
|
* Cleanup the run mode.
|
||
|
*/
|
||
|
void RegisterLogFileCtx(LogFileCtx *logfile_ctx)
|
||
|
void RunModeShutDown(void)
|
||
|
{
|
||
|
LogFileCtxShutDownHook *hook = calloc(1, sizeof(LogFileCtxShutDownHook));
|
||
|
if (hook == NULL) {
|
||
|
SCLogError(SC_ERR_MEM_ALLOC,
|
||
|
"Failed to allocate memory for LogFileCtx shutdown hook");
|
||
|
exit(EXIT_FAILURE);
|
||
|
/* Close any log files. */
|
||
|
RunModeOutput *output;
|
||
|
while ((output = TAILQ_FIRST(&RunModeOutputs))) {
|
||
|
SCLogDebug("Shutting down output %s.", output->tm_module->name);
|
||
|
TAILQ_REMOVE(&RunModeOutputs, output, entries);
|
||
|
if (output->logfile_ctx != NULL)
|
||
|
LogFileFreeCtx(output->logfile_ctx);
|
||
|
free(output);
|
||
|
}
|
||
|
hook->logfile_ctx = logfile_ctx;
|
||
|
TAILQ_INSERT_TAIL(&LogFileCtxShutDownHooks, hook, entries);
|
||
|
}
|
||
|
/**
|
||
|
* Run the log file shutdown hooks. The hooks are also unregistered
|
||
|
* and the memory is freed.
|
||
|
* Initialize the output modules.
|
||
|
*/
|
||
|
static void RunLogFileCtxShutDownHooks(void)
|
||
|
{
|
||
|
LogFileCtxShutDownHook *hook;
|
||
|
while ((hook = TAILQ_FIRST(&LogFileCtxShutDownHooks))) {
|
||
|
TAILQ_REMOVE(&LogFileCtxShutDownHooks, hook, entries);
|
||
|
LogFileFreeCtx(hook->logfile_ctx);
|
||
|
free(hook);
|
||
|
}
|
||
|
}
|
||
|
void RunModeShutDown(void)
|
||
|
{
|
||
|
RunLogFileCtxShutDownHooks();
|
||
|
}
|
||
|
static void SetupOutputs(ThreadVars *tv_outputs)
|
||
|
void RunModeInitializeOutputs(void)
|
||
|
{
|
||
|
ConfNode *outputs = ConfGetNode("outputs");
|
||
|
if (outputs == NULL) {
|
||
| ... | ... | |
|
"TmModuleGetByName for %s failed", module->name);
|
||
|
exit(EXIT_FAILURE);
|
||
|
}
|
||
|
TmVarSlotSetFuncAppend(tv_outputs, tm_module, logfile_ctx);
|
||
|
RegisterLogFileCtx(logfile_ctx);
|
||
|
RunModeOutput *runmode_output = calloc(1, sizeof(RunModeOutput));
|
||
|
if (runmode_output == NULL) {
|
||
|
SCLogError(SC_ERR_MEM_ALLOC,
|
||
|
"Failed to allocate memory for output.");
|
||
|
exit(EXIT_FAILURE);
|
||
|
}
|
||
|
runmode_output->tm_module = tm_module;
|
||
|
runmode_output->logfile_ctx = logfile_ctx;
|
||
|
TAILQ_INSERT_TAIL(&RunModeOutputs, runmode_output, entries);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* Setup the outputs for this run mode.
|
||
|
*
|
||
|
* \param tv The ThreadVars for the thread the outputs will be
|
||
|
* appended to.
|
||
|
*/
|
||
|
static void SetupOutputs(ThreadVars *tv)
|
||
|
{
|
||
|
RunModeOutput *output;
|
||
|
TAILQ_FOREACH(output, &RunModeOutputs, entries) {
|
||
|
TmVarSlotSetFuncAppend(tv, output->tm_module, output->logfile_ctx);
|
||
|
}
|
||
|
}
|
||
|
int RunModeIdsPcap(DetectEngineCtx *de_ctx, char *iface) {
|
||
|
TimeModeSetLive();
|
||
| ... | ... | |
|
exit(EXIT_FAILURE);
|
||
|
}
|
||
|
ThreadVars *tv_outputs1 = TmThreadCreatePacketHandler("Outputs1",
|
||
|
"alert-queue1", "simple", "packetpool", "packetpool", "varslot");
|
||
|
SetupOutputs(tv_outputs1);
|
||
|
if (TmThreadSpawn(tv_outputs1) != TM_ECODE_OK) {
|
||
|
printf("ERROR: TmThreadSpawn failed\n");
|
||
|
exit(EXIT_FAILURE);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
| src/runmodes.h | ||
|---|---|---|
|
#ifndef __RUNMODES_H__
|
||
|
#define __RUNMODES_H__
|
||
|
void RunModeInitializeOutputs(void);
|
||
|
int RunModeIdsPcap(DetectEngineCtx *, char *);
|
||
|
int RunModeIdsPcap2(DetectEngineCtx *, char *);
|
||
|
int RunModeIdsPcap3(DetectEngineCtx *, char *);
|
||
| src/suricata.c | ||
|---|---|---|
|
memset(&start_time, 0, sizeof(start_time));
|
||
|
gettimeofday(&start_time, NULL);
|
||
|
RunModeInitializeOutputs();
|
||
|
if (mode == MODE_PCAP_DEV) {
|
||
|
//RunModeIdsPcap3(de_ctx, pcap_dev);
|
||
|
RunModeIdsPcap2(de_ctx, pcap_dev);
|
||