1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-02-21 21:57:01 +00:00

#1209: shttpd crash when setting port to one already in use

This commit is contained in:
Charles Kerr 2008-09-03 19:59:09 +00:00
parent 8c421bd0ec
commit 712df8f761

View file

@ -38,12 +38,13 @@
struct tr_rpc_server struct tr_rpc_server
{ {
unsigned int isEnabled : 1;
unsigned int isPasswordEnabled : 1;
int port; int port;
time_t lastRequestTime; time_t lastRequestTime;
struct shttpd_ctx * ctx; struct shttpd_ctx * ctx;
tr_handle * session; tr_handle * session;
struct event timer; struct event timer;
int isPasswordEnabled;
char * username; char * username;
char * password; char * password;
char * acl; char * acl;
@ -408,13 +409,15 @@ startServer( tr_rpc_server * server )
argv[argc] = NULL; /* shttpd_init() wants it null-terminated */ argv[argc] = NULL; /* shttpd_init() wants it null-terminated */
server->ctx = shttpd_init( argc, argv ); if(( server->ctx = shttpd_init( argc, argv )))
shttpd_register_uri( server->ctx, "/transmission/rpc", handle_rpc, server ); {
shttpd_register_uri( server->ctx, "/transmission/upload", handle_upload, server ); shttpd_register_uri( server->ctx, "/transmission/rpc", handle_rpc, server );
shttpd_register_uri( server->ctx, "/", handle_root, server ); shttpd_register_uri( server->ctx, "/transmission/upload", handle_upload, server );
shttpd_register_uri( server->ctx, "/", handle_root, server );
evtimer_set( &server->timer, rpcPulse, server ); evtimer_set( &server->timer, rpcPulse, server );
evtimer_add( &server->timer, &tv ); evtimer_add( &server->timer, &tv );
}
for( i=0; i<argc; ++i ) for( i=0; i<argc; ++i )
tr_free( argv[i] ); tr_free( argv[i] );
@ -439,10 +442,11 @@ stopServer( tr_rpc_server * server )
void void
tr_rpcSetEnabled( tr_rpc_server * server, int isEnabled ) tr_rpcSetEnabled( tr_rpc_server * server, int isEnabled )
{ {
if( !isEnabled && server->ctx ) server->isEnabled = isEnabled != 0;
stopServer( server );
if( isEnabled && !server->ctx ) if( !isEnabled )
stopServer( server );
else
startServer( server ); startServer( server );
} }
@ -459,7 +463,7 @@ tr_rpcSetPort( tr_rpc_server * server, int port )
{ {
server->port = port; server->port = port;
if( server->ctx ) if( server->isEnabled )
{ {
stopServer( server ); stopServer( server );
startServer( server ); startServer( server );
@ -593,16 +597,16 @@ tr_rpcSetACL( tr_rpc_server * server,
if( !err ) if( !err )
{ {
const int isRunning = server->ctx != NULL; const int isEnabled = server->isEnabled;
if( isRunning ) if( isEnabled )
stopServer( server ); stopServer( server );
tr_free( server->acl ); tr_free( server->acl );
server->acl = tr_strdup( cidr ); server->acl = tr_strdup( cidr );
dbgmsg( "setting our ACL to [%s]", server->acl ); dbgmsg( "setting our ACL to [%s]", server->acl );
if( isRunning ) if( isEnabled )
startServer( server ); startServer( server );
} }
tr_free( cidr ); tr_free( cidr );
@ -624,16 +628,16 @@ void
tr_rpcSetUsername( tr_rpc_server * server, tr_rpcSetUsername( tr_rpc_server * server,
const char * username ) const char * username )
{ {
const int isRunning = server->ctx != NULL; const int isEnabled = server->isEnabled;
if( isRunning ) if( isEnabled )
stopServer( server ); stopServer( server );
tr_free( server->username ); tr_free( server->username );
server->username = tr_strdup( username ); server->username = tr_strdup( username );
dbgmsg( "setting our Username to [%s]", server->username ); dbgmsg( "setting our Username to [%s]", server->username );
if( isRunning ) if( isEnabled )
startServer( server ); startServer( server );
} }
@ -647,16 +651,16 @@ void
tr_rpcSetPassword( tr_rpc_server * server, tr_rpcSetPassword( tr_rpc_server * server,
const char * password ) const char * password )
{ {
const int isRunning = server->ctx != NULL; const int isEnabled = server->isEnabled;
if( isRunning ) if( isEnabled )
stopServer( server ); stopServer( server );
tr_free( server->password ); tr_free( server->password );
server->password = tr_strdup( password ); server->password = tr_strdup( password );
dbgmsg( "setting our Password to [%s]", server->password ); dbgmsg( "setting our Password to [%s]", server->password );
if( isRunning ) if( isEnabled )
startServer( server ); startServer( server );
} }
@ -670,15 +674,15 @@ void
tr_rpcSetPasswordEnabled( tr_rpc_server * server, tr_rpcSetPasswordEnabled( tr_rpc_server * server,
int isEnabled ) int isEnabled )
{ {
const int isRunning = server->ctx != NULL; const int wasEnabled = server->isEnabled;
if( isRunning ) if( wasEnabled )
stopServer( server ); stopServer( server );
server->isPasswordEnabled = isEnabled; server->isPasswordEnabled = isEnabled;
dbgmsg( "setting 'password enabled' to %d", isEnabled ); dbgmsg( "setting 'password enabled' to %d", isEnabled );
if( isRunning ) if( isEnabled )
startServer( server ); startServer( server );
} }
@ -731,7 +735,8 @@ tr_rpcInit( tr_handle * session,
s->acl = tr_strdup( acl ); s->acl = tr_strdup( acl );
s->username = tr_strdup( username ); s->username = tr_strdup( username );
s->password = tr_strdup( password ); s->password = tr_strdup( password );
s->isPasswordEnabled = isPasswordEnabled; s->isPasswordEnabled = isPasswordEnabled != 0;
s->isEnabled = isEnabled != 0;
if( isEnabled ) if( isEnabled )
startServer( s ); startServer( s );