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 {