From 68825dccde8fcfec3699f635b6c9f7e84eb2d101 Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Mon, 16 Apr 2012 18:19:45 -0400 Subject: [PATCH] Print /etc/motd before login shell. Closes #190. --- src/frontend/mosh-server.cc | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/frontend/mosh-server.cc b/src/frontend/mosh-server.cc index fa8f93d..eb3a102 100644 --- a/src/frontend/mosh-server.cc +++ b/src/frontend/mosh-server.cc @@ -83,6 +83,8 @@ void print_usage( const char *argv0 ) fprintf( stderr, "Usage: %s new [-s] [-v] [-i LOCALADDR] [-p PORT] [-c COLORS] [-l NAME=VALUE] [-- COMMAND...]\n", argv0 ); } +void print_motd( void ); + /* Simple spinloop */ void spin( void ) { @@ -355,6 +357,11 @@ int run_server( const char *desired_ip, const char *desired_port, setsid(); /* may fail */ + /* reopen stdio */ + stdin = fdopen( STDIN_FILENO, "r" ); + stdout = fdopen( STDOUT_FILENO, "w" ); + stderr = fdopen( STDERR_FILENO, "w" ); + /* unblock signals */ sigset_t signals_to_block; fatal_assert( sigemptyset( &signals_to_block ) == 0 ); @@ -384,6 +391,8 @@ int run_server( const char *desired_ip, const char *desired_port, exit( 1 ); } + print_motd(); + if ( execvp( command_path.c_str(), command_argv ) < 0 ) { perror( "execvp" ); _exit( 1 ); @@ -665,3 +674,28 @@ void serve( int host_fd, Terminal::Complete &terminal, ServerConnection &network } } } + +/* OpenSSH prints the motd on startup, so we will too */ +void print_motd( void ) +{ + FILE *motd = fopen( "/etc/motd", "r" ); + if ( !motd ) { + return; /* don't report error on missing or forbidden motd */ + } + + const int BUFSIZE = 256; + + char buffer[ BUFSIZE ]; + while ( 1 ) { + size_t bytes_read = fread( buffer, 1, BUFSIZE, motd ); + if ( bytes_read == 0 ) { + break; /* don't report error */ + } + size_t bytes_written = fwrite( buffer, 1, bytes_read, stdout ); + if ( bytes_written == 0 ) { + break; + } + } + + fclose( motd ); +}