From 72fd944de6cb41213f17e04258967c90ee6d63e0 Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Wed, 1 Feb 2012 18:09:26 -0500 Subject: [PATCH] Clean shutdown even for mosh-in-mosh --- network.cpp | 2 +- stm-server.cpp | 3 +++ stmclient.cpp | 24 +++++++++++++++++------- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/network.cpp b/network.cpp index 62e51d2..7de931a 100644 --- a/network.cpp +++ b/network.cpp @@ -340,5 +340,5 @@ void Connection::update_MTU( void ) throw NetworkException( "Error getting path MTU", errno ); } - MTU = min( PMTU, SEND_MTU ); + MTU = min( PMTU, int(SEND_MTU) ); /* need cast to compile without optimization! XXX */ } diff --git a/stm-server.cpp b/stm-server.cpp index e2a21d3..5c09372 100644 --- a/stm-server.cpp +++ b/stm-server.cpp @@ -120,6 +120,9 @@ void serve( int host_fd ) assert( sigaddset( &signal_mask, SIGINT ) == 0 ); assert( sigaddset( &signal_mask, SIGHUP ) == 0 ); assert( sigaddset( &signal_mask, SIGPIPE ) == 0 ); + assert( sigaddset( &signal_mask, SIGTSTP ) == 0 ); + assert( sigaddset( &signal_mask, SIGSTOP ) == 0 ); + assert( sigaddset( &signal_mask, SIGCONT ) == 0 ); /* don't let signals kill us */ assert( sigprocmask( SIG_BLOCK, &signal_mask, NULL ) == 0 ); diff --git a/stmclient.cpp b/stmclient.cpp index b913750..0d5ae61 100644 --- a/stmclient.cpp +++ b/stmclient.cpp @@ -94,6 +94,9 @@ void STMClient::main_init( void ) assert( sigaddset( &signal_mask, SIGINT ) == 0 ); assert( sigaddset( &signal_mask, SIGHUP ) == 0 ); assert( sigaddset( &signal_mask, SIGPIPE ) == 0 ); + assert( sigaddset( &signal_mask, SIGTSTP ) == 0 ); + assert( sigaddset( &signal_mask, SIGSTOP ) == 0 ); + assert( sigaddset( &signal_mask, SIGCONT ) == 0 ); /* don't let signals kill us */ assert( sigprocmask( SIG_BLOCK, &signal_mask, NULL ) == 0 ); @@ -282,7 +285,14 @@ void STMClient::main( void ) if ( pollfds[ 1 ].revents & POLLIN ) { /* input from the user needs to be fed to the network */ - if ( !process_user_input( pollfds[ 1 ].fd ) ) { return; } + if ( !process_user_input( pollfds[ 1 ].fd ) ) { + if ( !network->attached() ) { + break; + } else if ( !network->shutdown_in_progress() ) { + overlays.get_notification_engine().set_notification_string( wstring( L"Exiting..." ) ); + network->start_shutdown(); + } + } } if ( pollfds[ 2 ].revents & POLLIN ) { @@ -301,11 +311,11 @@ void STMClient::main( void ) break; } - if ( network->attached() && (!network->shutdown_in_progress()) ) { + if ( !network->attached() ) { + break; + } else if ( !network->shutdown_in_progress() ) { overlays.get_notification_engine().set_notification_string( wstring( L"Signal received, shutting down..." ) ); network->start_shutdown(); - } else { - break; } } @@ -318,11 +328,11 @@ void STMClient::main( void ) if ( (pollfds[ 1 ].revents) & (POLLERR | POLLHUP | POLLNVAL) ) { /* user problem */ - if ( network->attached() && (!network->shutdown_in_progress()) ) { + if ( !network->attached() ) { + break; + } else if ( !network->shutdown_in_progress() ) { overlays.get_notification_engine().set_notification_string( wstring( L"Exiting..." ) ); network->start_shutdown(); - } else { - break; } }