(trunk daemon) #2877 "Don't let the daemon launch if settings.json is corrupt" -- implemented in trunk for 1.90

This commit is contained in:
Charles Kerr
2010-02-07 22:17:42 +00:00
parent fb6ac30ca3
commit 0ea501355e
3 changed files with 65 additions and 53 deletions
+52 -46
View File
@@ -227,6 +227,47 @@ onFileAdded( tr_session * session, const char * dir, const char * file )
}
}
static void
printMessage( tr_bool foreground, int level, const char * name, const char * message, const char * file, int line )
{
#ifdef HAVE_SYSLOG
if( foreground )
{
char timestr[64];
tr_getLogTimeStr( timestr, sizeof( timestr ) );
if( name )
fprintf( stderr, "[%s] %s %s (%s:%d)\n", timestr, name, message, file, line );
else
fprintf( stderr, "[%s] %s (%s:%d)\n", timestr, message, file, line );
}
else /* daemon... write to syslog */
{
int priority;
/* figure out the syslog priority */
switch( level ) {
case TR_MSG_ERR: priority = LOG_ERR; break;
case TR_MSG_DBG: priority = LOG_DEBUG; break;
default: priority = LOG_INFO; break;
}
if( name )
syslog( priority, "%s %s (%s:%d)", name, message, file, line );
else
syslog( priority, "%s (%s:%d)", message, file, line );
}
#else
{
char timestr[64];
tr_getLogTimeStr( timestr, sizeof( timestr ) );
if( name )
fprintf( stderr, "[%s] %s %s (%s:%d)\n", timestr, name, message, file, line );
else
fprintf( stderr, "[%s] %s (%s:%d)\n", timestr, message, file, line );
}
#endif
}
static void
pumpLogMessages( tr_bool foreground )
{
@@ -234,44 +275,7 @@ pumpLogMessages( tr_bool foreground )
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
}
printMessage( foreground, l->level, l->name, l->message, l->file, l->line );
tr_freeMessageList( list );
}
@@ -299,7 +303,6 @@ main( int argc, char ** argv )
tr_bencInitDict( &settings, 0 );
configDir = getConfigDir( argc, (const char**)argv );
loaded = tr_sessionLoadSettings( &settings, configDir, MY_NAME );
tr_bencDictAddBool( &settings, TR_PREFS_KEY_RPC_ENABLED, TRUE );
/* overwrite settings from the comamndline */
tr_optind = 1;
@@ -390,6 +393,12 @@ main( int argc, char ** argv )
}
}
if( !loaded )
{
printMessage( foreground, TR_MSG_ERR, MY_NAME, "Error loading config file -- exiting.", __FILE__, __LINE__ );
return -1;
}
if( dumpSettings )
{
char * str = tr_bencToStr( &settings, TR_FMT_JSON, NULL );
@@ -400,18 +409,15 @@ main( int argc, char ** argv )
if( !foreground && tr_daemon( TRUE, FALSE ) < 0 )
{
fprintf( stderr, "failed to daemonize: %s\n", strerror( errno ) );
char buf[256];
tr_snprintf( buf, sizeof( buf ), "Failed to dameonize: %s", tr_strerror( errno ) );
printMessage( foreground, TR_MSG_ERR, MY_NAME, buf, __FILE__, __LINE__ );
exit( 1 );
}
/* start the session */
mySession = tr_sessionInit( "daemon", configDir, TRUE, &settings );
if( loaded )
tr_ninf( NULL, "Using settings from \"%s\"", configDir );
else
tr_nerr( NULL, "Couldn't find settings in \"%s\"; using defaults", configDir );
tr_ninf( NULL, "Using settings from \"%s\"", configDir );
tr_sessionSaveSettings( mySession, configDir, &settings );
if( tr_bencDictFindBool( &settings, TR_PREFS_KEY_RPC_AUTH_REQUIRED, &boolVal ) && boolVal )
+7 -4
View File
@@ -11,6 +11,7 @@
*/
#include <assert.h>
#include <errno.h> /* ENOENT */
#include <stdlib.h>
#include <string.h> /* memcpy */
@@ -362,6 +363,7 @@ tr_sessionGetSettings( tr_session * s, struct tr_benc * d )
tr_bool
tr_sessionLoadSettings( tr_benc * d, const char * configDir, const char * appName )
{
int err = 0;
char * filename;
tr_benc fileSettings;
tr_benc sessionDefaults;
@@ -383,15 +385,16 @@ tr_sessionLoadSettings( tr_benc * d, const char * configDir, const char * appNam
/* file settings override the defaults */
filename = tr_buildPath( configDir, "settings.json", NULL );
if( !tr_bencLoadFile( &fileSettings, TR_FMT_JSON, filename ) ) {
err = tr_bencLoadFile( &fileSettings, TR_FMT_JSON, filename );
if( !err ) {
tr_bencMergeDicts( d, &fileSettings );
tr_bencFree( &fileSettings );
success = TRUE;
}
/* cleanup */
tr_bencFree( &sessionDefaults );
tr_free( filename );
success = (err==0) || (err==ENOENT);
return success;
}
@@ -410,7 +413,8 @@ tr_sessionSaveSettings( tr_session * session,
/* the existing file settings are the fallback values */
{
tr_benc fileSettings;
if( !tr_bencLoadFile( &fileSettings, TR_FMT_JSON, filename ) )
const int err = tr_bencLoadFile( &fileSettings, TR_FMT_JSON, filename );
if( !err )
{
tr_bencMergeDicts( &settings, &fileSettings );
tr_bencFree( &fileSettings );
@@ -431,7 +435,6 @@ tr_sessionSaveSettings( tr_session * session,
/* save the result */
tr_bencToFile( &settings, TR_FMT_JSON, filename );
tr_inf( "Saved \"%s\"", filename );
/* cleanup */
tr_free( filename );
+6 -3
View File
@@ -46,7 +46,7 @@
#include "version.h"
int messageLevel = 0;
int messageLevel = TR_MSG_INF;
static tr_lock * messageLock = NULL;
static tr_bool messageQueuing = FALSE;
static tr_msg_list * messageQueue = NULL;
@@ -284,7 +284,8 @@ tr_msg( const char * file, int line,
char buf[1024];
va_list ap;
tr_lockLock( messageLock );
if( messageLock != NULL )
tr_lockLock( messageLock );
/* build the text message */
*buf = '\0';
@@ -342,7 +343,9 @@ tr_msg( const char * file, int line,
}
}
tr_lockUnlock( messageLock );
if( messageLock != NULL )
tr_lockUnlock( messageLock );
errno = err;
}