diff --git a/configure.ac b/configure.ac index 59a66ca65..3f31bec6a 100644 --- a/configure.ac +++ b/configure.ac @@ -78,7 +78,7 @@ fi AC_HEADER_STDC AC_HEADER_TIME -AC_CHECK_FUNCS([lrintf strlcpy daemon dirname basename strcasecmp localtime_r posix_fallocate memmem strtold]) +AC_CHECK_FUNCS([lrintf strlcpy daemon dirname basename strcasecmp localtime_r posix_fallocate memmem strtold syslog]) AC_PROG_INSTALL AC_PROG_MAKE_SET ACX_PTHREAD diff --git a/daemon/daemon.c b/daemon/daemon.c index 63474c164..6fcf97e62 100644 --- a/daemon/daemon.c +++ b/daemon/daemon.c @@ -21,6 +21,9 @@ #include /* open */ #include +#ifdef HAVE_SYSLOG +#include +#endif #include /* daemon */ #include @@ -217,6 +220,55 @@ onFileAdded( tr_session * session, const char * dir, const char * file ) } } +static void +pumpLogMessages( tr_bool foreground ) +{ + const tr_msg_list * l; + tr_msg_list * list = tr_getQueuedMessages( ); + + for( l=list; l!=NULL; l=l->next ) + { +#ifdef HAVE_SYSLOG + if( foreground ) + { + char timestr[64]; + tr_getLogTimeStr( timestr, sizeof( timestr ) ); + if( l->name ) + fprintf( stderr, "[%s] %s %s (%s:%d)\n", timestr, l->name, l->message, l->file, l->line ); + else + fprintf( stderr, "[%s] %s (%s:%d)\n", timestr, l->message, l->file, l->line ); + } + else /* daemon... write to syslog */ + { + int priority; + + /* figure out the syslog priority */ + switch( l->level ) { + case TR_MSG_ERR: priority = LOG_ERR; break; + case TR_MSG_DBG: priority = LOG_DEBUG; break; + default: priority = LOG_INFO; break; + } + + if( l->name ) + syslog( priority, "%s %s (%s:%d)", l->name, l->message, l->file, l->line ); + else + syslog( priority, "%s (%s:%d)", l->message, l->file, l->line ); + } +#else + { + char timestr[64]; + tr_getLogTimeStr( timestr, sizeof( timestr ) ); + if( l->name ) + fprintf( stderr, "[%s] %s %s (%s:%d)\n", timestr, l->name, l->message, l->file, l->line ); + else + fprintf( stderr, "[%s] %s (%s:%d)\n", timestr, l->message, l->file, l->line ); + } +#endif + } + + tr_freeMessageList( list ); +} + int main( int argc, char ** argv ) { @@ -324,7 +376,7 @@ main( int argc, char ** argv ) } /* start the session */ - mySession = tr_sessionInit( "daemon", configDir, FALSE, &settings ); + mySession = tr_sessionInit( "daemon", configDir, TRUE, &settings ); tr_sessionSaveSettings( mySession, configDir, &settings ); if( tr_bencDictFindBool( &settings, TR_PREFS_KEY_RPC_AUTH_REQUIRED, &boolVal ) && boolVal ) @@ -356,13 +408,24 @@ main( int argc, char ** argv ) tr_ctorFree( ctor ); } - while( !closing ) - { +#ifdef HAVE_SYSLOG + if( !foreground ) + openlog( MY_NAME, LOG_CONS, LOG_DAEMON ); +#endif + + while( !closing ) { tr_wait( 1000 ); /* sleep one second */ dtr_watchdir_update( watchdir ); + pumpLogMessages( foreground ); } + closelog( ); + /* shutdown */ +#if HAVE_SYSLOG + if( !foreground ) + syslog( LOG_INFO, "%s", "Closing session" ); +#endif printf( "Closing transmission session..." ); tr_sessionSaveSettings( mySession, configDir, &settings ); dtr_watchdir_free( watchdir ); diff --git a/libtransmission/session.c b/libtransmission/session.c index 68376db58..51b00dc74 100644 --- a/libtransmission/session.c +++ b/libtransmission/session.c @@ -589,6 +589,7 @@ tr_sessionInit( const char * tag, tr_bool messageQueuingEnabled, tr_benc * clientSettings ) { + int64_t i; tr_session * session; struct init_data data; @@ -602,6 +603,10 @@ tr_sessionInit( const char * tag, session->magicNumber = SESSION_MAGIC_NUMBER; tr_bencInitList( &session->removedTorrents, 0 ); + /* nice to start logging at the very beginning */ + if( tr_bencDictFindInt( clientSettings, TR_PREFS_KEY_MSGLEVEL, &i ) ) + tr_setMessageLevel( i ); + /* start the libtransmission thread */ tr_netInit( ); /* must go before tr_eventInit */ tr_eventInit( session ); @@ -722,6 +727,9 @@ sessionSetImpl( void * vdata ) assert( tr_bencIsDict( settings ) ); assert( tr_amInEventThread( session ) ); + if( tr_bencDictFindInt( settings, TR_PREFS_KEY_MSGLEVEL, &i ) ) + tr_setMessageLevel( i ); + if( tr_bencDictFindInt( settings, TR_PREFS_KEY_UMASK, &i ) ) { session->umask = (mode_t)i; umask( session->umask ); @@ -732,8 +740,6 @@ sessionSetImpl( void * vdata ) tr_sessionSetLazyBitfieldEnabled( session, boolVal ); if( tr_bencDictFindInt( settings, TR_PREFS_KEY_PEER_LIMIT_TORRENT, &i ) ) tr_sessionSetPeerLimitPerTorrent( session, i ); - if( tr_bencDictFindInt( settings, TR_PREFS_KEY_MSGLEVEL, &i ) ) - tr_setMessageLevel( i ); if( tr_bencDictFindBool( settings, TR_PREFS_KEY_PEX_ENABLED, &boolVal ) ) tr_sessionSetPexEnabled( session, boolVal ); if( tr_bencDictFindBool( settings, TR_PREFS_KEY_DHT_ENABLED, &boolVal ) ) @@ -857,20 +863,6 @@ sessionSetImpl( void * vdata ) else if( tr_bencDictFindBool( settings, TR_PREFS_KEY_ALT_SPEED_ENABLED, &boolVal ) ) useAltSpeed( session, boolVal, FALSE ); - - - fprintf( stderr, "what was passed in: \n%s\n", tr_bencToStr( settings, TR_FMT_JSON, NULL ) ); - - fprintf( stderr, "-=-=-=-=-=-\n" ); - - { - tr_benc tmp; - tr_bencInitDict( &tmp, 0 ); - tr_sessionGetSettings( session, &tmp ); - fprintf( stderr, "and the session's state now: \n%s\n", tr_bencToStr( &tmp, TR_FMT_JSON, NULL ) ); - tr_bencFree( &tmp ); - } - --session->waiting; }