diff --git a/src/frontend/stmclient.cc b/src/frontend/stmclient.cc index d1f0f71..10d2fdd 100644 --- a/src/frontend/stmclient.cc +++ b/src/frontend/stmclient.cc @@ -539,15 +539,16 @@ bool STMClient::main( void ) network->tick(); - const Network::NetworkException *exn = network->get_send_exception(); - if ( exn ) { - overlays.get_notification_engine().set_network_exception( *exn ); + string & send_error = network->get_send_error(); + if ( !send_error.empty() ) { + overlays.get_notification_engine().set_network_error( send_error ); + send_error.clear(); } else { - overlays.get_notification_engine().clear_network_exception(); + overlays.get_notification_engine().clear_network_error(); } } catch ( const Network::NetworkException &e ) { if ( !network->shutdown_in_progress() ) { - overlays.get_notification_engine().set_network_exception( e ); + overlays.get_notification_engine().set_network_error( e.what() ); } struct timespec req; diff --git a/src/frontend/terminaloverlay.cc b/src/frontend/terminaloverlay.cc index 4879b96..f550716 100644 --- a/src/frontend/terminaloverlay.cc +++ b/src/frontend/terminaloverlay.cc @@ -168,7 +168,7 @@ NotificationEngine::NotificationEngine() last_acked_state( timestamp() ), escape_key_string(), message(), - message_is_network_exception( false ), + message_is_network_error( false ), message_expiration( -1 ), show_quit_keystroke( true ) {} diff --git a/src/frontend/terminaloverlay.h b/src/frontend/terminaloverlay.h index aaba862..ecd16f7 100644 --- a/src/frontend/terminaloverlay.h +++ b/src/frontend/terminaloverlay.h @@ -40,7 +40,6 @@ #include #include -#include namespace Overlay { using namespace Terminal; @@ -147,7 +146,7 @@ namespace Overlay { uint64_t last_acked_state; string escape_key_string; wstring message; - bool message_is_network_exception; + bool message_is_network_error; uint64_t message_expiration; bool show_quit_keystroke; @@ -171,7 +170,7 @@ namespace Overlay { } else { message_expiration = timestamp() + 1000; } - message_is_network_exception = false; + message_is_network_error = false; show_quit_keystroke = s_show_quit_keystroke; } @@ -182,19 +181,19 @@ namespace Overlay { escape_key_string = tmp; } - void set_network_exception( const std::exception &e ) + void set_network_error( const std::string &s ) { wchar_t tmp[ 128 ]; - swprintf( tmp, 128, L"%s", e.what() ); + swprintf( tmp, 128, L"%s", s.c_str() ); message = tmp; - message_is_network_exception = true; + message_is_network_error = true; message_expiration = timestamp() + Network::ACK_INTERVAL + 100; } - void clear_network_exception() + void clear_network_error() { - if ( message_is_network_exception ) { + if ( message_is_network_error ) { message_expiration = std::min( message_expiration, timestamp() + 1000 ); } } diff --git a/src/network/network.cc b/src/network/network.cc index 0f595d7..efe416f 100644 --- a/src/network/network.cc +++ b/src/network/network.cc @@ -249,8 +249,7 @@ Connection::Connection( const char *desired_ip, const char *desired_port ) /* se RTT_hit( false ), SRTT( 1000 ), RTTVAR( 500 ), - have_send_exception( false ), - send_exception() + send_error() { setup(); @@ -369,8 +368,7 @@ Connection::Connection( const char *key_str, const char *ip, const char *port ) RTT_hit( false ), SRTT( 1000 ), RTTVAR( 500 ), - have_send_exception( false ), - send_exception() + send_error() { setup(); @@ -405,14 +403,10 @@ void Connection::send( const string & s ) ssize_t bytes_sent = sendto( sock(), p.data(), p.size(), MSG_DONTWAIT, &remote_addr.sa, remote_addr_len ); - if ( bytes_sent == static_cast( p.size() ) ) { - have_send_exception = false; - } else { - /* Notify the frontend on sendto() failure, but don't alter control flow. - sendto() success is not very meaningful because packets can be lost in - flight anyway. */ - have_send_exception = true; - send_exception = NetworkException( "sendto", errno ); + if ( bytes_sent != static_cast( p.size() ) ) { + /* Make sendto() failure available to the frontend. */ + send_error = "sendto: "; + send_error += strerror( errno ); if ( errno == EMSGSIZE ) { MTU = DEFAULT_SEND_MTU; /* payload MTU of last resort */ diff --git a/src/network/network.h b/src/network/network.h index 5267a45..db6d1ed 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -187,10 +187,8 @@ namespace Network { double SRTT; double RTTVAR; - /* Exception from send(), to be delivered if the frontend asks for it, - without altering control flow. */ - bool have_send_exception; - NetworkException send_exception; + /* Error from send()/sendto(). */ + string send_error; Packet new_packet( const string &s_payload ); @@ -226,9 +224,9 @@ namespace Network { const Addr &get_remote_addr( void ) const { return remote_addr; } socklen_t get_remote_addr_len( void ) const { return remote_addr_len; } - const NetworkException *get_send_exception( void ) const + string &get_send_error( void ) { - return have_send_exception ? &send_exception : NULL; + return send_error; } void set_last_roundtrip_success( uint64_t s_success ) { last_roundtrip_success = s_success; } diff --git a/src/network/networktransport.h b/src/network/networktransport.h index 02d1a9b..115ff37 100644 --- a/src/network/networktransport.h +++ b/src/network/networktransport.h @@ -119,7 +119,7 @@ namespace Network { const Addr &get_remote_addr( void ) const { return connection.get_remote_addr(); } socklen_t get_remote_addr_len( void ) const { return connection.get_remote_addr_len(); } - const NetworkException *get_send_exception( void ) const { return connection.get_send_exception(); } + std::string &get_send_error( void ) { return connection.get_send_error(); } }; }