#define MODULE_NAME "LogFilestoreLog"
static char g_logfile_base_dir[PATH_MAX] = "/tmp";
+static char g_working_file_suffix[PATH_MAX] = ".tmp";
SC_ATOMIC_DECLARE(uint32_t, filestore_open_file_cnt); /**< Atomic counter of simultaneously open files */
return g_file_store_max_open_files;
}
-static void LogFilestoreLogCreateMetaFile(const Packet *p, const File *ff, char *filename, int ipver) {
+static int g_file_store_include_pid = 0;
+
+static void FileIncludePidEnable(void)
+{
+ g_file_store_include_pid = 1;
+}
+
+static int FileIncludePid(void)
+{
+ return g_file_store_include_pid;
+}
+
+static void LogFilestoreLogCreateMetaFile(const Packet *p, const File *ff, char *base_filename, int ipver) {
if (!FileWriteMeta())
return;
char metafilename[PATH_MAX] = "";
- snprintf(metafilename, sizeof(metafilename), "%s.meta", filename);
+ snprintf(metafilename, sizeof(metafilename), "%s.meta%s", base_filename,
+ g_working_file_suffix);
FILE *fp = fopen(metafilename, "w+");
if (fp != NULL) {
char timebuf[64];
static void LogFilestoreLogCloseMetaFile(const File *ff)
{
- if (!FileWriteMeta())
- return;
-
- char filename[PATH_MAX] = "";
- snprintf(filename, sizeof(filename), "%s/file.%u",
- g_logfile_base_dir, ff->file_store_id);
- char metafilename[PATH_MAX] = "";
- snprintf(metafilename, sizeof(metafilename), "%s.meta", filename);
- FILE *fp = fopen(metafilename, "a");
+ char pid_expression[PATH_MAX] = "";
+ if (FileIncludePid())
+ snprintf(pid_expression, sizeof(pid_expression), ".%d", getpid());
+ char final_filename[PATH_MAX] = "";
+ snprintf(final_filename, sizeof(final_filename), "%s/file%s.%u",
+ g_logfile_base_dir, pid_expression, ff->file_store_id);
+ char final_metafilename[PATH_MAX] = "";
+ snprintf(final_metafilename, sizeof(final_metafilename),
+ "%s.meta", final_filename);
+ char working_metafilename[PATH_MAX] = "";
+ snprintf(working_metafilename, sizeof(working_metafilename),
+ "%s%s", final_metafilename, g_working_file_suffix);
+ FILE *fp = fopen(working_metafilename, "a");
if (fp != NULL) {
#ifdef HAVE_MAGIC
fprintf(fp, "MAGIC: %s\n",
fclose(fp);
} else {
- SCLogInfo("opening %s failed: %s", metafilename, strerror(errno));
+ SCLogInfo("opening %s failed: %s", working_metafilename,
+ strerror(errno));
+ }
+}
+
+static void LogFilestoreFinalizeFiles(const File *ff) {
+ char pid_expression[PATH_MAX] = "";
+ if (FileIncludePid())
+ snprintf(pid_expression, sizeof(pid_expression), ".%d", getpid());
+ char final_filename[PATH_MAX] = "";
+ snprintf(final_filename, sizeof(final_filename), "%s/file%s.%u",
+ g_logfile_base_dir, pid_expression, ff->file_store_id);
+ char working_filename[PATH_MAX] = "";
+ snprintf(working_filename, sizeof(working_filename), "%s%s",
+ final_filename, g_working_file_suffix);
+ if (rename(working_filename, final_filename) != 0) {
+ SCLogWarning(SC_WARN_RENAMING_FILE, "renaming file %s to %s failed",
+ working_filename, final_filename);
+ return;
+ }
+ if (FileWriteMeta()) {
+ LogFilestoreLogCloseMetaFile(ff);
+ char final_metafilename[PATH_MAX] = "";
+ snprintf(final_metafilename, sizeof(final_metafilename),
+ "%s.meta", final_filename);
+ char working_metafilename[PATH_MAX] = "";
+ snprintf(working_metafilename, sizeof(working_metafilename),
+ "%s%s", final_metafilename, g_working_file_suffix);
+ if (rename(working_metafilename, final_metafilename) != 0) {
+ SCLogWarning(SC_WARN_RENAMING_FILE,
+ "renaming metafile %s to %s failed", working_metafilename,
+ final_metafilename);
+ }
}
}
SCLogDebug("ff %p, data %p, data_len %u", ff, data, data_len);
- snprintf(filename, sizeof(filename), "%s/file.%u",
- g_logfile_base_dir, ff->file_store_id);
+ char pid_expression[PATH_MAX] = "";
+ if (FileIncludePid())
+ snprintf(pid_expression, sizeof(pid_expression), ".%d", getpid());
+ char base_filename[PATH_MAX] = "";
+ snprintf(base_filename, sizeof(base_filename), "%s/file%s.%u",
+ g_logfile_base_dir, pid_expression, ff->file_store_id);
+ snprintf(filename, sizeof(filename), "%s%s", base_filename,
+ g_working_file_suffix);
if (flags & OUTPUT_FILEDATA_FLAG_OPEN) {
aft->file_cnt++;
/* create a .meta file that contains time, src/dst/sp/dp/proto */
- LogFilestoreLogCreateMetaFile(p, ff, filename, ipver);
+ LogFilestoreLogCreateMetaFile(p, ff, base_filename, ipver);
if (SC_ATOMIC_GET(filestore_open_file_cnt) < FileGetMaxOpenFiles()) {
SC_ATOMIC_ADD(filestore_open_file_cnt, 1);
ff->fd = -1;
SC_ATOMIC_SUB(filestore_open_file_cnt, 1);
}
- LogFilestoreLogCloseMetaFile(ff);
+ LogFilestoreFinalizeFiles(ff);
}
return 0;
}
}
+ const char *include_pid = ConfNodeLookupChildValue(conf, "include-pid");
+ if (include_pid != NULL && ConfValIsTrue(include_pid)) {
+ FileIncludePidEnable();
+ SCLogInfo("enabling pid as a part of all file names");
+ }
+
SCReturnPtr(output_ctx, "OutputCtx");
}