From 6c01537c510df5687967bc8a94073d1956a90a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jason=20K=C3=B6lker?= Date: Fri, 14 Aug 2020 03:21:26 +0000 Subject: [PATCH] server: add option to stay in foreground Fixes #1091 --- man/mosh-server.1 | 5 +++ src/frontend/mosh-server.cc | 61 ++++++++++++++++++++++--------------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/man/mosh-server.1 b/man/mosh-server.1 index b73eaa119..5af7a4905 100644 --- a/man/mosh-server.1 +++ b/man/mosh-server.1 @@ -20,6 +20,7 @@ mosh-server \- server-side helper for mosh .SH SYNOPSIS .B mosh-server new +[\-D] [\-s] [\-v] [\-i \fIIP\fP] @@ -54,6 +55,10 @@ and the client's current IP address. The argument "new" must be first on the command line to use command-line options. +.TP +.B \-D +stay in the foreground instead of forking into the background + .TP .B \-s bind to the local interface used for an incoming SSH connection, given diff --git a/src/frontend/mosh-server.cc b/src/frontend/mosh-server.cc index e8a6cb70f..640149920 100644 --- a/src/frontend/mosh-server.cc +++ b/src/frontend/mosh-server.cc @@ -105,7 +105,8 @@ static void serve( int host_fd, static int run_server( const char *desired_ip, const char *desired_port, const string &command_path, char *command_argv[], - const int colors, unsigned int verbose, bool with_motd ); + const int colors, unsigned int verbose, bool with_motd, + bool foreground ); static void print_version( FILE *file ) @@ -119,7 +120,7 @@ static void print_version( FILE *file ) static void print_usage( FILE *stream, const char *argv0 ) { - fprintf( stream, "Usage: %s new [-s] [-v] [-i LOCALADDR] [-p PORT[:PORT2]] [-c COLORS] [-l NAME=VALUE] [-- COMMAND...]\n", argv0 ); + fprintf( stream, "Usage: %s new [-D] [-s] [-v] [-i LOCALADDR] [-p PORT[:PORT2]] [-c COLORS] [-l NAME=VALUE] [-- COMMAND...]\n", argv0 ); } static bool print_motd( const char *filename ); @@ -183,6 +184,7 @@ int main( int argc, char *argv[] ) char **command_argv = NULL; int colors = 0; unsigned int verbose = 0; /* don't close stdin/stdout/stderr */ + bool foreground = false; /* stay in the foreground, don't fork into background */ /* Will cause mosh-server not to correctly detach on old versions of sshd. */ list locale_vars; @@ -210,7 +212,7 @@ int main( int argc, char *argv[] ) && (strcmp( argv[ 1 ], "new" ) == 0) ) { /* new option syntax */ int opt; - while ( (opt = getopt( argc - 1, argv + 1, "@:i:p:c:svl:" )) != -1 ) { + while ( (opt = getopt( argc - 1, argv + 1, "@:i:p:c:svl:D" )) != -1 ) { switch ( opt ) { /* * This undocumented option does nothing but eat its argument. @@ -251,6 +253,9 @@ int main( int argc, char *argv[] ) case 'l': locale_vars.push_back( string( optarg ) ); break; + case 'D': + foreground = true; + break; default: /* don't die on unknown options */ print_usage( stderr, argv[ 0 ] ); @@ -364,7 +369,7 @@ int main( int argc, char *argv[] ) } try { - return run_server( desired_ip, desired_port, command_path, command_argv, colors, verbose, with_motd ); + return run_server( desired_ip, desired_port, command_path, command_argv, colors, verbose, with_motd, foreground ); } catch ( const Network::NetworkException &e ) { fprintf( stderr, "Network exception: %s\n", e.what() ); @@ -378,7 +383,8 @@ int main( int argc, char *argv[] ) static int run_server( const char *desired_ip, const char *desired_port, const string &command_path, char *command_argv[], - const int colors, unsigned int verbose, bool with_motd ) { + const int colors, unsigned int verbose, bool with_motd, + bool foreground ) { /* get network idle timeout */ long network_timeout = 0; char *timeout_envar = getenv( "MOSH_SERVER_NETWORK_TMOUT" ); @@ -448,34 +454,41 @@ static int run_server( const char *desired_ip, const char *desired_port, fatal_assert( 0 == sigaction( SIGHUP, &sa, NULL ) ); fatal_assert( 0 == sigaction( SIGPIPE, &sa, NULL ) ); + pid_t the_pid = -1; + if (!foreground) { + /* detach from terminal */ + fflush( NULL ); + the_pid = fork(); + } - /* detach from terminal */ - fflush( NULL ); - pid_t the_pid = fork(); - if ( the_pid < 0 ) { + if ( the_pid < 0 && !foreground) { perror( "fork" ); - } else if ( the_pid > 0 ) { + } else if ( the_pid > 0 || foreground ) { fputs( "\nmosh-server (" PACKAGE_STRING ") [build " BUILD_VERSION "]\n" - "Copyright 2012 Keith Winstein \n" - "License GPLv3+: GNU GPL version 3 or later .\n" - "This is free software: you are free to change and redistribute it.\n" - "There is NO WARRANTY, to the extent permitted by law.\n\n", stderr ); + "Copyright 2012 Keith Winstein \n" + "License GPLv3+: GNU GPL version 3 or later .\n" + "This is free software: you are free to change and redistribute it.\n" + "There is NO WARRANTY, to the extent permitted by law.\n\n", stderr ); - fprintf( stderr, "[mosh-server detached, pid = %d]\n", static_cast(the_pid) ); + if (!foreground) { + fprintf( stderr, "[mosh-server detached, pid = %d]\n", static_cast(the_pid) ); + } #ifndef HAVE_IUTF8 fputs( "\nWarning: termios IUTF8 flag not defined.\n" - "Character-erase of multibyte character sequence\n" - "probably does not work properly on this platform.\n", stderr ); + "Character-erase of multibyte character sequence\n" + "probably does not work properly on this platform.\n", stderr ); #endif /* HAVE_IUTF8 */ - fflush( NULL ); - if ( isatty( STDOUT_FILENO ) ) { - tcdrain( STDOUT_FILENO ); - } - if ( isatty( STDERR_FILENO ) ) { - tcdrain( STDERR_FILENO ); + if (!foreground) { + fflush( NULL ); + if ( isatty( STDOUT_FILENO ) ) { + tcdrain( STDOUT_FILENO ); + } + if ( isatty( STDERR_FILENO ) ) { + tcdrain( STDERR_FILENO ); + } + exit( 0 ); } - exit( 0 ); } int master;