@ -188,6 +188,41 @@ static char *SCLogFilenameFromPattern(const char *pattern)
return filename ;
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 )
static void SCLogFileClose ( LogFileCtx * log_ctx )
{
{
if ( log_ctx - > fp )
if ( log_ctx - > fp )
@ -211,6 +246,12 @@ SCLogOpenFileFp(const char *path, const char *append_setting, uint32_t mode)
return NULL ;
return NULL ;
}
}
int rc = SCLogCreateDirectoryTree ( filename ) ;
if ( rc < 0 ) {
SCFree ( filename ) ;
return NULL ;
}
if ( ConfValIsTrue ( append_setting ) ) {
if ( ConfValIsTrue ( append_setting ) ) {
ret = fopen ( filename , " a " ) ;
ret = fopen ( filename , " a " ) ;
} else {
} else {