Skip to content

Commit

Permalink
Use Select signal handling in mosh-{client,server}
Browse files Browse the repository at this point in the history
  • Loading branch information
kmcallister authored and keithw committed May 16, 2012
1 parent 1d0b168 commit 4f23326
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 60 deletions.
28 changes: 4 additions & 24 deletions src/frontend/mosh-server.cc
Expand Up @@ -44,7 +44,6 @@
#include <paths.h>
#endif

#include "sigfd.h"
#include "completeterminal.h"
#include "swrite.h"
#include "user.h"
Expand Down Expand Up @@ -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();

Expand All @@ -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;
}
Expand Down Expand Up @@ -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 {
Expand Down
60 changes: 26 additions & 34 deletions src/frontend/stmclient.cc
Expand Up @@ -36,7 +36,6 @@
#include <util.h>
#endif

#include "sigfd.h"
#include "stmclient.h"
#include "swrite.h"
#include "completeterminal.h"
Expand Down Expand Up @@ -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 ) {
Expand Down Expand Up @@ -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 {
Expand All @@ -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;
}
Expand All @@ -340,22 +330,24 @@ void STMClient::main( void )
}
}

if ( sel.read( signal_fd ) ) {
int signo = sigfd_read();

if ( signo == SIGWINCH ) {
/* resize */
if ( !process_resize() ) { return; }
} else if ( signo > 0 ) {
/* shutdown signal */
if ( sel.signal( SIGWINCH ) ) {
/* resize */
if ( !process_resize() ) { return; }
}

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() ) ) {
Expand Down
2 changes: 0 additions & 2 deletions src/frontend/stmclient.h
Expand Up @@ -36,7 +36,6 @@ class STMClient {

struct termios saved_termios, raw_termios;

int signal_fd;
struct winsize window_size;

Terminal::Framebuffer *local_framebuffer, *new_state;
Expand Down Expand Up @@ -65,7 +64,6 @@ class STMClient {
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 ),
Expand Down

0 comments on commit 4f23326

Please sign in to comment.