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 );
}
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, 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 );
+17 -7
View File
@@ -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;
}
}