diff options
author | Erlang/OTP <[email protected]> | 2014-09-29 08:59:43 +0200 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2014-09-29 08:59:43 +0200 |
commit | 932a9904f1ef192c2f32b32ec8bbae1bb9a333e5 (patch) | |
tree | b13c5baf13109670ffc3dd8d47d0b7619998fe6b /lib/ssh/src | |
parent | 853af0f4739e53e32c655373488c0fadcab9e421 (diff) | |
parent | 8ff6dc862d330c62ab520d03e8a26174b4350424 (diff) | |
download | otp-932a9904f1ef192c2f32b32ec8bbae1bb9a333e5.tar.gz otp-932a9904f1ef192c2f32b32ec8bbae1bb9a333e5.tar.bz2 otp-932a9904f1ef192c2f32b32ec8bbae1bb9a333e5.zip |
Merge branch 'hans/ssh/parallel_login_not_working/OTP-12194' into maint-17
* hans/ssh/parallel_login_not_working/OTP-12194:
ssh: Fixed parallel_login bug that made all logins serial
Diffstat (limited to 'lib/ssh/src')
-rw-r--r-- | lib/ssh/src/ssh_connection_handler.erl | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index 86804c4436..a1e505961a 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -103,12 +103,22 @@ start_connection(client = Role, Socket, Options, Timeout) -> end; start_connection(server = Role, Socket, Options, Timeout) -> + SSH_Opts = proplists:get_value(ssh_opts, Options, []), try - case proplists:get_value(parallel_login, Options, false) of + case proplists:get_value(parallel_login, SSH_Opts, false) of true -> - spawn(fun() -> start_server_connection(Role, Socket, Options, Timeout) end); + HandshakerPid = + spawn_link(fun() -> + receive + {do_handshake, Pid} -> + handshake(Pid, erlang:monitor(process,Pid), Timeout) + end + end), + ChildPid = start_the_connection_child(HandshakerPid, Role, Socket, Options), + HandshakerPid ! {do_handshake, ChildPid}; false -> - start_server_connection(Role, Socket, Options, Timeout) + ChildPid = start_the_connection_child(self(), Role, Socket, Options), + handshake(ChildPid, erlang:monitor(process,ChildPid), Timeout) end catch exit:{noproc, _} -> @@ -117,16 +127,14 @@ start_connection(server = Role, Socket, Options, Timeout) -> {error, Error} end. - -start_server_connection(server = Role, Socket, Options, Timeout) -> +start_the_connection_child(UserPid, Role, Socket, Options) -> Sups = proplists:get_value(supervisors, Options), ConnectionSup = proplists:get_value(connection_sup, Sups), - Opts = [{supervisors, Sups}, {user_pid, self()} | proplists:get_value(ssh_opts, Options, [])], + Opts = [{supervisors, Sups}, {user_pid, UserPid} | proplists:get_value(ssh_opts, Options, [])], {ok, Pid} = ssh_connection_sup:start_child(ConnectionSup, [Role, Socket, Opts]), {_, Callback, _} = proplists:get_value(transport, Options, {tcp, gen_tcp, tcp_closed}), socket_control(Socket, Pid, Callback), - Ref = erlang:monitor(process, Pid), - handshake(Pid, Ref, Timeout). + Pid. start_link(Role, Socket, Options) -> |