extern int g_detect_disabled;
extern bool g_file_logger_enabled;
+extern bool g_filedata_logger_enabled;
/**
* \brief remove obsolete (inspected and logged) transactions
/* if file logging is enabled, we keep a tx active while some of the files aren't
* logged yet. */
- if (txd && txd->files_opened && g_file_logger_enabled) {
- if (txd->files_opened != txd->files_logged) {
+ if (txd && txd->files_opened) {
+ if (g_file_logger_enabled && txd->files_opened != txd->files_logged) {
+ skipped = true;
+ goto next;
+ }
+ if (g_filedata_logger_enabled && txd->files_opened != txd->files_stored) {
skipped = true;
goto next;
}
-/* Copyright (C) 2007-2014 Open Information Security Foundation
+/* Copyright (C) 2007-2021 Open Information Security Foundation
*
* You can copy, redistribute or modify this Program under the terms of
* the GNU General Public License version 2 as published by the Free
#include "util-validate.h"
#include "util-magic.h"
+bool g_filedata_logger_enabled = false;
+
typedef struct OutputLoggerThreadStore_ {
void *thread_data;
struct OutputLoggerThreadStore_ *next;
}
SCLogDebug("OutputRegisterFiledataLogger happy");
+ g_filedata_logger_enabled = true;
return 0;
}
return file_logged;
}
+static void CloseFile(const Packet *p, Flow *f, File *file)
+{
+ void *txv = AppLayerParserGetTx(p->proto, f->alproto, f->alstate, file->txid);
+ if (txv) {
+ AppLayerTxData *txd = AppLayerParserGetTxData(p->proto, f->alproto, txv);
+ if (txd)
+ txd->files_stored++;
+ }
+ file->flags |= FILE_STORED;
+}
+
static void OutputFiledataLogFfc(ThreadVars *tv, OutputLoggerThreadData *td,
Packet *p, FileContainer *ffc, const uint8_t call_flags,
const bool file_close, const bool file_trunc, const uint8_t dir)
FileCloseFilePtr(ff, NULL, 0, FILE_TRUNCATED);
}
CallLoggers(tv, store, p, ff, NULL, 0, OUTPUT_FILEDATA_FLAG_CLOSE, dir);
- ff->flags |= FILE_STORED;
+ CloseFile(p, p->flow, ff);
continue;
}
/* all done */
if (file_flags & OUTPUT_FILEDATA_FLAG_CLOSE) {
- ff->flags |= FILE_STORED;
+ CloseFile(p, p->flow, ff);
}
}
}