From 4f23326a92369ca84f5e74efbc1a3756a15d6329 Mon Sep 17 00:00:00 2001 From: Keegan McAllister Date: Sat, 5 May 2012 05:36:59 -0400 Subject: [PATCH] Use Select signal handling in mosh-{client,server} --- src/frontend/mosh-server.cc | 28 +++-------------- src/frontend/stmclient.cc | 60 ++++++++++++++++--------------------- src/frontend/stmclient.h | 2 -- 3 files changed, 30 insertions(+), 60 deletions(-) diff --git a/src/frontend/mosh-server.cc b/src/frontend/mosh-server.cc index c1b3fdf..1dbf8fc 100644 --- a/src/frontend/mosh-server.cc +++ b/src/frontend/mosh-server.cc @@ -44,7 +44,6 @@ #include #endif -#include "sigfd.h" #include "completeterminal.h" #include "swrite.h" #include "user.h" @@ -471,21 +470,12 @@ int run_server( const char *desired_ip, const char *desired_port, void serve( int host_fd, Terminal::Complete &terminal, ServerConnection &network ) { - /* establish fd for shutdown signals */ - int signal_fd = sigfd_init(); - if ( signal_fd < 0 ) { - perror( "sigfd_init" ); - return; - } - - fatal_assert( sigfd_trap( SIGTERM ) == 0 ); - fatal_assert( sigfd_trap( SIGINT ) == 0 ); - /* prepare to poll for events */ Select &sel = Select::get_instance(); sel.add_fd( network.fd() ); sel.add_fd( host_fd ); - sel.add_fd( signal_fd ); + sel.add_signal( SIGTERM ); + sel.add_signal( SIGINT ); uint64_t last_remote_num = network.get_remote_state_num(); @@ -507,9 +497,7 @@ void serve( int host_fd, Terminal::Complete &terminal, ServerConnection &network } int active_fds = sel.select( timeout ); - if ( active_fds < 0 && errno == EINTR ) { - continue; - } else if ( active_fds < 0 ) { + if ( active_fds < 0 ) { perror( "select" ); break; } @@ -614,16 +602,8 @@ void serve( int host_fd, Terminal::Complete &terminal, ServerConnection &network } } - if ( sel.read( signal_fd ) ) { + if ( sel.any_signal() ) { /* shutdown signal */ - int signo = sigfd_read(); - if ( signo == 0 ) { - break; - } else if ( signo < 0 ) { - perror( "sigfd_read" ); - break; - } - if ( network.has_remote_addr() && (!network.shutdown_in_progress()) ) { network.start_shutdown(); } else { diff --git a/src/frontend/stmclient.cc b/src/frontend/stmclient.cc index e96f6ac..c6f59bc 100644 --- a/src/frontend/stmclient.cc +++ b/src/frontend/stmclient.cc @@ -36,7 +36,6 @@ #include #endif -#include "sigfd.h" #include "stmclient.h" #include "swrite.h" #include "completeterminal.h" @@ -125,20 +124,14 @@ void STMClient::shutdown( void ) void STMClient::main_init( void ) { - /* establish a fd for signals */ - signal_fd = sigfd_init(); - if ( signal_fd < 0 ) { - perror( "sigfd_init" ); - return; - } - - fatal_assert( sigfd_trap( SIGWINCH ) == 0 ); - fatal_assert( sigfd_trap( SIGTERM ) == 0 ); - fatal_assert( sigfd_trap( SIGINT ) == 0 ); - fatal_assert( sigfd_trap( SIGHUP ) == 0 ); - fatal_assert( sigfd_trap( SIGPIPE ) == 0 ); - fatal_assert( sigfd_trap( SIGTSTP ) == 0 ); - fatal_assert( sigfd_trap( SIGCONT ) == 0 ); + Select &sel = Select::get_instance(); + sel.add_signal( SIGWINCH ); + sel.add_signal( SIGTERM ); + sel.add_signal( SIGINT ); + sel.add_signal( SIGHUP ); + sel.add_signal( SIGPIPE ); + sel.add_signal( SIGTSTP ); + sel.add_signal( SIGCONT ); /* get initial window size */ if ( ioctl( STDIN_FILENO, TIOCGWINSZ, &window_size ) < 0 ) { @@ -302,7 +295,6 @@ void STMClient::main( void ) Select &sel = Select::get_instance(); sel.add_fd( network->fd() ); sel.add_fd( STDIN_FILENO ); - sel.add_fd( signal_fd ); while ( 1 ) { try { @@ -316,9 +308,7 @@ void STMClient::main( void ) } int active_fds = sel.select( wait_time ); - if ( active_fds < 0 && errno == EINTR ) { - continue; - } else if ( active_fds < 0 ) { + if ( active_fds < 0 ) { perror( "select" ); break; } @@ -340,22 +330,24 @@ void STMClient::main( void ) } } - if ( sel.read( signal_fd ) ) { - int signo = sigfd_read(); + if ( sel.signal( SIGWINCH ) ) { + /* resize */ + if ( !process_resize() ) { return; } + } - if ( signo == SIGWINCH ) { - /* resize */ - if ( !process_resize() ) { return; } - } else if ( signo > 0 ) { - /* shutdown signal */ - - if ( !network->has_remote_addr() ) { - break; - } else if ( !network->shutdown_in_progress() ) { - overlays.get_notification_engine().set_notification_string( wstring( L"Signal received, shutting down..." ), true ); - network->start_shutdown(); - } - } + if ( sel.signal( SIGTERM ) + || sel.signal( SIGINT ) + || sel.signal( SIGHUP ) + || sel.signal( SIGPIPE ) + || sel.signal( SIGTSTP ) + || sel.signal( SIGCONT ) ) { + /* shutdown signal */ + if ( !network->has_remote_addr() ) { + break; + } else if ( !network->shutdown_in_progress() ) { + overlays.get_notification_engine().set_notification_string( wstring( L"Signal received, shutting down..." ), true ); + network->start_shutdown(); + } } if ( sel.error( network->fd() ) ) { diff --git a/src/frontend/stmclient.h b/src/frontend/stmclient.h index b878dcd..99483b4 100644 --- a/src/frontend/stmclient.h +++ b/src/frontend/stmclient.h @@ -36,7 +36,6 @@ private: struct termios saved_termios, raw_termios; - int signal_fd; struct winsize window_size; Terminal::Framebuffer *local_framebuffer, *new_state; @@ -65,7 +64,6 @@ public: STMClient( const char *s_ip, int s_port, const char *s_key, const char *predict_mode ) : ip( s_ip ), port( s_port ), key( s_key ), saved_termios(), raw_termios(), - signal_fd(), window_size(), local_framebuffer( NULL ), new_state( NULL ),