From ffbf8cec162c9f6c77663d4df22e17bd5f8b5a01 Mon Sep 17 00:00:00 2001 From: Mats Klepsland Date: Tue, 14 Feb 2017 10:32:33 +0100 Subject: [PATCH] logging: create log directories when needed Recursively create new log directories when needed. This makes it possible to use date modifiers in the file path to create directories based on date, e.g.: /var/log/suricata/2017/02/14/ --- src/util-logopenfile.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/util-logopenfile.c b/src/util-logopenfile.c index cc1f0b1fb9..873df9c835 100644 --- a/src/util-logopenfile.c +++ b/src/util-logopenfile.c @@ -188,6 +188,41 @@ static char *SCLogFilenameFromPattern(const char *pattern) return filename; } +/** \brief recursively create missing log directories + * \param path path to log file + * \retval 0 on success + * \retval -1 on error + */ +static int SCLogCreateDirectoryTree(const char *filepath) +{ + char pathbuf[PATH_MAX]; + char *p; + size_t len = strlen(filepath); + + if (len > PATH_MAX - 1) { + return -1; + } + + strlcpy(pathbuf, filepath, len); + + for (p = pathbuf + 1; *p; p++) { + if (*p == '/') { + /* Truncate, while creating directory */ + *p = '\0'; + + if (mkdir(pathbuf, S_IRWXU | S_IRGRP | S_IXGRP) != 0) { + if (errno != EEXIST) { + return -1; + } + } + + *p = '/'; + } + } + + return 0; +} + static void SCLogFileClose(LogFileCtx *log_ctx) { if (log_ctx->fp) @@ -211,6 +246,12 @@ SCLogOpenFileFp(const char *path, const char *append_setting, uint32_t mode) return NULL; } + int rc = SCLogCreateDirectoryTree(filename); + if (rc < 0) { + SCFree(filename); + return NULL; + } + if (ConfValIsTrue(append_setting)) { ret = fopen(filename, "a"); } else {