From a06cd043eab256539459d765a4856fc156ed96d4 Mon Sep 17 00:00:00 2001 From: Ingela Anderton Andin Date: Thu, 22 Mar 2012 16:23:27 +0100 Subject: ssh:close/1 will no longer crash if ssl manager already happens to have been terminated. The function ssh_connection_manager:call now handles that exit reason may be shutdown. --- lib/ssh/src/ssh_connection_manager.erl | 22 +++++++++------------- lib/ssh/test/ssh_basic_SUITE.erl | 30 +++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/lib/ssh/src/ssh_connection_manager.erl b/lib/ssh/src/ssh_connection_manager.erl index 406a042d72..e993f597a5 100644 --- a/lib/ssh/src/ssh_connection_manager.erl +++ b/lib/ssh/src/ssh_connection_manager.erl @@ -144,27 +144,21 @@ adjust_window(ConnectionManager, Channel, Bytes) -> cast(ConnectionManager, {adjust_window, Channel, Bytes}). close(ConnectionManager, ChannelId) -> - try call(ConnectionManager, {close, ChannelId}) of - ok -> + case call(ConnectionManager, {close, ChannelId}) of + ok -> ok; - {error, channel_closed} -> - ok - catch - exit:{noproc, _} -> + {error, channel_closed} -> ok - end. + end. stop(ConnectionManager) -> - try call(ConnectionManager, stop) of + case call(ConnectionManager, stop) of ok -> ok; {error, channel_closed} -> ok - catch - exit:{noproc, _} -> - ok end. - + send(ConnectionManager, ChannelId, Type, Data, Timeout) -> call(ConnectionManager, {data, ChannelId, Type, Data}, Timeout). @@ -591,7 +585,9 @@ call(Pid, Msg, Timeout) -> catch exit:{timeout, _} -> {error, timeout}; - exit:{normal, _} -> + exit:{normal} -> + {error, channel_closed}; + exit:{{shutdown, _}, _} -> {error, channel_closed}; exit:{noproc,_} -> {error, channel_closed} diff --git a/lib/ssh/test/ssh_basic_SUITE.erl b/lib/ssh/test/ssh_basic_SUITE.erl index 012367a6df..d66214d415 100644 --- a/lib/ssh/test/ssh_basic_SUITE.erl +++ b/lib/ssh/test/ssh_basic_SUITE.erl @@ -110,7 +110,8 @@ all() -> {group, rsa_pass_key}, {group, internal_error}, daemon_already_started, - server_password_option, server_userpassword_option]. + server_password_option, server_userpassword_option, + close]. groups() -> [{dsa_key, [], [exec, exec_compressed, shell, known_hosts]}, @@ -507,7 +508,34 @@ internal_error(Config) when is_list(Config) -> {user_dir, UserDir}, {user_interaction, false}]). +%%-------------------------------------------------------------------- +close(doc) -> + ["Simulate that we try to close an already closed connection"]; + +close(suite) -> + []; + +close(Config) when is_list(Config) -> + SystemDir = ?config(data_dir, Config), + PrivDir = ?config(priv_dir, Config), + UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth + file:make_dir(UserDir), + + {_Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir}, + {user_dir, UserDir}, + {user_passwords, [{"vego", "morot"}]}, + {failfun, fun ssh_test_lib:failfun/2}]), + {ok, CM} = ssh:connect(Host, Port, [{silently_accept_hosts, true}, + {user_dir, UserDir}, + {user, "vego"}, + {password, "morot"}, + {user_interaction, false}]), + exit(CM, {shutdown, normal}), + ok = ssh:close(CM). + + + %%-------------------------------------------------------------------- %% Internal functions %%-------------------------------------------------------------------- -- cgit v1.2.3