From 2f91341ae855b28c82024caa87c7541e94f68a18 Mon Sep 17 00:00:00 2001
From: Hans Nilsson <hans@erlang.org>
Date: Wed, 29 Mar 2017 12:57:23 +0200
Subject: ssh: Make test suites pass

---
 lib/ssh/test/ssh_algorithms_SUITE.erl |  13 ++--
 lib/ssh/test/ssh_basic_SUITE.erl      |   3 +-
 lib/ssh/test/ssh_bench_SUITE.erl      |   6 +-
 lib/ssh/test/ssh_connection_SUITE.erl |  64 +++++++++---------
 lib/ssh/test/ssh_options_SUITE.erl    |  24 +++----
 lib/ssh/test/ssh_relay.erl            |   3 +-
 lib/ssh/test/ssh_sftp_SUITE.erl       |   2 +-
 lib/ssh/test/ssh_sftpd_SUITE.erl      |   4 +-
 lib/ssh/test/ssh_sup_SUITE.erl        |  31 +++++----
 lib/ssh/test/ssh_test_lib.erl         | 124 +++++++++++++++++++++++++++++++---
 lib/ssh/test/ssh_to_openssh_SUITE.erl |  28 ++++----
 lib/ssh/test/ssh_trpt_test_lib.erl    |   3 +-
 12 files changed, 210 insertions(+), 95 deletions(-)

(limited to 'lib/ssh/test')

diff --git a/lib/ssh/test/ssh_algorithms_SUITE.erl b/lib/ssh/test/ssh_algorithms_SUITE.erl
index 6f75d83c4a..2990d1e02a 100644
--- a/lib/ssh/test/ssh_algorithms_SUITE.erl
+++ b/lib/ssh/test/ssh_algorithms_SUITE.erl
@@ -235,13 +235,12 @@ sshc_simple_exec_os_cmd(Config) ->
     Parent = self(),
     Client = spawn(
 	       fun() ->
-		       Cmd = lists:concat(["ssh -p ",Port,
-					   " -C"
-					   " -o UserKnownHostsFile=",KnownHosts,
-					   " -o StrictHostKeyChecking=no"
-					   " ",Host," 1+1."]),
-		       Result = os:cmd(Cmd),
-		       ct:log("~p~n  = ~p",[Cmd, Result]),
+                       Result = ssh_test_lib:open_sshc(Host, Port,
+                                                       [" -C"
+                                                        " -o UserKnownHostsFile=",KnownHosts,
+                                                        " -o StrictHostKeyChecking=no"
+                                                        ],
+                                                       " 1+1."),
 		       Parent ! {result, self(), Result, "2"}
 	       end),
     receive
diff --git a/lib/ssh/test/ssh_basic_SUITE.erl b/lib/ssh/test/ssh_basic_SUITE.erl
index a9b6be222e..089d191fea 100644
--- a/lib/ssh/test/ssh_basic_SUITE.erl
+++ b/lib/ssh/test/ssh_basic_SUITE.erl
@@ -742,7 +742,8 @@ known_hosts(Config) when is_list(Config) ->
     Lines = string:tokens(binary_to_list(Binary), "\n"),
     [Line] = Lines,
     [HostAndIp, Alg, _KeyData] = string:tokens(Line, " "),
-    [Host, _Ip] = string:tokens(HostAndIp, ","),
+    [StoredHost, _Ip] = string:tokens(HostAndIp, ","),
+    true = ssh_test_lib:match_ip(StoredHost, Host),
     "ssh-" ++ _ = Alg,
     ssh:stop_daemon(Pid).
 %%--------------------------------------------------------------------
diff --git a/lib/ssh/test/ssh_bench_SUITE.erl b/lib/ssh/test/ssh_bench_SUITE.erl
index ac52bb7e28..317e50ed1d 100644
--- a/lib/ssh/test/ssh_bench_SUITE.erl
+++ b/lib/ssh/test/ssh_bench_SUITE.erl
@@ -98,7 +98,7 @@ end_per_testcase(_Func, _Conf) ->
 
 connect(Config) ->
     KexAlgs = proplists:get_value(kex, ssh:default_algorithms()),
-    ct:pal("KexAlgs = ~p",[KexAlgs]),
+    ct:log("KexAlgs = ~p",[KexAlgs]),
     lists:foreach(
       fun(KexAlg) ->
               PrefAlgs = preferred_algorithms(KexAlg),
@@ -242,11 +242,11 @@ median(Data) when is_list(Data) ->
             1 ->
                 lists:nth(N div 2 + 1, SortedData)
         end,
-    ct:pal("median(~p) = ~p",[SortedData,Median]),
+    ct:log("median(~p) = ~p",[SortedData,Median]),
     Median.
 
 
 report(Data) ->
-    ct:pal("EventData = ~p",[Data]),
+    ct:log("EventData = ~p",[Data]),
     ct_event:notify(#event{name = benchmark_data,
                            data = Data}).
diff --git a/lib/ssh/test/ssh_connection_SUITE.erl b/lib/ssh/test/ssh_connection_SUITE.erl
index 2819a4dbd9..b911cf0e9e 100644
--- a/lib/ssh/test/ssh_connection_SUITE.erl
+++ b/lib/ssh/test/ssh_connection_SUITE.erl
@@ -89,7 +89,7 @@ end_per_suite(Config) ->
 
 %%--------------------------------------------------------------------
 init_per_group(openssh, Config) ->
-    case gen_tcp:connect("localhost", 22, []) of
+    case ssh_test_lib:gen_tcp_connect("localhost", 22, []) of
 	{error,econnrefused} ->
 	    {skip,"No openssh deamon"};
 	{ok, Socket} ->
@@ -126,7 +126,7 @@ simple_exec(Config) when is_list(Config) ->
 
 
 simple_exec_sock(_Config) ->
-    {ok, Sock} = gen_tcp:connect("localhost", ?SSH_DEFAULT_PORT, [{active,false}]),
+    {ok, Sock} = ssh_test_lib:gen_tcp_connect("localhost", ?SSH_DEFAULT_PORT, [{active,false}]),
     {ok, ConnectionRef} = ssh:connect(Sock, [{silently_accept_hosts, true},
 					     {user_interaction, false}]),
     do_simple_exec(ConnectionRef).
@@ -179,13 +179,13 @@ daemon_sock_not_tcp(_Config) ->
 
 %%--------------------------------------------------------------------
 connect_sock_not_passive(_Config) ->
-    {ok,Sock} = gen_tcp:connect("localhost", ?SSH_DEFAULT_PORT, []), 
+    {ok,Sock} = ssh_test_lib:gen_tcp_connect("localhost", ?SSH_DEFAULT_PORT, []), 
     {error, not_passive_mode} = ssh:connect(Sock, []),
     gen_tcp:close(Sock).
 
 %%--------------------------------------------------------------------
 daemon_sock_not_passive(_Config) ->
-    {ok,Sock} = gen_tcp:connect("localhost", ?SSH_DEFAULT_PORT, []), 
+    {ok,Sock} = ssh_test_lib:gen_tcp_connect("localhost", ?SSH_DEFAULT_PORT, []), 
     {error, not_passive_mode} = ssh:daemon(Sock),
     gen_tcp:close(Sock).
 
@@ -585,12 +585,13 @@ start_shell_sock_exec_fun(Config) when is_list(Config) ->
     UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
     file:make_dir(UserDir),
     SysDir = proplists:get_value(data_dir, Config),
-    {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
-					     {user_dir, UserDir},
-					     {password, "morot"},
-					     {exec, fun ssh_exec/1}]),
+    {Pid, HostD, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
+                                              {user_dir, UserDir},
+                                              {password, "morot"},
+                                              {exec, fun ssh_exec/1}]),
+    Host = ssh_test_lib:ntoa(ssh_test_lib:mangle_connect_address(HostD)),
 
-    {ok, Sock} = gen_tcp:connect(Host, Port, [{active,false}]),
+    {ok, Sock} = ssh_test_lib:gen_tcp_connect(Host, Port, [{active,false}]),
     {ok,ConnectionRef} = ssh:connect(Sock, [{silently_accept_hosts, true},
 					    {user, "foo"},
 					    {password, "morot"},
@@ -623,7 +624,7 @@ start_shell_sock_daemon_exec(Config) ->
     {ok,{_IP,Port}} = inet:sockname(Sl),	% _IP is likely to be {0,0,0,0}. Win don't like...
     
     spawn_link(fun() ->
-		       {ok,Ss} = gen_tcp:connect("localhost", Port, [{active,false}]),
+		       {ok,Ss} = ssh_test_lib:gen_tcp_connect("localhost", Port, [{active,false}]),
 		       {ok, _Pid} = ssh:daemon(Ss, [{system_dir, SysDir},
 						    {user_dir, UserDir},
 						    {password, "morot"},
@@ -658,10 +659,10 @@ gracefull_invalid_version(Config) when is_list(Config) ->
     SysDir = proplists:get_value(data_dir, Config),
     
     {_Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
-					     {user_dir, UserDir},
-					     {password, "morot"}]),
+                                               {user_dir, UserDir},
+                                               {password, "morot"}]),
 
-    {ok, S} = gen_tcp:connect(Host, Port, []),
+    {ok, S} = ssh_test_lib:gen_tcp_connect(Host, Port, []),
     ok = gen_tcp:send(S,  ["SSH-8.-1","\r\n"]),
     receive
 	Verstring ->
@@ -680,10 +681,10 @@ gracefull_invalid_start(Config) when is_list(Config) ->
     file:make_dir(UserDir),
     SysDir = proplists:get_value(data_dir, Config),
     {_Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
-					     {user_dir, UserDir},
-					     {password, "morot"}]),
+                                               {user_dir, UserDir},
+                                               {password, "morot"}]),
 
-    {ok, S} = gen_tcp:connect(Host, Port, []),
+    {ok, S} = ssh_test_lib:gen_tcp_connect(Host, Port, []),
     ok = gen_tcp:send(S,  ["foobar","\r\n"]),
     receive
 	Verstring ->
@@ -702,10 +703,10 @@ gracefull_invalid_long_start(Config) when is_list(Config) ->
     file:make_dir(UserDir),
     SysDir = proplists:get_value(data_dir, Config),
     {_Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
-					     {user_dir, UserDir},
-					     {password, "morot"}]),
+                                               {user_dir, UserDir},
+                                               {password, "morot"}]),
 
-    {ok, S} = gen_tcp:connect(Host, Port, []),
+    {ok, S} = ssh_test_lib:gen_tcp_connect(Host, Port, []),
     ok = gen_tcp:send(S, [lists:duplicate(257, $a), "\r\n"]),
     receive
 	Verstring ->
@@ -725,10 +726,10 @@ gracefull_invalid_long_start_no_nl(Config) when is_list(Config) ->
     file:make_dir(UserDir),
     SysDir = proplists:get_value(data_dir, Config),
     {_Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
-					     {user_dir, UserDir},
-					     {password, "morot"}]),
+                                               {user_dir, UserDir},
+                                               {password, "morot"}]),
 
-    {ok, S} = gen_tcp:connect(Host, Port, []),
+    {ok, S} = ssh_test_lib:gen_tcp_connect(Host, Port, []),
     ok = gen_tcp:send(S, [lists:duplicate(257, $a), "\r\n"]),
     receive
 	Verstring ->
@@ -779,22 +780,21 @@ stop_listener(Config) when is_list(Config) ->
 	    ct:fail("Exec Timeout")
     end,
 
-    {ok, HostAddr} = inet:getaddr(Host, inet),
-    case ssh_test_lib:daemon(HostAddr, Port, [{system_dir, SysDir},
-							     {user_dir, UserDir},
-							     {password, "potatis"},
-							     {exec, fun ssh_exec/1}]) of
-	{Pid1, HostAddr, Port} ->
+    case ssh_test_lib:daemon(Port, [{system_dir, SysDir},
+                                    {user_dir, UserDir},
+                                    {password, "potatis"},
+                                    {exec, fun ssh_exec/1}]) of
+	{Pid1, Host, Port} ->
 	    ConnectionRef1 = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true},
 							       {user, "foo"},
 							       {password, "potatis"},
 							       {user_interaction, true},
 							       {user_dir, UserDir}]),
 	    {error, _} = ssh:connect(Host, Port, [{silently_accept_hosts, true},
-						       {user, "foo"},
-						       {password, "morot"},
-						       {user_interaction, true},
-						       {user_dir, UserDir}]),
+                                                  {user, "foo"},
+                                                  {password, "morot"},
+                                                  {user_interaction, true},
+                                                  {user_dir, UserDir}]),
 	    ssh:close(ConnectionRef0),
 	    ssh:close(ConnectionRef1),
 	    ssh:stop_daemon(Pid0),
diff --git a/lib/ssh/test/ssh_options_SUITE.erl b/lib/ssh/test/ssh_options_SUITE.erl
index 758c20e2b8..344a042d79 100644
--- a/lib/ssh/test/ssh_options_SUITE.erl
+++ b/lib/ssh/test/ssh_options_SUITE.erl
@@ -868,13 +868,13 @@ really_do_hostkey_fingerprint_check(Config, HashAlg) ->
     ct:log("Fingerprints(~p) = ~p",[HashAlg,FPs]),
 
     %% Start daemon with the public keys that we got fingerprints from
-    {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
+    {Pid, Host0, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
 					     {user_dir, UserDirServer},
 					     {password, "morot"}]),
-    
+    Host = ssh_test_lib:ntoa(Host0),
     FP_check_fun = fun(PeerName, FP) ->
-			   ct:pal("PeerName = ~p, FP = ~p",[PeerName,FP]),
-			   HostCheck = (Host == PeerName),
+			   ct:log("PeerName = ~p, FP = ~p",[PeerName,FP]),
+			   HostCheck = ssh_test_lib:match_ip(Host, PeerName),
 			   FPCheck = 
                                if is_atom(HashAlg) -> lists:member(FP, FPs);
                                   is_list(HashAlg) -> lists:all(fun(FP1) -> lists:member(FP1,FPs) end,
@@ -1052,20 +1052,20 @@ id_string_random_client(Config) ->
 %%--------------------------------------------------------------------
 id_string_no_opt_server(Config) ->
     {_Server, Host, Port} = ssh_test_lib:std_daemon(Config, []),
-    {ok,S1}=gen_tcp:connect(Host,Port,[{active,false},{packet,line}]),
+    {ok,S1}=ssh_test_lib:gen_tcp_connect(Host,Port,[{active,false},{packet,line}]),
     {ok,"SSH-2.0-Erlang/"++Vsn} = gen_tcp:recv(S1, 0, 2000),
     true = expected_ssh_vsn(Vsn).
 
 %%--------------------------------------------------------------------
 id_string_own_string_server(Config) ->
     {_Server, Host, Port} = ssh_test_lib:std_daemon(Config, [{id_string,"Olle"}]),
-    {ok,S1}=gen_tcp:connect(Host,Port,[{active,false},{packet,line}]),
+    {ok,S1}=ssh_test_lib:gen_tcp_connect(Host,Port,[{active,false},{packet,line}]),
     {ok,"SSH-2.0-Olle\r\n"} = gen_tcp:recv(S1, 0, 2000).
 
 %%--------------------------------------------------------------------
 id_string_random_server(Config) ->
     {_Server, Host, Port} = ssh_test_lib:std_daemon(Config, [{id_string,random}]),
-    {ok,S1}=gen_tcp:connect(Host,Port,[{active,false},{packet,line}]),
+    {ok,S1}=ssh_test_lib:gen_tcp_connect(Host,Port,[{active,false},{packet,line}]),
     {ok,"SSH-2.0-"++Rnd} = gen_tcp:recv(S1, 0, 2000),
     case Rnd of
 	"Erlang"++_ -> ct:log("Id=~p",[Rnd]),
@@ -1086,11 +1086,11 @@ ssh_connect_negtimeout(Config, Parallel) ->
     ct:log("Parallel: ~p",[Parallel]),
 
     {_Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir},{user_dir, UserDir},
-					      {parallel_login, Parallel},
-					      {negotiation_timeout, NegTimeOut},
-					      {failfun, fun ssh_test_lib:failfun/2}]),
-    
-    {ok,Socket} = gen_tcp:connect(Host, Port, []),
+                                               {parallel_login, Parallel},
+                                               {negotiation_timeout, NegTimeOut},
+                                               {failfun, fun ssh_test_lib:failfun/2}]),
+
+    {ok,Socket} = ssh_test_lib:gen_tcp_connect(Host, Port, []),
 
     Factor = 2,
     ct:log("And now sleeping ~p*NegTimeOut (~p ms)...", [Factor, round(Factor * NegTimeOut)]),
diff --git a/lib/ssh/test/ssh_relay.erl b/lib/ssh/test/ssh_relay.erl
index 28000fbb97..1e3810e9d4 100644
--- a/lib/ssh/test/ssh_relay.erl
+++ b/lib/ssh/test/ssh_relay.erl
@@ -131,7 +131,8 @@ init([ListenAddr, ListenPort, PeerAddr, PeerPort | _Options]) ->
 	    S = #state{local_addr = ListenAddr,
 		       local_port = ListenPort,
 		       lpid = LPid,
-		       peer_addr = PeerAddr,
+		       peer_addr = ssh_test_lib:ntoa(
+                                     ssh_test_lib:mangle_connect_address(PeerAddr)),
 		       peer_port = PeerPort
 		      },
 	    {ok, S};
diff --git a/lib/ssh/test/ssh_sftp_SUITE.erl b/lib/ssh/test/ssh_sftp_SUITE.erl
index acf76157a2..7efeb3a0ad 100644
--- a/lib/ssh/test/ssh_sftp_SUITE.erl
+++ b/lib/ssh/test/ssh_sftp_SUITE.erl
@@ -660,7 +660,7 @@ start_channel_sock(Config) ->
     {Host,Port} = proplists:get_value(peer, Config),
 
     %% Get a tcp socket
-    {ok, Sock} = gen_tcp:connect(Host, Port, [{active,false}]),
+    {ok, Sock} = ssh_test_lib:gen_tcp_connect(Host, Port, [{active,false}]),
 
     %% and open one channel on one new Connection
     {ok, ChPid1, Conn} = ssh_sftp:start_channel(Sock, Opts),
diff --git a/lib/ssh/test/ssh_sftpd_SUITE.erl b/lib/ssh/test/ssh_sftpd_SUITE.erl
index 673fb54a4f..379c0bcb0a 100644
--- a/lib/ssh/test/ssh_sftpd_SUITE.erl
+++ b/lib/ssh/test/ssh_sftpd_SUITE.erl
@@ -705,10 +705,10 @@ try_access(Path, Cm, Channel, ReqId) ->
         {ok, <<?SSH_FXP_STATUS, ?UINT32(ReqId), ?UINT32(Code), Rest/binary>>, <<>>} ->
             case Code of
                 ?SSH_FX_FILE_IS_A_DIRECTORY ->
-                    ct:pal("Got the expected SSH_FX_FILE_IS_A_DIRECTORY status",[]),
+                    ct:log("Got the expected SSH_FX_FILE_IS_A_DIRECTORY status",[]),
                     ok;
                 ?SSH_FX_FAILURE ->
-                    ct:pal("Got the expected SSH_FX_FAILURE status",[]),
+                    ct:log("Got the expected SSH_FX_FAILURE status",[]),
                     ok;
                 _ ->
                     case Rest of
diff --git a/lib/ssh/test/ssh_sup_SUITE.erl b/lib/ssh/test/ssh_sup_SUITE.erl
index fdeb8186a5..dd7c4b1473 100644
--- a/lib/ssh/test/ssh_sup_SUITE.erl
+++ b/lib/ssh/test/ssh_sup_SUITE.erl
@@ -137,16 +137,18 @@ sshd_subtree(Config) when is_list(Config) ->
     HostIP = proplists:get_value(host_ip, Config),
     Port = proplists:get_value(port, Config),
     SystemDir = proplists:get_value(data_dir, Config),
-    ssh:daemon(HostIP, Port, [{system_dir, SystemDir},
-			      {failfun, fun ssh_test_lib:failfun/2},
-			      {user_passwords,
-			       [{?USER, ?PASSWD}]}]),
+    {ok,Daemon} = ssh:daemon(HostIP, Port, [{system_dir, SystemDir},
+                                            {failfun, fun ssh_test_lib:failfun/2},
+                                            {user_passwords,
+                                             [{?USER, ?PASSWD}]}]),
 
-    ?wait_match([{{server,ssh_system_sup, HostIP, Port, ?DEFAULT_PROFILE},
+    ct:log("Expect HostIP=~p, Port=~p, Daemon=~p",[HostIP,Port,Daemon]),
+    ?wait_match([{{server,ssh_system_sup, ListenIP, Port, ?DEFAULT_PROFILE},
 		  Daemon, supervisor,
 		  [ssh_system_sup]}],
 		supervisor:which_children(sshd_sup),
-		Daemon),
+		[ListenIP,Daemon]),
+    true = ssh_test_lib:match_ip(HostIP, ListenIP),
     check_sshd_system_tree(Daemon, Config),
     ssh:stop_daemon(HostIP, Port),
     ct:sleep(?WAIT_FOR_SHUTDOWN),
@@ -161,16 +163,18 @@ sshd_subtree_profile(Config) when is_list(Config) ->
     Profile = proplists:get_value(profile, Config), 
     SystemDir = proplists:get_value(data_dir, Config),
 
-    {ok, _} = ssh:daemon(HostIP, Port, [{system_dir, SystemDir},
-				  {failfun, fun ssh_test_lib:failfun/2},
-				  {user_passwords,
-				   [{?USER, ?PASSWD}]},
-				  {profile, Profile}]),
-    ?wait_match([{{server,ssh_system_sup, HostIP,Port,Profile},
+    {ok, Daemon} = ssh:daemon(HostIP, Port, [{system_dir, SystemDir},
+                                             {failfun, fun ssh_test_lib:failfun/2},
+                                             {user_passwords,
+                                              [{?USER, ?PASSWD}]},
+                                             {profile, Profile}]),
+    ct:log("Expect HostIP=~p, Port=~p, Profile=~p, Daemon=~p",[HostIP,Port,Profile,Daemon]),
+    ?wait_match([{{server,ssh_system_sup, ListenIP,Port,Profile},
 		  Daemon, supervisor,
 		  [ssh_system_sup]}],
 		supervisor:which_children(sshd_sup),
-		Daemon),
+		[ListenIP,Daemon]),
+    true = ssh_test_lib:match_ip(HostIP, ListenIP),
     check_sshd_system_tree(Daemon, Config),
     ssh:stop_daemon(HostIP, Port, Profile),
     ct:sleep(?WAIT_FOR_SHUTDOWN),
@@ -310,3 +314,4 @@ acceptor_pid(DaemonPid) ->
     receive {Pid, supsearch, L} -> {ok,L}
     after 2000 -> timeout
     end.
+
diff --git a/lib/ssh/test/ssh_test_lib.erl b/lib/ssh/test/ssh_test_lib.erl
index 0ada8233a7..6186d44890 100644
--- a/lib/ssh/test/ssh_test_lib.erl
+++ b/lib/ssh/test/ssh_test_lib.erl
@@ -32,15 +32,18 @@
 
 -define(TIMEOUT, 50000).
 
+%%%----------------------------------------------------------------
 connect(Port, Options) when is_integer(Port) ->
     connect(hostname(), Port, Options).
 
 connect(any, Port, Options) ->
     connect(hostname(), Port, Options);
 connect(Host, Port, Options) ->
+    ct:log("~p:~p Calling ssh:connect(~p, ~p, ~p)",[?MODULE,?LINE,Host, Port, Options]),
     {ok, ConnectionRef} = ssh:connect(Host, Port, Options),
     ConnectionRef.
 
+%%%----------------------------------------------------------------
 daemon(Options) ->
     daemon(any, 0, Options).
 
@@ -53,26 +56,57 @@ daemon(Host, Options) ->
 daemon(Host, Port, Options) ->
     ct:log("~p:~p Calling ssh:daemon(~p, ~p, ~p)",[?MODULE,?LINE,Host,Port,Options]),
     case ssh:daemon(Host, Port, Options) of
-	{ok, Pid} when Host == any ->
-	    ct:log("ssh:daemon ok (1)",[]),
-	    {Pid, hostname(), daemon_port(Port,Pid)};
 	{ok, Pid} ->
-	    ct:log("ssh:daemon ok (2)",[]),
-	    {Pid, Host, daemon_port(Port,Pid)};
+            {ok,L} = ssh:daemon_info(Pid),
+            ListenPort = proplists:get_value(port, L),
+            ListenIP = proplists:get_value(ip, L),
+	    {Pid, ListenIP, ListenPort};
 	Error ->
 	    ct:log("ssh:daemon error ~p",[Error]),
 	    Error
     end.
 
+%%%----------------------------------------------------------------
 daemon_port(Pid) -> daemon_port(0, Pid).
     
 
 daemon_port(0, Pid) -> {ok,Dinf} = ssh:daemon_info(Pid),
 		       proplists:get_value(port, Dinf);
 daemon_port(Port, _) -> Port.
-    
 
+%%%----------------------------------------------------------------
+gen_tcp_connect(Host0, Port, Options) ->
+    Host = ssh_test_lib:ntoa(ssh_test_lib:mangle_connect_address(Host0)),
+    ct:log("~p:~p gen_tcp:connect(~p, ~p, ~p)~nHost0 = ~p",
+           [?MODULE,?LINE, Host, Port, Options, Host0]),
+    Result = gen_tcp:connect(Host, Port, Options),
+    ct:log("~p:~p Result = ~p", [?MODULE,?LINE, Result]),
+    Result.
+
+%%%----------------------------------------------------------------
+open_sshc(Host0, Port, OptStr) ->
+    open_sshc(Host0, Port, OptStr, "").
+
+open_sshc(Host0, Port, OptStr, ExecStr) ->
+    Cmd = open_sshc_cmd(Host0, Port, OptStr, ExecStr),
+    Result = os:cmd(Cmd),
+    ct:log("~p:~p Result = ~p", [?MODULE,?LINE, Result]),
+    Result.
 
+
+open_sshc_cmd(Host, Port, OptStr) ->
+    open_sshc_cmd(Host, Port, OptStr, "").
+
+open_sshc_cmd(Host0, Port, OptStr, ExecStr) ->
+    Host = ssh_test_lib:ntoa(ssh_test_lib:mangle_connect_address(Host0)),
+    Cmd = lists:flatten(["ssh -p ", integer_to_list(Port),
+                         " ", OptStr,
+                         " ", Host,
+                         " ", ExecStr]),
+    ct:log("~p:~p OpenSSH Cmd = ~p", [?MODULE,?LINE, Cmd]),
+    Cmd.
+
+%%%----------------------------------------------------------------
 std_daemon(Config, ExtraOpts) ->
     PrivDir = proplists:get_value(priv_dir, Config),
     UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
@@ -88,6 +122,7 @@ std_daemon1(Config, ExtraOpts) ->
 						   {failfun, fun ssh_test_lib:failfun/2}
 						   | ExtraOpts]).
 
+%%%----------------------------------------------------------------
 std_connect(Config, Host, Port, ExtraOpts) ->
     UserDir = proplists:get_value(priv_dir, Config),
     _ConnectionRef =
@@ -98,6 +133,7 @@ std_connect(Config, Host, Port, ExtraOpts) ->
 					  {user_interaction, false}
 					  | ExtraOpts]).
 
+%%%----------------------------------------------------------------
 std_simple_sftp(Host, Port, Config) ->
     std_simple_sftp(Host, Port, Config, []).
 
@@ -112,6 +148,7 @@ std_simple_sftp(Host, Port, Config, Opts) ->
     ok = ssh:close(ConnectionRef),
     Data == ReadData.
 
+%%%----------------------------------------------------------------
 std_simple_exec(Host, Port, Config) ->
     std_simple_exec(Host, Port, Config, []).
 
@@ -138,6 +175,7 @@ std_simple_exec(Host, Port, Config, Opts) ->
 	    ct:fail(ExecResult)
     end.
 
+%%%----------------------------------------------------------------
 start_shell(Port, IOServer) ->
     start_shell(Port, IOServer, []).
 
@@ -152,6 +190,7 @@ start_shell(Port, IOServer, ExtraOptions) ->
       end).
 
 
+%%%----------------------------------------------------------------
 start_io_server() ->
     spawn_link(?MODULE, init_io_server, [self()]).
 
@@ -210,8 +249,7 @@ reply(TestCase, Result) ->
 %%ct:log("reply ~p sending ~p ! ~p",[self(), TestCase, Result]),
     TestCase ! Result.
 
-
-
+%%%----------------------------------------------------------------
 rcv_expected(Expect, SshPort, Timeout) ->
     receive
 	{SshPort, Recvd} when is_function(Expect) ->
@@ -865,3 +903,73 @@ create_random_dir(Config) ->
 	    %% The likelyhood of always generating an existing file name is low
 	    create_random_dir(Config)
     end.
+
+%%%----------------------------------------------------------------
+match_ip(A, B) -> 
+    R = match_ip0(A,B) orelse match_ip0(B,A),      
+    ct:log("match_ip(~p, ~p) -> ~p",[A, B, R]),
+    R.
+
+match_ip0(A, A) ->
+    true;
+match_ip0(any, _) ->
+    true;
+match_ip0(A, B) ->
+    case match_ip1(A, B) of
+        true ->
+            true;
+        false when is_list(A) ->
+            case inet:parse_address(A) of
+                {ok,IPa} -> match_ip0(IPa, B);
+                _ -> false
+            end;
+        false when is_list(B) ->
+            case inet:parse_address(B) of
+                {ok,IPb} -> match_ip0(A, IPb);
+                _ -> false
+            end;
+        false ->
+            false
+    end.
+            
+match_ip1(any, _) -> true;
+match_ip1(loopback,  {127,_,_,_}) ->  true;
+match_ip1({0,0,0,0}, {127,_,_,_}) ->  true;
+match_ip1(loopback,          {0,0,0,0,0,0,0,1}) ->  true;
+match_ip1({0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,1}) ->  true;
+match_ip1(_, _) -> false.
+
+%%%----------------------------------------------------------------
+mangle_connect_address(A) ->
+    mangle_connect_address(A, []).
+
+mangle_connect_address(A, SockOpts) ->
+    mangle_connect_address1(A, proplists:get_value(inet6,SockOpts,false)).
+
+loopback(true) -> {0,0,0,0,0,0,0,1};
+loopback(false) ->      {127,0,0,1}.
+
+mangle_connect_address1( loopback,     V6flg) -> loopback(V6flg);
+mangle_connect_address1(      any,     V6flg) -> loopback(V6flg);
+mangle_connect_address1({0,0,0,0},         _) -> loopback(false);
+mangle_connect_address1({0,0,0,0,0,0,0,0}, _) -> loopback(true);
+mangle_connect_address1(       IP,     _) when is_tuple(IP) -> IP;
+mangle_connect_address1(A, _) ->
+    case catch inet:parse_address(A) of
+        {ok,         {0,0,0,0}} -> loopback(false);
+        {ok, {0,0,0,0,0,0,0,0}} -> loopback(true);
+        _ -> A
+    end.
+
+%%%----------------------------------------------------------------
+ntoa(A) ->
+    try inet:ntoa(A)
+    of
+        {error,_} when is_atom(A) -> atom_to_list(A);
+        {error,_} when is_list(A) -> A;
+        S when is_list(S) -> S
+    catch
+        _:_ when is_atom(A) -> atom_to_list(A);
+        _:_ when is_list(A) -> A
+    end.
+    
diff --git a/lib/ssh/test/ssh_to_openssh_SUITE.erl b/lib/ssh/test/ssh_to_openssh_SUITE.erl
index 7eda009552..35e3ee3edf 100644
--- a/lib/ssh/test/ssh_to_openssh_SUITE.erl
+++ b/lib/ssh/test/ssh_to_openssh_SUITE.erl
@@ -376,18 +376,18 @@ erlang_server_openssh_client_public_key_rsa(Config) when is_list(Config) ->
     erlang_server_openssh_client_public_key_X(Config, ssh_rsa).
 
 
-erlang_server_openssh_client_public_key_X(Config, PubKeyAlg) ->
+erlang_server_openssh_client_public_key_X(Config, _PubKeyAlg) ->
     SystemDir = proplists:get_value(data_dir, Config),
     PrivDir = proplists:get_value(priv_dir, Config),
     KnownHosts = filename:join(PrivDir, "known_hosts"),
     {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir},
 					     {failfun, fun ssh_test_lib:failfun/2}]),
-
     ct:sleep(500),
 
-    Cmd = "ssh -p " ++ integer_to_list(Port) ++
-	" -o UserKnownHostsFile=" ++ KnownHosts ++
-	" " ++ Host ++ " 1+1.",
+    Cmd = ssh_test_lib:open_sshc_cmd(Host, Port,
+                                     [" -o UserKnownHostsFile=", KnownHosts,
+                                      " -o StrictHostKeyChecking=no"],
+                                     "1+1."),
     OpenSsh = ssh_test_lib:open_port({spawn, Cmd}),
     ssh_test_lib:rcv_expected({data,<<"2\n">>}, OpenSsh, ?TIMEOUT),
     ssh:stop_daemon(Pid).
@@ -395,13 +395,13 @@ erlang_server_openssh_client_public_key_X(Config, PubKeyAlg) ->
 %%--------------------------------------------------------------------
 %% Test that the Erlang/OTP server can renegotiate with openSSH
 erlang_server_openssh_client_renegotiate(Config) ->
-    PubKeyAlg = ssh_rsa,
+    _PubKeyAlg = ssh_rsa,
     SystemDir = proplists:get_value(data_dir, Config),
     PrivDir = proplists:get_value(priv_dir, Config),
     KnownHosts = filename:join(PrivDir, "known_hosts"),
 
     {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir},
-					     {failfun, fun ssh_test_lib:failfun/2}]),
+                                              {failfun, fun ssh_test_lib:failfun/2}]),
     ct:sleep(500),
 
     RenegLimitK = 3,
@@ -409,11 +409,13 @@ erlang_server_openssh_client_renegotiate(Config) ->
     Data =  lists:duplicate(trunc(1.1*RenegLimitK*1024), $a),
     ok = file:write_file(DataFile, Data),
 
-    Cmd = "ssh -p " ++ integer_to_list(Port) ++
-	" -o UserKnownHostsFile=" ++ KnownHosts ++
-	" -o RekeyLimit=" ++ integer_to_list(RenegLimitK) ++"K" ++
-	" " ++ Host ++ " < " ++ DataFile,
-    OpenSsh = ssh_test_lib:open_port({spawn, Cmd}),
+    Cmd = ssh_test_lib:open_sshc_cmd(Host, Port,
+                                     [" -o UserKnownHostsFile=", KnownHosts,
+                                      " -o StrictHostKeyChecking=no",
+                                      " -o RekeyLimit=",integer_to_list(RenegLimitK),"K"]),
+
+
+    OpenSsh = ssh_test_lib:open_port({spawn, Cmd++" < "++DataFile}),
 
     Expect = fun({data,R}) -> 
 		     try
@@ -462,7 +464,7 @@ erlang_client_openssh_server_renegotiate(_Config) ->
 			     {silently_accept_hosts,true}],
 		  group_leader(IO, self()),
 		  {ok, ConnRef} = ssh:connect(Host, ?SSH_DEFAULT_PORT, Options),
-                  ct:pal("Parent = ~p, IO = ~p, Shell = ~p, ConnRef = ~p~n",[Parent, IO, self(), ConnRef]),
+                  ct:log("Parent = ~p, IO = ~p, Shell = ~p, ConnRef = ~p~n",[Parent, IO, self(), ConnRef]),
 		  case ssh_connection:session_channel(ConnRef, infinity) of
 		      {ok,ChannelId}  ->
 			  success = ssh_connection:ptty_alloc(ConnRef, ChannelId, []),
diff --git a/lib/ssh/test/ssh_trpt_test_lib.erl b/lib/ssh/test/ssh_trpt_test_lib.erl
index 261239c152..e1f4c65300 100644
--- a/lib/ssh/test/ssh_trpt_test_lib.erl
+++ b/lib/ssh/test/ssh_trpt_test_lib.erl
@@ -314,8 +314,7 @@ mangle_opts(Options) ->
 				   lists:keydelete(K,1,Opts)
 			   end, Options, SysOpts).
     
-host({0,0,0,0}) -> "localhost";
-host(H) -> H.
+host(H) -> ssh_test_lib:ntoa(ssh_test_lib:mangle_connect_address(H)).
 
 %%%----------------------------------------------------------------
 send(S=#s{ssh=C}, hello) ->
-- 
cgit v1.2.3