mirror of
https://github.com/transmission/transmission.git
synced 2026-05-08 09:39:08 +01:00
(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:
+52
-46
@@ -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 )
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user