Clean shutdown even for mosh-in-mosh

This commit is contained in:
Keith Winstein
2012-02-01 18:09:26 -05:00
parent cdf4c6b4b3
commit 72fd944de6
3 changed files with 21 additions and 8 deletions
+1 -1
View File
@@ -340,5 +340,5 @@ void Connection::update_MTU( void )
throw NetworkException( "Error getting path MTU", errno ); 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 */
} }
+3
View File
@@ -120,6 +120,9 @@ void serve( int host_fd )
assert( sigaddset( &signal_mask, SIGINT ) == 0 ); assert( sigaddset( &signal_mask, SIGINT ) == 0 );
assert( sigaddset( &signal_mask, SIGHUP ) == 0 ); assert( sigaddset( &signal_mask, SIGHUP ) == 0 );
assert( sigaddset( &signal_mask, SIGPIPE ) == 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 */ /* don't let signals kill us */
assert( sigprocmask( SIG_BLOCK, &signal_mask, NULL ) == 0 ); assert( sigprocmask( SIG_BLOCK, &signal_mask, NULL ) == 0 );
+17 -7
View File
@@ -94,6 +94,9 @@ void STMClient::main_init( void )
assert( sigaddset( &signal_mask, SIGINT ) == 0 ); assert( sigaddset( &signal_mask, SIGINT ) == 0 );
assert( sigaddset( &signal_mask, SIGHUP ) == 0 ); assert( sigaddset( &signal_mask, SIGHUP ) == 0 );
assert( sigaddset( &signal_mask, SIGPIPE ) == 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 */ /* don't let signals kill us */
assert( sigprocmask( SIG_BLOCK, &signal_mask, NULL ) == 0 ); assert( sigprocmask( SIG_BLOCK, &signal_mask, NULL ) == 0 );
@@ -282,7 +285,14 @@ void STMClient::main( void )
if ( pollfds[ 1 ].revents & POLLIN ) { if ( pollfds[ 1 ].revents & POLLIN ) {
/* input from the user needs to be fed to the network */ /* 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 ) { if ( pollfds[ 2 ].revents & POLLIN ) {
@@ -301,11 +311,11 @@ void STMClient::main( void )
break; 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..." ) ); overlays.get_notification_engine().set_notification_string( wstring( L"Signal received, shutting down..." ) );
network->start_shutdown(); network->start_shutdown();
} else {
break;
} }
} }
@@ -318,11 +328,11 @@ void STMClient::main( void )
if ( (pollfds[ 1 ].revents) if ( (pollfds[ 1 ].revents)
& (POLLERR | POLLHUP | POLLNVAL) ) { & (POLLERR | POLLHUP | POLLNVAL) ) {
/* user problem */ /* 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..." ) ); overlays.get_notification_engine().set_notification_string( wstring( L"Exiting..." ) );
network->start_shutdown(); network->start_shutdown();
} else {
break;
} }
} }