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)
return NULL;
}
+ int rc = SCLogCreateDirectoryTree(filename);
+ if (rc < 0) {
+ SCFree(filename);
+ return NULL;
+ }
+
if (ConfValIsTrue(append_setting)) {
ret = fopen(filename, "a");
} else {