#include "DALog.h"
#include "DABase.h"
#include <asl.h>
#include <syslog.h>
static Boolean __gDALogDebug = FALSE;
static FILE * __gDALogDebugFile = NULL;
static char * __gDALogDebugHeaderLast = NULL;
static char * __gDALogDebugHeaderNext = NULL;
static Boolean __gDALogDebugHeaderReset = FALSE;
static Boolean __gDALogError = FALSE;
static Boolean __gDALogVerbose = FALSE;
static void __DALog( int level, const char * format, va_list arguments )
{
char * message;
if ( arguments )
{
message = ___CFStringCreateCStringWithFormatAndArguments( format, arguments );
}
else
{
message = strdup( format );
}
if ( message )
{
switch ( level )
{
case LOG_DEBUG:
{
if ( __gDALogDebug )
{
if ( __gDALogDebugFile )
{
time_t clock = time( NULL );
char stamp[10];
if ( strftime( stamp, sizeof( stamp ), "%T ", localtime( &clock ) ) )
{
fprintf( __gDALogDebugFile, "%s", stamp );
}
fprintf( __gDALogDebugFile, "%s", message );
fprintf( __gDALogDebugFile, "\n" );
fflush( __gDALogDebugFile );
}
}
break;
}
case LOG_ERR:
{
if ( __gDALogError )
{
syslog( level, "%s", message );
break;
}
}
case LOG_INFO:
{
if ( __gDALogVerbose )
{
syslog( level, "%s", message );
}
break;
}
default:
{
syslog( level, "%s", message );
break;
}
}
free( message );
}
}
void DALog( const char * format, ... )
{
va_list arguments;
va_start( arguments, format );
__DALog( LOG_NOTICE, format, arguments );
va_end( arguments );
}
void DALogClose( void )
{
__gDALogDebug = FALSE;
__gDALogError = FALSE;
__gDALogVerbose = FALSE;
if ( __gDALogDebugFile )
{
fclose( __gDALogDebugFile );
__gDALogDebugFile = NULL;
}
closelog( );
}
void DALogDebug( const char * format, ... )
{
va_list arguments;
va_start( arguments, format );
if ( __gDALogDebugHeaderReset )
{
assert( __gDALogDebugHeaderNext );
if ( __gDALogDebugHeaderLast )
{
free( __gDALogDebugHeaderLast );
}
__gDALogDebugHeaderLast = __gDALogDebugHeaderNext;
__gDALogDebugHeaderNext = NULL;
__gDALogDebugHeaderReset = FALSE;
__DALog( LOG_DEBUG, "", NULL );
__DALog( LOG_DEBUG, __gDALogDebugHeaderLast, NULL );
}
__DALog( LOG_DEBUG, format, arguments );
va_end( arguments );
}
void DALogDebugHeader( const char * format, ... )
{
va_list arguments;
va_start( arguments, format );
if ( __gDALogDebugHeaderNext )
{
free( __gDALogDebugHeaderNext );
__gDALogDebugHeaderNext = NULL;
__gDALogDebugHeaderReset = FALSE;
}
if ( format )
{
char * header;
header = ___CFStringCreateCStringWithFormatAndArguments( format, arguments );
if ( header )
{
if ( __gDALogDebugHeaderLast )
{
if ( strcmp( __gDALogDebugHeaderLast, header ) )
{
__gDALogDebugHeaderNext = header;
__gDALogDebugHeaderReset = TRUE;
}
else
{
free( header );
}
}
else
{
__gDALogDebugHeaderNext = header;
__gDALogDebugHeaderReset = TRUE;
}
}
}
va_end( arguments );
}
void DALogError( const char * format, ... )
{
va_list arguments;
va_start( arguments, format );
__DALog( LOG_DEBUG, format, arguments );
va_end( arguments );
va_start( arguments, format );
__DALog( LOG_ERR, format, arguments );
va_end( arguments );
}
void DALogOpen( char * name, Boolean debug, Boolean error, Boolean verbose )
{
asl_set_filter( NULL, ASL_FILTER_MASK_UPTO( ASL_LEVEL_DEBUG ) );
openlog( name, LOG_PID, LOG_DAEMON );
if ( debug )
{
char * path;
asprintf( &path, "/var/log/%s.log", name );
if ( path )
{
__gDALogDebugFile = fopen( path, "a" );
free( path );
}
}
__gDALogDebug = debug;
__gDALogError = error;
__gDALogVerbose = verbose;
}
void DALogVerbose( const char * format, ... )
{
va_list arguments;
va_start( arguments, format );
__DALog( LOG_INFO, format, arguments );
va_end( arguments );
}