aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--src/frontend/mosh-server.cc20
2 files changed, 19 insertions, 3 deletions
diff --git a/configure.ac b/configure.ac
index 5f5fc0b..40f41d8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -195,7 +195,7 @@ AC_TYPE_UINTPTR_T
# Checks for library functions.
AC_FUNC_FORK
AC_FUNC_MBRTOWC
-AC_CHECK_FUNCS([gettimeofday setrlimit inet_ntoa iswprint memchr memset nl_langinfo posix_memalign setenv setlocale sigaction socket strchr strdup strerror strtol wcwidth])
+AC_CHECK_FUNCS([gettimeofday setrlimit inet_ntoa iswprint memchr memset nl_langinfo posix_memalign setenv setlocale sigaction socket strchr strdup strncasecmp strtok strerror strtol wcwidth])
AC_SEARCH_LIBS([clock_gettime], [rt], [AC_DEFINE([HAVE_CLOCK_GETTIME], [1], [Define if clock_gettime is available.])])
diff --git a/src/frontend/mosh-server.cc b/src/frontend/mosh-server.cc
index 2c4df57..9aa69d4 100644
--- a/src/frontend/mosh-server.cc
+++ b/src/frontend/mosh-server.cc
@@ -122,13 +122,29 @@ void spin( void )
string get_SSH_IP( void )
{
const char *SSH_CONNECTION = getenv( "SSH_CONNECTION" );
- fatal_assert( SSH_CONNECTION );
+ if ( !SSH_CONNECTION ) { /* Older sshds don't set this */
+ fprintf( stderr, "Warning: SSH_CONNECTION not found; binding to any interface.\n" );
+ return string( "0.0.0.0" );
+ }
char *SSH_writable = strdup( SSH_CONNECTION );
fatal_assert( SSH_writable );
+
strtok( SSH_writable, " " );
strtok( NULL, " " );
const char *local_interface_IP = strtok( NULL, " " );
- fatal_assert( local_interface_IP );
+ if ( !local_interface_IP ) {
+ fprintf( stderr, "Warning: Could not parse SSH_CONNECTION; binding to any interface.\n" );
+ return string( "0.0.0.0" );
+ }
+
+ /* Strip IPv6 prefix. */
+ const char IPv6_prefix[] = "::ffff:";
+
+ if ( ( strlen( local_interface_IP ) > strlen( IPv6_prefix ) )
+ && ( 0 == strncasecmp( local_interface_IP, IPv6_prefix, strlen( IPv6_prefix ) ) ) ) {
+ return string( local_interface_IP + strlen( IPv6_prefix ) );
+ }
+
return string( local_interface_IP );
}