@ -14,7 +14,7 @@ static const char *log_ident;
static int log_opt ;
static int log_facility = LOG_USER ;
static int log_mask = 0xff ;
static FILE * log_f ;
static int log_fd = - 1 ;
int setlogmask ( int maskpri )
{
@ -34,26 +34,21 @@ static const struct {
void closelog ( void )
{
LOCK ( & lock ) ;
if ( log_f ) f close( log_f ) ;
log_f = NULL ;
close ( log_fd ) ;
log_fd = - 1 ;
UNLOCK ( & lock ) ;
}
static void __openlog ( const char * ident , int opt , int facility )
{
int fd ;
log_ident = ident ;
log_opt = opt ;
log_facility = facility ;
if ( ! ( opt & LOG_NDELAY ) | | log_f ) return ;
if ( ! ( opt & LOG_NDELAY ) | | log_fd > = 0 ) return ;
fd = socket ( AF_UNIX , SOCK_DGRAM , 0 ) ;
fcntl ( fd , F_SETFD , FD_CLOEXEC ) ;
if ( connect ( fd , ( void * ) & log_addr , sizeof ( short ) + sizeof " /dev/log " ) < 0 )
close ( fd ) ;
else log_f = fdopen ( fd , " wb " ) ;
log_fd = socket ( AF_UNIX , SOCK_DGRAM , 0 ) ;
fcntl ( log_fd , F_SETFD , FD_CLOEXEC ) ;
}
void openlog ( const char * ident , int opt , int facility )
@ -63,42 +58,52 @@ void openlog(const char *ident, int opt, int facility)
UNLOCK ( & lock ) ;
}
void syslog ( int priority , const char * message , . . . )
void __v syslog( int priority , const char * message , va_list ap )
{
va_list ap ;
char timebuf [ 16 ] ;
time_t now ;
struct tm tm ;
//const char *fmt, *ident, *sep;
//int i;
char buf [ 256 ] ;
int pid ;
int l , l2 ;
if ( ! ( log_mask & LOG_MASK ( priority & 7 ) ) | | ( priority & ~ 0x3ff ) ) return ;
LOCK ( & lock ) ;
if ( ! log_f ) __openlog ( log_ident , log_opt | LOG_NDELAY , log_facility ) ;
if ( ! log_f ) {
UNLOCK ( & lock ) ;
return ;
if ( log_fd < 0 ) {
__openlog ( log_ident , log_opt | LOG_NDELAY , log_facility ) ;
if ( log_fd < 0 ) {
UNLOCK ( & lock ) ;
return ;
}
}
now = time ( NULL ) ;
gmtime_r ( & now , & tm ) ;
strftime ( timebuf , sizeof timebuf , " %b %e %T " , & tm ) ;
fprintf ( log_f , " <%d>%s " , priority , timebuf ) ;
if ( log_ident ) fprintf ( log_f , " %s " , log_ident ) ;
if ( log_opt & LOG_PID ) fprintf ( log_f , " [%d] " , getpid ( ) ) ;
if ( log_ident ) fprintf ( log_f , " : " ) ;
pid = ( log_opt & LOG_PID ) ? getpid ( ) : 0 ;
l = snprintf ( buf , sizeof buf , " <%d>%s %s%s%.0d%s: " ,
priority , timebuf ,
log_ident ? log_ident : " " ,
" [ " + ! pid , pid , " ] " + ! pid ) ;
l2 = vsnprintf ( buf + l , sizeof buf - l , message , ap ) ;
if ( l2 > = 0 ) {
l + = l2 ;
if ( buf [ l - 1 ] ! = ' \n ' ) buf [ l + + ] = ' \n ' ;
sendto ( log_fd , buf , l , 0 , ( void * ) & log_addr , 11 ) ;
}
UNLOCK ( & lock ) ;
}
void syslog ( int priority , const char * message , . . . )
{
va_list ap ;
va_start ( ap , message ) ;
vfprintf ( log_f , message , ap ) ;
__vsyslog ( priority , message , ap ) ;
va_end ( ap ) ;
fputc ( 0 , log_f ) ;
fflush ( log_f ) ;
// Note: LOG_CONS is not supported because it is annoying!!
// syslogd will send messages to console if it deems them appropriate!
UNLOCK ( & lock ) ;
}
weak_alias ( __vsyslog , vsyslog ) ;