Project

General

Profile

Bug #74 ยป 0001-Fix-issue-74.patch

Jason Ish, 01/31/2010 01:54 AM

View differences:

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);
    (1-1/1)