aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Sabogal <dsabogalcc@gmail.com>2016-10-23 02:08:27 -0400
committerTimo Teräs <timo.teras@iki.fi>2016-11-04 06:59:13 +0000
commit5e0e13f1cd4e82636b2ec6ce88510d792aad706d (patch)
tree01e07babdd848d6fa5d918aad3d8c475dd15e473
parent156d008505827a7e207999c1ec0a00a4c5f022cc (diff)
downloadaports-5e0e13f1cd4e82636b2ec6ce88510d792aad706d.tar.bz2
aports-5e0e13f1cd4e82636b2ec6ce88510d792aad706d.tar.xz
community/erlang: upgrade to 19.1.0
fixes #6332
-rw-r--r--community/erlang/0015-otp-update-version-19.0.1.patch1233
-rw-r--r--community/erlang/APKBUILD41
2 files changed, 16 insertions, 1258 deletions
diff --git a/community/erlang/0015-otp-update-version-19.0.1.patch b/community/erlang/0015-otp-update-version-19.0.1.patch
deleted file mode 100644
index 31dcb2915..000000000
--- a/community/erlang/0015-otp-update-version-19.0.1.patch
+++ /dev/null
@@ -1,1233 +0,0 @@
---- a/OTP_VERSION
-+++ b/OTP_VERSION
-@@ -1 +1 @@
--19.0
-+19.0.1
---- a/erts/doc/src/notes.xml
-+++ b/erts/doc/src/notes.xml
-@@ -32,6 +32,24 @@
- <p>This document describes the changes made to the ERTS application.</p>
-
-
-+<section><title>Erts 8.0.1</title>
-+
-+ <section><title>Fixed Bugs and Malfunctions</title>
-+ <list>
-+ <item>
-+ <p>
-+ A memory allocation bug in <c>group_leader/2</c> could
-+ cause an emulator crash when garbage collecting a process
-+ that had been assigned a remote group leader. This bug
-+ was introduced in ERTS version 8.0.</p>
-+ <p>
-+ Own Id: OTP-13716</p>
-+ </item>
-+ </list>
-+ </section>
-+
-+</section>
-+
- <section><title>Erts 8.0</title>
-
- <section><title>Fixed Bugs and Malfunctions</title>
---- a/erts/emulator/beam/bif.c
-+++ b/erts/emulator/beam/bif.c
-@@ -4305,8 +4305,9 @@ BIF_RETTYPE group_leader_2(BIF_ALIST_2)
- else {
- locks &= ~ERTS_PROC_LOCK_STATUS;
- erts_smp_proc_unlock(new_member, ERTS_PROC_LOCK_STATUS);
-- if (erts_smp_atomic32_read_nob(&new_member->state)
-- & !(ERTS_PSFLG_DIRTY_RUNNING|ERTS_PSFLG_DIRTY_RUNNING_SYS)) {
-+ if (new_member == BIF_P
-+ || !(erts_smp_atomic32_read_nob(&new_member->state)
-+ & (ERTS_PSFLG_DIRTY_RUNNING|ERTS_PSFLG_DIRTY_RUNNING_SYS))) {
- new_member->group_leader = STORE_NC_IN_PROC(new_member,
- BIF_ARG_1);
- }
-@@ -4326,6 +4327,7 @@ BIF_RETTYPE group_leader_2(BIF_ALIST_2)
- BIF_ARG_1);
- bp->next = new_member->mbuf;
- new_member->mbuf = bp;
-+ new_member->mbuf_sz += bp->used_size;
- }
- }
- }
---- a/erts/vsn.mk
-+++ b/erts/vsn.mk
-@@ -18,7 +18,7 @@
- # %CopyrightEnd%
- #
-
--VSN = 8.0
-+VSN = 8.0.1
-
- # Port number 4365 in 4.2
- # Port number 4366 in 4.3
---- a/lib/dialyzer/doc/src/notes.xml
-+++ b/lib/dialyzer/doc/src/notes.xml
-@@ -32,6 +32,20 @@
- <p>This document describes the changes made to the Dialyzer
- application.</p>
-
-+<section><title>Dialyzer 3.0.1</title>
-+
-+ <section><title>Fixed Bugs and Malfunctions</title>
-+ <list>
-+ <item>
-+ <p>Fix a map related bug.</p>
-+ <p>
-+ Own Id: OTP-13709 Aux Id: ERL-177, PR-1115 </p>
-+ </item>
-+ </list>
-+ </section>
-+
-+</section>
-+
- <section><title>Dialyzer 3.0</title>
-
- <section><title>Fixed Bugs and Malfunctions</title>
---- /dev/null
-+++ b/lib/dialyzer/test/map_SUITE_data/src/mand_remote_val/a.erl
-@@ -0,0 +1,9 @@
-+-module(a).
-+-export([to_map/1, to_map/2]).
-+-type t() :: #{type := b:t()}.
-+
-+-spec to_map(t()) -> map().
-+to_map(Resource) -> to_map(Resource, #{}).
-+
-+-spec to_map(t(), map()) -> map().
-+to_map(_, Map) when is_map(Map) -> #{}.
---- /dev/null
-+++ b/lib/dialyzer/test/map_SUITE_data/src/mand_remote_val/b.erl
-@@ -0,0 +1,3 @@
-+-module(b).
-+-export_type([t/0]).
-+-type t() :: binary().
---- a/lib/dialyzer/vsn.mk
-+++ b/lib/dialyzer/vsn.mk
-@@ -1 +1 @@
--DIALYZER_VSN = 3.0
-+DIALYZER_VSN = 3.0.1
---- a/lib/hipe/cerl/erl_types.erl
-+++ b/lib/hipe/cerl/erl_types.erl
-@@ -1664,10 +1664,12 @@ t_map(Pairs0, DefK0, DefV0) ->
- %% define(DEBUG, true).
- try
- validate_map_elements(Pairs)
-- catch error:badarg -> error(badarg, [Pairs0,DefK0,DefV0]);
-- error:{badarg, E} -> error({badarg, E}, [Pairs0,DefK0,DefV0])
-+ catch error:badarg -> error(badarg, [Pairs0,DefK0,DefV0])
- end,
-- ?map(Pairs, DefK, DefV).
-+ case map_pairs_are_none(Pairs) of
-+ true -> ?none;
-+ false -> ?map(Pairs, DefK, DefV)
-+ end.
-
- normalise_map_optionals([], _, _) -> [];
- normalise_map_optionals([E={K,?opt,?none}|T], DefK, DefV) ->
-@@ -1684,7 +1686,6 @@ normalise_map_optionals([E={K,?opt,V}|T], DefK, DefV) ->
- normalise_map_optionals([E|T], DefK, DefV) ->
- [E|normalise_map_optionals(T, DefK, DefV)].
-
--validate_map_elements([{_,?mand,?none}|_]) -> error({badarg, none_in_mand});
- validate_map_elements([{K1,_,_}|Rest=[{K2,_,_}|_]]) ->
- case is_singleton_type(K1) andalso K1 < K2 of
- false -> error(badarg);
-@@ -1697,6 +1698,10 @@ validate_map_elements([{K,_,_}]) ->
- end;
- validate_map_elements([]) -> true.
-
-+map_pairs_are_none([]) -> false;
-+map_pairs_are_none([{_,?mand,?none}|_]) -> true;
-+map_pairs_are_none([_|Ps]) -> map_pairs_are_none(Ps).
-+
- -spec t_is_map(erl_type()) -> boolean().
-
- t_is_map(Type) ->
-@@ -2833,12 +2838,7 @@ t_inf(?map(_, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B, _Opaques) ->
- %% becomes mandatory in the infinumum
- (K, _, V1, _, V2) -> {K, ?mand, t_inf(V1, V2)}
- end, A, B),
-- %% If the infinimum of any mandatory values is ?none, the entire map infinimum
-- %% is ?none.
-- case lists:any(fun({_,?mand,?none})->true; ({_,_,_}) -> false end, Pairs) of
-- true -> t_none();
-- false -> t_map(Pairs, t_inf(ADefK, BDefK), t_inf(ADefV, BDefV))
-- end;
-+ t_map(Pairs, t_inf(ADefK, BDefK), t_inf(ADefV, BDefV));
- t_inf(?matchstate(Pres1, Slots1), ?matchstate(Pres2, Slots2), _Opaques) ->
- ?matchstate(t_inf(Pres1, Pres2), t_inf(Slots1, Slots2));
- t_inf(?nil, ?nil, _Opaques) -> ?nil;
---- a/lib/inets/doc/src/notes.xml
-+++ b/lib/inets/doc/src/notes.xml
-@@ -33,7 +33,23 @@
- <file>notes.xml</file>
- </header>
-
-- <section><title>Inets 6.3</title>
-+ <section><title>Inets 6.3.1</title>
-+
-+ <section><title>Fixed Bugs and Malfunctions</title>
-+ <list>
-+ <item>
-+ <p>
-+ A debug message was accidently left enabled in the ftp
-+ client.</p>
-+ <p>
-+ Own Id: OTP-13712 Aux Id: seq13143 </p>
-+ </item>
-+ </list>
-+ </section>
-+
-+</section>
-+
-+<section><title>Inets 6.3</title>
-
- <section><title>Fixed Bugs and Malfunctions</title>
- <list>
---- a/lib/inets/src/ftp/ftp.erl
-+++ b/lib/inets/src/ftp/ftp.erl
-@@ -106,8 +106,8 @@
- -type common_reason() :: 'econn' | 'eclosed' | term().
- -type file_write_error_reason() :: term(). % See file:write for more info
-
--%%-define(DBG(F,A), 'n/a').
---define(DBG(F,A), io:format(F,A)).
-+-define(DBG(F,A), 'n/a').
-+%%-define(DBG(F,A), io:format(F,A)).
-
- %%%=========================================================================
- %%% API - CLIENT FUNCTIONS
-@@ -2099,7 +2099,7 @@ handle_ctrl_result({pos_prel, _}, #state{caller = {transfer_data, Bin}}
-
- %%--------------------------------------------------------------------------
- %% Default
--handle_ctrl_result({Status, Lines}, #state{client = From} = State)
-+handle_ctrl_result({Status, _Lines}, #state{client = From} = State)
- when From =/= undefined ->
- ctrl_result_response(Status, State, {error, Status}).
-
---- a/lib/inets/vsn.mk
-+++ b/lib/inets/vsn.mk
-@@ -19,6 +19,6 @@
- # %CopyrightEnd%
-
- APPLICATION = inets
--INETS_VSN = 6.3
-+INETS_VSN = 6.3.1
- PRE_VSN =
- APP_VSN = "$(APPLICATION)-$(INETS_VSN)$(PRE_VSN)"
---- a/lib/observer/doc/src/notes.xml
-+++ b/lib/observer/doc/src/notes.xml
-@@ -32,6 +32,23 @@
- <p>This document describes the changes made to the Observer
- application.</p>
-
-+<section><title>Observer 2.2.1</title>
-+
-+ <section><title>Fixed Bugs and Malfunctions</title>
-+ <list>
-+ <item>
-+ <p>
-+ Fixed a crash happening when observing another node, who
-+ have a different number of schedulers than the current
-+ one.</p>
-+ <p>
-+ Own Id: OTP-13702 Aux Id: ERL-171 </p>
-+ </item>
-+ </list>
-+ </section>
-+
-+</section>
-+
- <section><title>Observer 2.2</title>
-
- <section><title>Improvements and New Features</title>
---- a/lib/observer/src/observer_perf_wx.erl
-+++ b/lib/observer/src/observer_perf_wx.erl
-@@ -235,12 +235,14 @@ terminate(_Event, #state{appmon=Pid}) ->
- code_change(_, _, State) ->
- State.
-
--restart_fetcher(Node, #state{appmon=Old, panel=Panel, time=#ti{fetch=Freq}=Ti}=State) ->
-+restart_fetcher(Node, #state{appmon=Old, panel=Panel, time=#ti{fetch=Freq}=Ti, wins=Wins0}=State) ->
- catch Old ! exit,
- Me = self(),
- Pid = spawn_link(Node, observer_backend, fetch_stats, [Me, round(1000/Freq)]),
- wxWindow:refresh(Panel),
-- precalc(State#state{active=true, appmon=Pid, samples=reset_data(), time=Ti#ti{tick=0}}).
-+ Wins = [W#win{state=undefined} || W <- Wins0],
-+ precalc(State#state{active=true, appmon=Pid, samples=reset_data(),
-+ wins=Wins, time=Ti#ti{tick=0}}).
-
- reset_data() ->
- {0, queue:new()}.
-@@ -253,18 +255,25 @@ add_data(Stats, {N, Q}, Wins, _, Active) ->
-
- add_data_1([#win{state={_,St}}|_]=Wins0, Last, N, {Drop, Q}, Active)
- when St /= undefined ->
-- {Wins, Stat} =
-- lists:mapfoldl(fun(Win0, Entry) ->
-- {Win1,Stat} = add_data_2(Win0, Last, Entry),
-- case Active of
-- true ->
-- Win = add_data_3(Win1, N, Drop, Stat, Q),
-- {Win, Stat};
-- false ->
-- {Win1, Stat}
-- end
-- end, #{}, Wins0),
-- {Wins, {N,queue:in(Stat#{}, Q)}};
-+ try
-+ {Wins, Stat} =
-+ lists:mapfoldl(fun(Win0, Entry) ->
-+ {Win1,Stat} = add_data_2(Win0, Last, Entry),
-+ case Active of
-+ true ->
-+ Win = add_data_3(Win1, N, Drop, Stat, Q),
-+ {Win, Stat};
-+ false ->
-+ {Win1, Stat}
-+ end
-+ end, #{}, Wins0),
-+ {Wins, {N,queue:in(Stat#{}, Q)}}
-+ catch no_scheduler_change ->
-+ {[Win#win{state=init_data(Id, Last),
-+ info = info(Id, Last)}
-+ || #win{name=Id}=Win <- Wins0], {0,queue:new()}}
-+ end;
-+
- add_data_1(Wins, Stats, 1, {_, Q}, _) ->
- {[Win#win{state=init_data(Id, Stats),
- info = info(Id, Stats)}
-@@ -409,7 +418,8 @@ collect_data(utilz, MemInfo, Max) ->
-
- calc_delta([{Id, WN, TN}|Ss], [{Id, WP, TP}|Ps]) ->
- [100*(WN-WP) div (TN-TP)|calc_delta(Ss, Ps)];
--calc_delta([], []) -> [].
-+calc_delta([], []) -> [];
-+calc_delta(_, _) -> throw(no_scheduler_change).
-
- precalc(#state{samples=Data0, paint=Paint, time=Ti, wins=Wins0}=State) ->
- Wins = [precalc(Ti, Data0, Paint, Win) || Win <- Wins0],
---- a/lib/observer/vsn.mk
-+++ b/lib/observer/vsn.mk
-@@ -1 +1 @@
--OBSERVER_VSN = 2.2
-+OBSERVER_VSN = 2.2.1
---- a/lib/ssh/doc/src/notes.xml
-+++ b/lib/ssh/doc/src/notes.xml
-@@ -30,6 +30,30 @@
- <file>notes.xml</file>
- </header>
-
-+<section><title>Ssh 4.3.1</title>
-+
-+ <section><title>Fixed Bugs and Malfunctions</title>
-+ <list>
-+ <item>
-+ <p>
-+ SSH client does not any longer retry a bad password given
-+ as option to ssh:connect et al.</p>
-+ <p>
-+ Own Id: OTP-13674 Aux Id: TR-HU92273 </p>
-+ </item>
-+ <item>
-+ <p>
-+ Removed possible hanging risk for a certain timing
-+ sequence when communicating client and server executes on
-+ the same node.</p>
-+ <p>
-+ Own Id: OTP-13715</p>
-+ </item>
-+ </list>
-+ </section>
-+
-+</section>
-+
- <section><title>Ssh 4.3</title>
-
- <section><title>Improvements and New Features</title>
---- a/lib/ssh/src/ssh_auth.erl
-+++ b/lib/ssh/src/ssh_auth.erl
-@@ -31,12 +31,111 @@
- -export([publickey_msg/1, password_msg/1, keyboard_interactive_msg/1,
- service_request_msg/1, init_userauth_request_msg/1,
- userauth_request_msg/1, handle_userauth_request/3,
-- handle_userauth_info_request/3, handle_userauth_info_response/2
-+ handle_userauth_info_request/2, handle_userauth_info_response/2
- ]).
-
- %%--------------------------------------------------------------------
- %%% Internal application API
- %%--------------------------------------------------------------------
-+%%%----------------------------------------------------------------
-+userauth_request_msg(#ssh{userauth_methods = ServerMethods,
-+ userauth_supported_methods = UserPrefMethods, % Note: this is not documented as supported for clients
-+ userauth_preference = ClientMethods0
-+ } = Ssh0) ->
-+ case sort_select_mthds(ClientMethods0, UserPrefMethods, ServerMethods) of
-+ [] ->
-+ Msg = #ssh_msg_disconnect{code = ?SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE,
-+ description = "Unable to connect using the available authentication methods",
-+ language = "en"},
-+ {disconnect, Msg, ssh_transport:ssh_packet(Msg, Ssh0)};
-+
-+ [{Pref,Module,Function,Args} | Prefs] ->
-+ Ssh = case Pref of
-+ "keyboard-interactive" -> Ssh0;
-+ _ -> Ssh0#ssh{userauth_preference = Prefs}
-+ end,
-+ case Module:Function(Args ++ [Ssh]) of
-+ {not_ok, Ssh1} ->
-+ userauth_request_msg(Ssh1#ssh{userauth_preference = Prefs});
-+ Result ->
-+ {Pref,Result}
-+ end
-+ end.
-+
-+
-+
-+sort_select_mthds(Clients, undefined, Servers) ->
-+ %% User has not expressed an opinion via option "auth_methods", use the server's prefs
-+ sort_select_mthds1(Clients, Servers, string:tokens(?SUPPORTED_AUTH_METHODS,","));
-+
-+sort_select_mthds(Clients, Users0, Servers0) ->
-+ %% The User has an opinion, use the intersection of that and the Servers whishes but
-+ %% in the Users order
-+ sort_select_mthds1(Clients, string:tokens(Users0,","), Servers0).
-+
-+
-+sort_select_mthds1(Clients, Users0, Servers0) ->
-+ Servers = unique(Servers0),
-+ Users = unique(Users0),
-+ [C || Key <- Users,
-+ lists:member(Key, Servers),
-+ C <- Clients,
-+ element(1,C) == Key].
-+
-+unique(L) ->
-+ lists:reverse(
-+ lists:foldl(fun(E,Acc) ->
-+ case lists:member(E,Acc) of
-+ true -> Acc;
-+ false -> [E|Acc]
-+ end
-+ end, [], L)).
-+
-+
-+%%%---- userauth_request_msg "callbacks"
-+password_msg([#ssh{opts = Opts, io_cb = IoCb,
-+ user = User, service = Service} = Ssh0]) ->
-+ {Password,Ssh} =
-+ case proplists:get_value(password, Opts) of
-+ undefined when IoCb == ssh_no_io ->
-+ {not_ok, Ssh0};
-+ undefined ->
-+ {IoCb:read_password("ssh password: ",Ssh0), Ssh0};
-+ PW ->
-+ %% If "password" option is given it should not be tried again
-+ {PW, Ssh0#ssh{opts = lists:keyreplace(password,1,Opts,{password,not_ok})}}
-+ end,
-+ case Password of
-+ not_ok ->
-+ {not_ok, Ssh};
-+ _ ->
-+ ssh_transport:ssh_packet(
-+ #ssh_msg_userauth_request{user = User,
-+ service = Service,
-+ method = "password",
-+ data =
-+ <<?BOOLEAN(?FALSE),
-+ ?STRING(unicode:characters_to_binary(Password))>>},
-+ Ssh)
-+ end.
-+
-+%% See RFC 4256 for info on keyboard-interactive
-+keyboard_interactive_msg([#ssh{user = User,
-+ opts = Opts,
-+ service = Service} = Ssh]) ->
-+ case proplists:get_value(password, Opts) of
-+ not_ok ->
-+ {not_ok,Ssh}; % No need to use a failed pwd once more
-+ _ ->
-+ ssh_transport:ssh_packet(
-+ #ssh_msg_userauth_request{user = User,
-+ service = Service,
-+ method = "keyboard-interactive",
-+ data = << ?STRING(<<"">>),
-+ ?STRING(<<>>) >> },
-+ Ssh)
-+ end.
-+
- publickey_msg([Alg, #ssh{user = User,
- session_id = SessionId,
- service = Service,
-@@ -48,7 +147,7 @@ publickey_msg([Alg, #ssh{user = User,
- StrAlgo = atom_to_list(Alg),
- case encode_public_key(StrAlgo, ssh_transport:extract_public_key(PrivKey)) of
- not_ok ->
-- not_ok;
-+ {not_ok, Ssh};
- PubKeyBlob ->
- SigData = build_sig_data(SessionId,
- User, Service, PubKeyBlob, StrAlgo),
-@@ -65,52 +164,15 @@ publickey_msg([Alg, #ssh{user = User,
- Ssh)
- end;
- _Error ->
-- not_ok
-- end.
--
--password_msg([#ssh{opts = Opts, io_cb = IoCb,
-- user = User, service = Service} = Ssh]) ->
-- Password = case proplists:get_value(password, Opts) of
-- undefined ->
-- user_interaction(IoCb, Ssh);
-- PW ->
-- PW
-- end,
-- case Password of
-- not_ok ->
-- not_ok;
-- _ ->
-- ssh_transport:ssh_packet(
-- #ssh_msg_userauth_request{user = User,
-- service = Service,
-- method = "password",
-- data =
-- <<?BOOLEAN(?FALSE),
-- ?STRING(unicode:characters_to_binary(Password))>>},
-- Ssh)
-+ {not_ok, Ssh}
- end.
-
--user_interaction(ssh_no_io, _) ->
-- not_ok;
--user_interaction(IoCb, Ssh) ->
-- IoCb:read_password("ssh password: ", Ssh).
--
--
--%% See RFC 4256 for info on keyboard-interactive
--keyboard_interactive_msg([#ssh{user = User,
-- service = Service} = Ssh]) ->
-- ssh_transport:ssh_packet(
-- #ssh_msg_userauth_request{user = User,
-- service = Service,
-- method = "keyboard-interactive",
-- data = << ?STRING(<<"">>),
-- ?STRING(<<>>) >> },
-- Ssh).
--
-+%%%----------------------------------------------------------------
- service_request_msg(Ssh) ->
- ssh_transport:ssh_packet(#ssh_msg_service_request{name = "ssh-userauth"},
- Ssh#ssh{service = "ssh-userauth"}).
-
-+%%%----------------------------------------------------------------
- init_userauth_request_msg(#ssh{opts = Opts} = Ssh) ->
- case user_name(Opts) of
- {ok, User} ->
-@@ -140,34 +202,9 @@ init_userauth_request_msg(#ssh{opts = Opts} = Ssh) ->
- description = ErrStr})
- end.
-
--userauth_request_msg(#ssh{userauth_preference = []} = Ssh) ->
-- Msg = #ssh_msg_disconnect{code =
-- ?SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE,
-- description = "Unable to connect using the available"
-- " authentication methods",
-- language = "en"},
-- {disconnect, Msg, ssh_transport:ssh_packet(Msg, Ssh)};
--
--userauth_request_msg(#ssh{userauth_methods = Methods,
-- userauth_preference = [{Pref, Module,
-- Function, Args} | Prefs]}
-- = Ssh0) ->
-- Ssh = Ssh0#ssh{userauth_preference = Prefs},
-- case lists:member(Pref, Methods) of
-- true ->
-- case Module:Function(Args ++ [Ssh]) of
-- not_ok ->
-- userauth_request_msg(Ssh);
-- Result ->
-- {Pref,Result}
-- end;
-- false ->
-- userauth_request_msg(Ssh)
-- end.
--
--
--handle_userauth_request(#ssh_msg_service_request{name =
-- Name = "ssh-userauth"},
-+%%%----------------------------------------------------------------
-+%%% called by server
-+handle_userauth_request(#ssh_msg_service_request{name = Name = "ssh-userauth"},
- _, Ssh) ->
- {ok, ssh_transport:ssh_packet(#ssh_msg_service_accept{name = Name},
- Ssh#ssh{service = "ssh-connection"})};
-@@ -319,21 +356,28 @@ handle_userauth_request(#ssh_msg_userauth_request{user = User,
- partial_success = false}, Ssh)}.
-
-
--
--handle_userauth_info_request(
-- #ssh_msg_userauth_info_request{name = Name,
-- instruction = Instr,
-- num_prompts = NumPrompts,
-- data = Data}, IoCb,
-- #ssh{opts = Opts} = Ssh) ->
-+%%%----------------------------------------------------------------
-+%%% keyboard-interactive client
-+handle_userauth_info_request(#ssh_msg_userauth_info_request{name = Name,
-+ instruction = Instr,
-+ num_prompts = NumPrompts,
-+ data = Data},
-+ #ssh{opts = Opts,
-+ io_cb = IoCb
-+ } = Ssh) ->
- PromptInfos = decode_keyboard_interactive_prompts(NumPrompts,Data),
-- Responses = keyboard_interact_get_responses(IoCb, Opts,
-- Name, Instr, PromptInfos),
-- {ok,
-- ssh_transport:ssh_packet(
-- #ssh_msg_userauth_info_response{num_responses = NumPrompts,
-- data = Responses}, Ssh)}.
-+ case keyboard_interact_get_responses(IoCb, Opts, Name, Instr, PromptInfos) of
-+ not_ok ->
-+ not_ok;
-+ Responses ->
-+ {ok,
-+ ssh_transport:ssh_packet(
-+ #ssh_msg_userauth_info_response{num_responses = NumPrompts,
-+ data = Responses}, Ssh)}
-+ end.
-
-+%%%----------------------------------------------------------------
-+%%% keyboard-interactive server
- handle_userauth_info_response(#ssh_msg_userauth_info_response{num_responses = 1,
- data = <<?UINT32(Sz), Password:Sz/binary>>},
- #ssh{opts = Opts,
-@@ -369,11 +413,6 @@ method_preference(Algs) ->
- [{"publickey", ?MODULE, publickey_msg, [A]} | Acc]
- end,
- [{"password", ?MODULE, password_msg, []},
-- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
-- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
-- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
-- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
-- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []},
- {"keyboard-interactive", ?MODULE, keyboard_interactive_msg, []}
- ],
- Algs).
-@@ -473,6 +512,9 @@ keyboard_interact_get_responses(IoCb, Opts, Name, Instr, PromptInfos) ->
- proplists:get_value(password, Opts, undefined), IoCb, Name,
- Instr, PromptInfos, Opts, NumPrompts).
-
-+
-+keyboard_interact_get_responses(_, _, not_ok, _, _, _, _, _, _) ->
-+ not_ok;
- keyboard_interact_get_responses(_, undefined, Password, _, _, _, _, _,
- 1) when Password =/= undefined ->
- [Password]; %% Password auth implemented with keyboard-interaction and passwd is known
-@@ -486,17 +528,18 @@ keyboard_interact_get_responses(true, Fun, _Pwd, _IoCb, Name, Instr, PromptInfos
- keyboard_interact_fun(Fun, Name, Instr, PromptInfos, NumPrompts).
-
- keyboard_interact(IoCb, Name, Instr, Prompts, Opts) ->
-- if Name /= "" -> IoCb:format("~s~n", [Name]);
-- true -> ok
-- end,
-- if Instr /= "" -> IoCb:format("~s~n", [Instr]);
-- true -> ok
-- end,
-+ write_if_nonempty(IoCb, Name),
-+ write_if_nonempty(IoCb, Instr),
- lists:map(fun({Prompt, true}) -> IoCb:read_line(Prompt, Opts);
- ({Prompt, false}) -> IoCb:read_password(Prompt, Opts)
- end,
- Prompts).
-
-+write_if_nonempty(_, "") -> ok;
-+write_if_nonempty(_, <<>>) -> ok;
-+write_if_nonempty(IoCb, Text) -> IoCb:format("~s~n",[Text]).
-+
-+
- keyboard_interact_fun(KbdInteractFun, Name, Instr, PromptInfos, NumPrompts) ->
- Prompts = lists:map(fun({Prompt, _Echo}) -> Prompt end,
- PromptInfos),
---- a/lib/ssh/src/ssh_connection_handler.erl
-+++ b/lib/ssh/src/ssh_connection_handler.erl
-@@ -428,7 +428,12 @@ init_connection(server, C = #connection{}, Opts) ->
- init_ssh_record(Role, Socket, Opts) ->
- {ok, PeerAddr} = inet:peername(Socket),
- KeyCb = proplists:get_value(key_cb, Opts, ssh_file),
-- AuthMethods = proplists:get_value(auth_methods, Opts, ?SUPPORTED_AUTH_METHODS),
-+ AuthMethods = proplists:get_value(auth_methods,
-+ Opts,
-+ case Role of
-+ server -> ?SUPPORTED_AUTH_METHODS;
-+ client -> undefined
-+ end),
- S0 = #ssh{role = Role,
- key_cb = KeyCb,
- opts = Opts,
-@@ -794,9 +799,13 @@ handle_event(_, #ssh_msg_userauth_banner{message = Msg}, {userauth,client}, D) -
-
- handle_event(_, #ssh_msg_userauth_info_request{} = Msg, {userauth_keyboard_interactive, client},
- #data{ssh_params = Ssh0} = D) ->
-- {ok, {Reply, Ssh}} = ssh_auth:handle_userauth_info_request(Msg, Ssh0#ssh.io_cb, Ssh0),
-- send_bytes(Reply, D),
-- {next_state, {userauth_keyboard_interactive_info_response,client}, D#data{ssh_params = Ssh}};
-+ case ssh_auth:handle_userauth_info_request(Msg, Ssh0) of
-+ {ok, {Reply, Ssh}} ->
-+ send_bytes(Reply, D),
-+ {next_state, {userauth_keyboard_interactive_info_response,client}, D#data{ssh_params = Ssh}};
-+ not_ok ->
-+ {next_state, {userauth,client}, D, [{next_event, internal, Msg}]}
-+ end;
-
- handle_event(_, #ssh_msg_userauth_info_response{} = Msg, {userauth_keyboard_interactive, server}, D) ->
- case ssh_auth:handle_userauth_info_response(Msg, D#data.ssh_params) of
-@@ -819,7 +828,18 @@ handle_event(_, Msg = #ssh_msg_userauth_failure{}, {userauth_keyboard_interactiv
- D = D0#data{ssh_params = Ssh0#ssh{userauth_preference=Prefs}},
- {next_state, {userauth,client}, D, [{next_event, internal, Msg}]};
-
--handle_event(_, Msg=#ssh_msg_userauth_failure{}, {userauth_keyboard_interactive_info_response, client}, D) ->
-+handle_event(_, Msg=#ssh_msg_userauth_failure{}, {userauth_keyboard_interactive_info_response, client},
-+ #data{ssh_params = Ssh0} = D0) ->
-+ Opts = Ssh0#ssh.opts,
-+ D = case proplists:get_value(password, Opts) of
-+ undefined ->
-+ D0;
-+ _ ->
-+ D0#data{ssh_params =
-+ Ssh0#ssh{opts =
-+ lists:keyreplace(password,1,Opts,
-+ {password,not_ok})}} % FIXME:intermodule dependency
-+ end,
- {next_state, {userauth,client}, D, [{next_event, internal, Msg}]};
-
- handle_event(_, Msg=#ssh_msg_userauth_success{}, {userauth_keyboard_interactive_info_response, client}, D) ->
-@@ -1006,13 +1026,13 @@ handle_event({call,From}, get_print_info, StateName, D) ->
- {keep_state_and_data, [{reply,From,Reply}]};
-
- handle_event({call,From}, {connection_info, Options}, _, D) ->
-- Info = ssh_info(Options, D, []),
-+ Info = fold_keys(Options, fun conn_info/2, D),
- {keep_state_and_data, [{reply,From,Info}]};
-
- handle_event({call,From}, {channel_info,ChannelId,Options}, _, D) ->
- case ssh_channel:cache_lookup(cache(D), ChannelId) of
- #channel{} = Channel ->
-- Info = ssh_channel_info(Options, Channel, []),
-+ Info = fold_keys(Options, fun chann_info/2, Channel),
- {keep_state_and_data, [{reply,From,Info}]};
- undefined ->
- {keep_state_and_data, [{reply,From,[]}]}
-@@ -1206,8 +1226,9 @@ handle_event(internal, prepare_next_packet, _, D) ->
- Sz when Sz >= Enough ->
- self() ! {D#data.transport_protocol, D#data.socket, <<>>};
- _ ->
-- inet:setopts(D#data.socket, [{active, once}])
-+ ok
- end,
-+ inet:setopts(D#data.socket, [{active, once}]),
- keep_state_and_data;
-
- handle_event(info, {CloseTag,Socket}, StateName,
-@@ -1315,12 +1336,10 @@ terminate(shutdown, StateName, State0) ->
- State = send_msg(#ssh_msg_disconnect{code = ?SSH_DISCONNECT_BY_APPLICATION,
- description = "Application shutdown"},
- State0),
--timer:sleep(400), %% FIXME!!! gen_tcp:shutdown instead
- finalize_termination(StateName, State);
-
- %% terminate({shutdown,Msg}, StateName, State0) when is_record(Msg,ssh_msg_disconnect)->
- %% State = send_msg(Msg, State0),
--%% timer:sleep(400), %% FIXME!!! gen_tcp:shutdown instead
- %% finalize_termination(StateName, Msg, State);
-
- terminate({shutdown,_R}, StateName, State) ->
-@@ -1635,7 +1654,6 @@ new_channel_id(#data{connection_state = #connection{channel_id_seed = Id} =
- disconnect(Msg=#ssh_msg_disconnect{description=Description}, _StateName, State0) ->
- State = send_msg(Msg, State0),
- disconnect_fun(Description, State),
--timer:sleep(400),
- {stop, {shutdown,Description}, State}.
-
- %%%----------------------------------------------------------------
-@@ -1644,43 +1662,43 @@ counterpart_versions(NumVsn, StrVsn, #ssh{role = server} = Ssh) ->
- counterpart_versions(NumVsn, StrVsn, #ssh{role = client} = Ssh) ->
- Ssh#ssh{s_vsn = NumVsn , s_version = StrVsn}.
-
--ssh_info([], _State, Acc) ->
-- Acc;
--ssh_info([client_version | Rest], #data{ssh_params = #ssh{c_vsn = IntVsn,
-- c_version = StringVsn}} = State, Acc) ->
-- ssh_info(Rest, State, [{client_version, {IntVsn, StringVsn}} | Acc]);
--
--ssh_info([server_version | Rest], #data{ssh_params =#ssh{s_vsn = IntVsn,
-- s_version = StringVsn}} = State, Acc) ->
-- ssh_info(Rest, State, [{server_version, {IntVsn, StringVsn}} | Acc]);
--ssh_info([peer | Rest], #data{ssh_params = #ssh{peer = Peer}} = State, Acc) ->
-- ssh_info(Rest, State, [{peer, Peer} | Acc]);
--ssh_info([sockname | Rest], #data{socket = Socket} = State, Acc) ->
-- {ok, SockName} = inet:sockname(Socket),
-- ssh_info(Rest, State, [{sockname, SockName}|Acc]);
--ssh_info([user | Rest], #data{auth_user = User} = State, Acc) ->
-- ssh_info(Rest, State, [{user, User}|Acc]);
--ssh_info([ _ | Rest], State, Acc) ->
-- ssh_info(Rest, State, Acc).
--
--
--ssh_channel_info([], _, Acc) ->
-- Acc;
-+%%%----------------------------------------------------------------
-+conn_info(client_version, #data{ssh_params=S}) -> {S#ssh.c_vsn, S#ssh.c_version};
-+conn_info(server_version, #data{ssh_params=S}) -> {S#ssh.s_vsn, S#ssh.s_version};
-+conn_info(peer, #data{ssh_params=S}) -> S#ssh.peer;
-+conn_info(user, D) -> D#data.auth_user;
-+conn_info(sockname, D) -> {ok, SockName} = inet:sockname(D#data.socket),
-+ SockName;
-+%% dbg options ( = not documented):
-+conn_info(socket, D) -> D#data.socket;
-+conn_info(chan_ids, D) ->
-+ ssh_channel:cache_foldl(fun(#channel{local_id=Id}, Acc) ->
-+ [Id | Acc]
-+ end, [], cache(D)).
-
--ssh_channel_info([recv_window | Rest], #channel{recv_window_size = WinSize,
-- recv_packet_size = Packsize
-- } = Channel, Acc) ->
-- ssh_channel_info(Rest, Channel, [{recv_window, {{win_size, WinSize},
-- {packet_size, Packsize}}} | Acc]);
--ssh_channel_info([send_window | Rest], #channel{send_window_size = WinSize,
-- send_packet_size = Packsize
-- } = Channel, Acc) ->
-- ssh_channel_info(Rest, Channel, [{send_window, {{win_size, WinSize},
-- {packet_size, Packsize}}} | Acc]);
--ssh_channel_info([ _ | Rest], Channel, Acc) ->
-- ssh_channel_info(Rest, Channel, Acc).
-+%%%----------------------------------------------------------------
-+chann_info(recv_window, C) ->
-+ {{win_size, C#channel.recv_window_size},
-+ {packet_size, C#channel.recv_packet_size}};
-+chann_info(send_window, C) ->
-+ {{win_size, C#channel.send_window_size},
-+ {packet_size, C#channel.send_packet_size}};
-+%% dbg options ( = not documented):
-+chann_info(pid, C) ->
-+ C#channel.user.
-
-+%%%----------------------------------------------------------------
-+%% Assisting meta function for the *_info functions
-+fold_keys(Keys, Fun, Extra) ->
-+ lists:foldr(fun(Key, Acc) ->
-+ try Fun(Key, Extra) of
-+ Value -> [{Key,Value}|Acc]
-+ catch
-+ _:_ -> Acc
-+ end
-+ end, [], Keys).
-
-+%%%----------------------------------------------------------------
- log_error(Reason) ->
- Report = io_lib:format("Erlang ssh connection handler failed with reason:~n"
- " ~p~n"
-@@ -1689,7 +1707,6 @@ log_error(Reason) ->
- [Reason, erlang:get_stacktrace()]),
- error_logger:error_report(Report).
-
--
- %%%----------------------------------------------------------------
- not_connected_filter({connection_reply, _Data}) -> true;
- not_connected_filter(_) -> false.
---- a/lib/ssh/src/ssh_dbg.erl
-+++ b/lib/ssh/src/ssh_dbg.erl
-@@ -24,6 +24,7 @@
-
- -export([messages/0,
- messages/1,
-+ messages/2,
- stop/0
- ]).
-
-@@ -36,12 +37,16 @@
- writer,
- acc = []}).
- %%%================================================================
--messages() -> messages(fun(String,_D) -> io:format(String) end).
--%% messages() -> messages(fun(String,Acc) -> [String|Acc] end)
-+messages() ->
-+ messages(fun(String,_D) -> io:format(String) end).
-
- messages(Write) when is_function(Write,2) ->
-+ messages(Write, fun(X) -> X end).
-+
-+messages(Write, MangleArg) when is_function(Write,2),
-+ is_function(MangleArg,1) ->
- catch dbg:start(),
-- setup_tracer(Write),
-+ setup_tracer(Write, MangleArg),
- dbg:p(new,c),
- dbg_ssh_messages().
-
-@@ -63,18 +68,30 @@ msg_formater({trace,_Pid,return_from,{ssh_message,encode,1},_Res}, D) ->
- msg_formater({trace,_Pid,call,{ssh_message,decode,_}}, D) ->
- D;
- msg_formater({trace,Pid,return_from,{ssh_message,decode,1},Msg}, D) ->
-- fmt("~nRECV ~p ~s~n", [Pid,wr_record(shrink_bin(Msg))], D);
-+ fmt("~n~p RECV ~s~n", [Pid,wr_record(shrink_bin(Msg))], D);
-
- msg_formater({trace,_Pid,call,{ssh_transport,select_algorithm,_}}, D) ->
- D;
- msg_formater({trace,Pid,return_from,{ssh_transport,select_algorithm,3},{ok,Alg}}, D) ->
-- fmt("~nALGORITHMS ~p~n~s~n", [Pid, wr_record(Alg)], D);
-+ fmt("~n~p ALGORITHMS~n~s~n", [Pid, wr_record(Alg)], D);
-+
-+
-+msg_formater({trace,Pid,send,{tcp,Sock,Bytes},Pid}, D) ->
-+ fmt("~n~p TCP SEND on ~p~n ~p~n", [Pid,Sock, shrink_bin(Bytes)], D);
-+
-+msg_formater({trace,Pid,send,{tcp,Sock,Bytes},Dest}, D) ->
-+ fmt("~n~p TCP SEND from ~p TO ~p~n ~p~n", [Pid,Sock,Dest, shrink_bin(Bytes)], D);
-
- msg_formater({trace,Pid,send,ErlangMsg,Dest}, D) ->
-- fmt("~nERL MSG ~p SEND TO ~p~n ~p~n", [Pid,Dest, shrink_bin(ErlangMsg)], D);
-+ fmt("~n~p ERL MSG SEND TO ~p~n ~p~n", [Pid,Dest, shrink_bin(ErlangMsg)], D);
-+
-+
-+msg_formater({trace,Pid,'receive',{tcp,Sock,Bytes}}, D) ->
-+ fmt("~n~p TCP RECEIVE on ~p~n ~p~n", [Pid,Sock,shrink_bin(Bytes)], D);
-
- msg_formater({trace,Pid,'receive',ErlangMsg}, D) ->
-- fmt("~nERL MSG ~p RECIEVE~n ~p~n", [Pid,shrink_bin(ErlangMsg)], D);
-+ fmt("~n~p ERL MSG RECEIVE~n ~p~n", [Pid,shrink_bin(ErlangMsg)], D);
-+
-
- msg_formater(M, D) ->
- fmt("~nDBG ~n~p~n", [shrink_bin(M)], D).
-@@ -87,8 +104,10 @@ fmt(Fmt, Args, D=#data{writer=Write,acc=Acc}) ->
- D#data{acc = Write(io_lib:format(Fmt, Args), Acc)}.
-
- %%%----------------------------------------------------------------
--setup_tracer(Write) ->
-- Handler = fun msg_formater/2,
-+setup_tracer(Write, MangleArg) ->
-+ Handler = fun(Arg, D) ->
-+ msg_formater(MangleArg(Arg), D)
-+ end,
- InitialData = #data{writer = Write},
- {ok,_} = dbg:tracer(process, {Handler, InitialData}),
- ok.
---- a/lib/ssh/src/ssh_io.erl
-+++ b/lib/ssh/src/ssh_io.erl
-@@ -31,56 +31,55 @@ read_line(Prompt, Ssh) ->
- format("~s", [listify(Prompt)]),
- proplists:get_value(user_pid, Ssh) ! {self(), question},
- receive
-- Answer ->
-+ Answer when is_list(Answer) ->
- Answer
- end.
-
- yes_no(Prompt, Ssh) ->
-- io:format("~s [y/n]?", [Prompt]),
-+ format("~s [y/n]?", [Prompt]),
- proplists:get_value(user_pid, Ssh#ssh.opts) ! {self(), question},
- receive
-- Answer ->
-+ %% I can't see that the atoms y and n are ever received, but it must
-+ %% be investigated before removing
-+ y -> yes;
-+ n -> no;
-+
-+ Answer when is_list(Answer) ->
- case trim(Answer) of
- "y" -> yes;
- "n" -> no;
- "Y" -> yes;
- "N" -> no;
-- y -> yes;
-- n -> no;
- _ ->
-- io:format("please answer y or n\n"),
-+ format("please answer y or n\n",[]),
- yes_no(Prompt, Ssh)
- end
- end.
-
-
--read_password(Prompt, Ssh) ->
-+read_password(Prompt, #ssh{opts=Opts}) -> read_password(Prompt, Opts);
-+read_password(Prompt, Opts) when is_list(Opts) ->
- format("~s", [listify(Prompt)]),
-- case is_list(Ssh) of
-- false ->
-- proplists:get_value(user_pid, Ssh#ssh.opts) ! {self(), user_password};
-- _ ->
-- proplists:get_value(user_pid, Ssh) ! {self(), user_password}
-- end,
-+ proplists:get_value(user_pid, Opts) ! {self(), user_password},
- receive
-- Answer ->
-- case Answer of
-- "" ->
-- read_password(Prompt, Ssh);
-- Pass -> Pass
-- end
-+ Answer when is_list(Answer) ->
-+ case trim(Answer) of
-+ "" ->
-+ read_password(Prompt, Opts);
-+ Pwd ->
-+ Pwd
-+ end
- end.
-
--listify(A) when is_atom(A) ->
-- atom_to_list(A);
--listify(L) when is_list(L) ->
-- L;
--listify(B) when is_binary(B) ->
-- binary_to_list(B).
-
- format(Fmt, Args) ->
- io:format(Fmt, Args).
-
-+%%%================================================================
-+listify(A) when is_atom(A) -> atom_to_list(A);
-+listify(L) when is_list(L) -> L;
-+listify(B) when is_binary(B) -> binary_to_list(B).
-+
-
- trim(Line) when is_list(Line) ->
- lists:reverse(trim1(lists:reverse(trim1(Line))));
-@@ -93,6 +92,3 @@ trim1([$\r|Cs]) -> trim(Cs);
- trim1([$\n|Cs]) -> trim(Cs);
- trim1([$\t|Cs]) -> trim(Cs);
- trim1(Cs) -> Cs.
--
--
--
---- a/lib/ssh/test/ssh_basic_SUITE.erl
-+++ b/lib/ssh/test/ssh_basic_SUITE.erl
-@@ -50,7 +50,12 @@
- inet6_option/1,
- inet_option/1,
- internal_error/1,
-- known_hosts/1,
-+ known_hosts/1,
-+ login_bad_pwd_no_retry1/1,
-+ login_bad_pwd_no_retry2/1,
-+ login_bad_pwd_no_retry3/1,
-+ login_bad_pwd_no_retry4/1,
-+ login_bad_pwd_no_retry5/1,
- misc_ssh_options/1,
- openssh_zlib_basic_test/1,
- packet_size_zero/1,
-@@ -100,7 +105,8 @@ all() ->
- daemon_opt_fd,
- multi_daemon_opt_fd,
- packet_size_zero,
-- ssh_info_print
-+ ssh_info_print,
-+ {group, login_bad_pwd_no_retry}
- ].
-
- groups() ->
-@@ -116,7 +122,13 @@ groups() ->
- {dsa_pass_key, [], [pass_phrase]},
- {rsa_pass_key, [], [pass_phrase]},
- {key_cb, [], [key_callback, key_callback_options]},
-- {internal_error, [], [internal_error]}
-+ {internal_error, [], [internal_error]},
-+ {login_bad_pwd_no_retry, [], [login_bad_pwd_no_retry1,
-+ login_bad_pwd_no_retry2,
-+ login_bad_pwd_no_retry3,
-+ login_bad_pwd_no_retry4,
-+ login_bad_pwd_no_retry5
-+ ]}
- ].
-
-
-@@ -1090,6 +1102,72 @@ ssh_info_print(Config) ->
-
-
- %%--------------------------------------------------------------------
-+%% Check that a basd pwd is not tried more times. Could cause lock-out
-+%% on server
-+
-+login_bad_pwd_no_retry1(Config) ->
-+ login_bad_pwd_no_retry(Config, "keyboard-interactive,password").
-+
-+login_bad_pwd_no_retry2(Config) ->
-+ login_bad_pwd_no_retry(Config, "password,keyboard-interactive").
-+
-+login_bad_pwd_no_retry3(Config) ->
-+ login_bad_pwd_no_retry(Config, "password,publickey,keyboard-interactive").
-+
-+login_bad_pwd_no_retry4(Config) ->
-+ login_bad_pwd_no_retry(Config, "password,other,keyboard-interactive").
-+
-+login_bad_pwd_no_retry5(Config) ->
-+ login_bad_pwd_no_retry(Config, "password,other,keyboard-interactive,password,password").
-+
-+
-+
-+
-+
-+login_bad_pwd_no_retry(Config, AuthMethods) ->
-+ PrivDir = proplists:get_value(priv_dir, 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),
-+
-+ Parent = self(),
-+ PwdFun = fun(_, _, _, undefined) -> {false, 1};
-+ (_, _, _, _) -> Parent ! retry_bad_pwd,
-+ false
-+ end,
-+
-+ {DaemonRef, _Host, Port} =
-+ ssh_test_lib:daemon([{system_dir, SysDir},
-+ {user_dir, UserDir},
-+ {auth_methods, AuthMethods},
-+ {user_passwords, [{"foo","somepwd"}]},
-+ {pwdfun, PwdFun}
-+ ]),
-+
-+ ConnRes = ssh:connect("localhost", Port,
-+ [{silently_accept_hosts, true},
-+ {user, "foo"},
-+ {password, "badpwd"},
-+ {user_dir, UserDir},
-+ {user_interaction, false}]),
-+
-+ receive
-+ retry_bad_pwd ->
-+ ssh:stop_daemon(DaemonRef),
-+ {fail, "Retry bad password"}
-+ after 0 ->
-+ case ConnRes of
-+ {error,"Unable to connect using the available authentication methods"} ->
-+ ssh:stop_daemon(DaemonRef),
-+ ok;
-+ {ok,Conn} ->
-+ ssh:close(Conn),
-+ ssh:stop_daemon(DaemonRef),
-+ {fail, "Connect erroneosly succeded"}
-+ end
-+ end.
-+
-+%%--------------------------------------------------------------------
- %% Internal functions ------------------------------------------------
- %%--------------------------------------------------------------------
- %% Due to timing the error message may or may not be delivered to
---- a/lib/ssh/vsn.mk
-+++ b/lib/ssh/vsn.mk
-@@ -1,5 +1,5 @@
- #-*-makefile-*- ; force emacs to enter makefile-mode
-
--SSH_VSN = 4.3
-+SSH_VSN = 4.3.1
-
- APP_VSN = "ssh-$(SSH_VSN)"
---- a/lib/tools/doc/src/notes.xml
-+++ b/lib/tools/doc/src/notes.xml
-@@ -31,6 +31,21 @@
- </header>
- <p>This document describes the changes made to the Tools application.</p>
-
-+<section><title>Tools 2.8.5</title>
-+
-+ <section><title>Fixed Bugs and Malfunctions</title>
-+ <list>
-+ <item>
-+ <p>Correct a bug when adding multiple modules to an Xref
-+ server. The bug was introduced in OTP-19.0. </p>
-+ <p>
-+ Own Id: OTP-13708 Aux Id: ERL-173 </p>
-+ </item>
-+ </list>
-+ </section>
-+
-+</section>
-+
- <section><title>Tools 2.8.4</title>
-
- <section><title>Fixed Bugs and Malfunctions</title>
---- a/lib/tools/src/xref_base.erl
-+++ b/lib/tools/src/xref_base.erl
-@@ -746,7 +746,7 @@ read_a_module({Dir, BaseName}, AppName, Builtins, Verbose, Warnings, Mode) ->
- message(Warnings, no_debug_info, [File]),
- no;
- {ok, M, Data, UnresCalls0} ->
-- message(Verbose, done, [File]),
-+ message(Verbose, done_file, [File]),
- %% Remove duplicates. Identical unresolved calls on the
- %% same line are counted as _one_ unresolved call.
- UnresCalls = usort(UnresCalls0),
-@@ -1842,6 +1842,8 @@ message(true, What, Arg) ->
- set_up ->
- io:format("Setting up...", Arg);
- done ->
-+ io:format("done~n", Arg);
-+ done_file ->
- io:format("done reading ~ts~n", Arg);
- error ->
- io:format("error~n", Arg);
---- a/lib/tools/test/xref_SUITE.erl
-+++ b/lib/tools/test/xref_SUITE.erl
-@@ -50,7 +50,7 @@
-
- -export([analyze/1, basic/1, md/1, q/1, variables/1, unused_locals/1]).
-
---export([format_error/1, otp_7423/1, otp_7831/1, otp_10192/1]).
-+-export([format_error/1, otp_7423/1, otp_7831/1, otp_10192/1, otp_13708/1]).
-
- -import(lists, [append/2, flatten/1, keysearch/3, member/2, sort/1, usort/1]).
-
-@@ -82,7 +82,7 @@ groups() ->
- fun_mfa_r14, fun_mfa_vars, qlc]},
- {analyses, [],
- [analyze, basic, md, q, variables, unused_locals]},
-- {misc, [], [format_error, otp_7423, otp_7831, otp_10192]}].
-+ {misc, [], [format_error, otp_7423, otp_7831, otp_10192, otp_13708]}].
-
-
- init_per_suite(Conf) when is_list(Conf) ->
-@@ -2393,6 +2393,19 @@ otp_10192(Conf) when is_list(Conf) ->
- xref:stop(s),
- ok.
-
-+%% OTP-10192. Allow filenames with character codes greater than 126.
-+otp_13708(Conf) when is_list(Conf) ->
-+ {ok, _} = start(s),
-+ ok = xref:set_default(s, [{verbose, true}]),
-+ {ok, []} = xref:q(s,"E"),
-+ xref:stop(s),
-+
-+ CopyDir = ?copydir,
-+ Dir = fname(CopyDir,"lib_test"),
-+ {ok, _} = start(s),
-+ ok = xref:set_library_path(s, [Dir], [{verbose, true}]),
-+ xref:stop(s).
-+
- %%%
- %%% Utilities
- %%%
---- a/lib/tools/vsn.mk
-+++ b/lib/tools/vsn.mk
-@@ -1 +1 @@
--TOOLS_VSN = 2.8.4
-+TOOLS_VSN = 2.8.5
---- a/otp_versions.table
-+++ b/otp_versions.table
-@@ -1,3 +1,4 @@
-+OTP-19.0.1 : dialyzer-3.0.1 erts-8.0.1 inets-6.3.1 observer-2.2.1 ssh-4.3.1 tools-2.8.5 # asn1-4.0.3 common_test-1.12.2 compiler-7.0 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7 debugger-4.2 diameter-1.12 edoc-0.7.19 eldap-1.2.2 erl_docgen-0.5 erl_interface-3.9 et-1.6 eunit-2.3 gs-1.6.1 hipe-3.15.1 ic-4.4.1 jinterface-1.7 kernel-5.0 megaco-3.18.1 mnesia-4.14 odbc-2.11.2 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.2 percept-0.9 public_key-1.2 reltool-0.7.1 runtime_tools-1.10 sasl-3.0 snmp-5.2.3 ssl-8.0 stdlib-3.0 syntax_tools-2.0 typer-0.9.11 wx-1.7 xmerl-1.3.11 :
- OTP-19.0 : asn1-4.0.3 common_test-1.12.2 compiler-7.0 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7 debugger-4.2 dialyzer-3.0 diameter-1.12 edoc-0.7.19 eldap-1.2.2 erl_docgen-0.5 erl_interface-3.9 erts-8.0 et-1.6 eunit-2.3 gs-1.6.1 hipe-3.15.1 ic-4.4.1 inets-6.3 jinterface-1.7 kernel-5.0 megaco-3.18.1 mnesia-4.14 observer-2.2 odbc-2.11.2 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.2 percept-0.9 public_key-1.2 reltool-0.7.1 runtime_tools-1.10 sasl-3.0 snmp-5.2.3 ssh-4.3 ssl-8.0 stdlib-3.0 syntax_tools-2.0 tools-2.8.4 typer-0.9.11 wx-1.7 xmerl-1.3.11 # :
- OTP-18.3.4 : inets-6.2.4 ssl-7.3.3 # asn1-4.0.2 common_test-1.12.1 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 :
- OTP-18.3.3 : common_test-1.12.1 inets-6.2.3 ssl-7.3.2 # asn1-4.0.2 compiler-6.0.3 cosEvent-2.2 cosEventDomain-1.2 cosFileTransfer-1.2 cosNotification-1.2.1 cosProperty-1.2 cosTime-1.2.1 cosTransactions-1.3.1 crypto-3.6.3 debugger-4.1.2 dialyzer-2.9 diameter-1.11.2 edoc-0.7.18 eldap-1.2.1 erl_docgen-0.4.2 erl_interface-3.8.2 erts-7.3.1 et-1.5.1 eunit-2.2.13 gs-1.6 hipe-3.15 ic-4.4 jinterface-1.6.1 kernel-4.2 megaco-3.18 mnesia-4.13.4 observer-2.1.2 odbc-2.11.1 orber-3.8.1 os_mon-2.4 ose-1.1 otp_mibs-1.1 parsetools-2.1.1 percept-0.8.11 public_key-1.1.1 reltool-0.7 runtime_tools-1.9.3 sasl-2.7 snmp-5.2.2 ssh-4.2.2 stdlib-2.8 syntax_tools-1.7 test_server-3.10 tools-2.8.3 typer-0.9.10 webtool-0.9.1 wx-1.6.1 xmerl-1.3.10 :
diff --git a/community/erlang/APKBUILD b/community/erlang/APKBUILD
index 06703cf21..2a478087f 100644
--- a/community/erlang/APKBUILD
+++ b/community/erlang/APKBUILD
@@ -2,16 +2,15 @@
# Maintainer: Marlus Saraiva <marlus.saraiva@gmail.com>
pkgname=erlang
-pkgver=19.0.2
-_srcver=19.0
-pkgrel=1
+pkgver=19.1.0
+_srcver=19.1
+pkgrel=0
pkgdesc="General-purpose programming language and runtime environment"
url="http://www.erlang.org/"
license="ASL 2.0"
arch="all"
depends="$pkgname-kernel $pkgname-stdlib $pkgname-compiler"
makedepends="perl-dev zlib-dev ncurses-dev libressl-dev openjdk7 unixodbc-dev"
-install=""
subpackages="$pkgname-dev
$pkgname-asn1:asn
$pkgname-common-test:common_test
@@ -63,24 +62,19 @@ subpackages="$pkgname-dev
$pkgname-xmerl:xmerl"
source="http://www.erlang.org/download/otp_src_$_srcver.tar.gz
0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch
- 0010-fix-nteventlog-remove.patch
- 0015-otp-update-version-19.0.1.patch"
+ 0010-fix-nteventlog-remove.patch"
-_builddir="$srcdir"/otp_src_$_srcver
+builddir="$srcdir/otp_src_$_srcver"
prepare() {
- local i
- cd "$_builddir"
+ default_prepare || return 1
+
+ cd "$builddir"
rm lib/os_mon/ebin/*
- for i in $source; do
- case $i in
- *.patch) msg $i; patch -p1 -i "$srcdir"/$i || return 1;;
- esac
- done
}
build() {
- cd "$_builddir"
+ cd "$builddir"
export CPPFLAGS="-D_BSD_SOURCE $CPPFLAGS"
export PATH="/usr/lib/jvm/java-1.7-openjdk/bin:$PATH"
./configure --prefix=/usr \
@@ -98,7 +92,7 @@ build() {
}
package() {
- cd "$_builddir"
+ cd "$builddir"
make -j1 DESTDIR="$pkgdir" install || return 1
rm -rf "$pkgdir"/usr/lib/erlang/lib/wx-*
}
@@ -196,15 +190,12 @@ dev() {
}
-md5sums="f64eefc697d47193444aa224d971f367 otp_src_19.0.tar.gz
+md5sums="19dfbc2042e6dd40bf281e7ca2d49d43 otp_src_19.1.tar.gz
f4aa0cc27dc57ea4dcd57191b1948a4d 0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch
-0dd300003ff68fc46dc3c839c2541d53 0010-fix-nteventlog-remove.patch
-d706bb0d2b3fbd937c6a0e3e54a15dee 0015-otp-update-version-19.0.1.patch"
-sha256sums="3fdc27a2a826e7f3d9cda43302d27d98704d6b41ce29a8a5df747a161da53bb1 otp_src_19.0.tar.gz
+0dd300003ff68fc46dc3c839c2541d53 0010-fix-nteventlog-remove.patch"
+sha256sums="fed4cbbc1ee5cc8efc2b8f14c3db97bfde1de967703f5f9a95f8ab6852737e23 otp_src_19.1.tar.gz
71c8a55fe036d5a04ba2c008b51d8950c3f18d83edaffb9bef2a9d19dd2f79f3 0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch
-019c62ea3fee60068caa8c3152d7f96e76591fc5dc096abfcea48ec1593eb758 0010-fix-nteventlog-remove.patch
-5d523de091a5eff46b4ab7000b09d3668f9e3949b8b04c7d7c1b36936e6cda95 0015-otp-update-version-19.0.1.patch"
-sha512sums="fdab82883f7be04cca91041819d15e0b065bdd049b134d056fe4ea12657f1c6f77aeebd778c09b4064e6d974734fe087592739181e14fe60597dbe37f492684f otp_src_19.0.tar.gz
+019c62ea3fee60068caa8c3152d7f96e76591fc5dc096abfcea48ec1593eb758 0010-fix-nteventlog-remove.patch"
+sha512sums="bd1c243393c867c91768367613aedb40d56889add149390c81f22e022e76b716d6e9a4d5db7e6477ceb1216c26c18c962abdfd8215a87420758f5ef2063b9714 otp_src_19.1.tar.gz
923addcb1f6472829ba13ccc91ad3cef161f269478404f0a19bc4997118e06edd7459011a60769eb393eac930f30d4bd6c5526301382a5f9815862237f4664d3 0005-Do-not-install-nteventlog-and-related-doc-files-on-n.patch
-b7387f92f8c27a0565c7885bba4b357183c62d422616e073bc5ffad338a0e22cb5165dcb3b95bf0b920ba00831599f2216027883f4be255aa6f6150b68b7a37c 0010-fix-nteventlog-remove.patch
-bbacccc2a4b85ab4c1a6a24db70b8e4ae6ddd5f2b8b3c6c3ce1c767ff2881bb35a7f6adac973ecb4469149f658ab924825ec295efe8f41fb00229db526cb4ac3 0015-otp-update-version-19.0.1.patch"
+b7387f92f8c27a0565c7885bba4b357183c62d422616e073bc5ffad338a0e22cb5165dcb3b95bf0b920ba00831599f2216027883f4be255aa6f6150b68b7a37c 0010-fix-nteventlog-remove.patch"