diff --git a/.gitignore b/.gitignore index 0b52e71ff..60f1a2614 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ /doc/version.tex /src/*.beam /src/*.so +/src/*.so.dSYM /src/*/*.beam /src/*/Makefile /src/Makefile diff --git a/doc/dev.html b/doc/dev.html index 6709b6a12..b7fea526a 100644 --- a/doc/dev.html +++ b/doc/dev.html @@ -2,7 +2,7 @@ "http://www.w3.org/TR/REC-html40/loose.dtd"> -Ejabberd 2.1.6 Developers Guide +<TITLE>Ejabberd 2.1.x Developers Guide @@ -49,7 +49,7 @@ TD P{margin:0px;}

-

Ejabberd 2.1.6 Developers Guide

Alexey Shchepin
+

Ejabberd 2.1.x Developers Guide

Alexey Shchepin
mailto:alexey@sevcom.net
xmpp:aleksey@jabber.ru

diff --git a/doc/features.html b/doc/features.html index 8ed0bd76c..503ac0d3f 100644 --- a/doc/features.html +++ b/doc/features.html @@ -2,7 +2,7 @@ "http://www.w3.org/TR/REC-html40/loose.dtd"> -Ejabberd 2.1.6 Feature Sheet +<TITLE>Ejabberd 2.1.x Feature Sheet @@ -50,7 +50,7 @@ SPAN{width:20%; float:right; text-align:left; margin-left:auto;}

-

Ejabberd 2.1.6 Feature Sheet

Sander Devrieze
+

Ejabberd 2.1.x Feature Sheet

Sander Devrieze
mailto:s.devrieze@pandora.be
xmpp:sander@devrieze.dyndns.org

diff --git a/doc/guide.html b/doc/guide.html index b1b30a6d6..8835f90ba 100644 --- a/doc/guide.html +++ b/doc/guide.html @@ -6,7 +6,7 @@ - ejabberd 2.1.6 + ejabberd 2.1.x Installation and Operation Guide @@ -76,7 +76,7 @@ BLOCKQUOTE.figure DIV.center DIV.center HR{display:none;}


- +
ejabberd 2.1.6
ejabberd 2.1.x
 
Installation and Operation Guide

diff --git a/doc/version.tex b/doc/version.tex index 10a0da534..905ac86f2 100644 --- a/doc/version.tex +++ b/doc/version.tex @@ -1,2 +1,2 @@ % ejabberd version (automatically generated). -\newcommand{\version}{2.1.6} +\newcommand{\version}{2.1.x} diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index d3b1e1815..600f6fa20 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1833,37 +1833,33 @@ presence_update(From, Packet, StateData) -> StateData#state.pres_invis, ?DEBUG("from unavail = ~p~n", [FromUnavail]), NewState = + NewStateData = StateData#state{pres_last = Packet, + pres_invis = false, + pres_timestamp = Timestamp}, if FromUnavail -> ejabberd_hooks:run(user_available_hook, - StateData#state.server, - [StateData#state.jid]), + NewStateData#state.server, + [NewStateData#state.jid]), if NewPriority >= 0 -> - resend_offline_messages(StateData), - resend_subscription_requests(StateData); + resend_offline_messages(NewStateData), + resend_subscription_requests(NewStateData); true -> ok end, - presence_broadcast_first( - From, StateData#state{pres_last = Packet, - pres_invis = false, - pres_timestamp = Timestamp - }, Packet); + presence_broadcast_first(From, NewStateData, Packet); true -> - presence_broadcast_to_trusted(StateData, + presence_broadcast_to_trusted(NewStateData, From, - StateData#state.pres_f, - StateData#state.pres_a, + NewStateData#state.pres_f, + NewStateData#state.pres_a, Packet), if OldPriority < 0, NewPriority >= 0 -> - resend_offline_messages(StateData); + resend_offline_messages(NewStateData); true -> ok end, - StateData#state{pres_last = Packet, - pres_invis = false, - pres_timestamp = Timestamp - } + NewStateData end, NewState end. diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index e64b2038e..356d3390d 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -254,7 +254,7 @@ open_socket(init, StateData) -> wait_before_reconnect(StateData) end end; -open_socket(stop, StateData) -> +open_socket(closed, StateData) -> ?INFO_MSG("s2s connection: ~s -> ~s (stopped in open socket)", [StateData#state.myname, StateData#state.server]), {stop, normal, StateData}; diff --git a/src/jlib.erl b/src/jlib.erl index cb70c5a4a..1d5648a2b 100644 --- a/src/jlib.erl +++ b/src/jlib.erl @@ -803,4 +803,6 @@ ip_to_list({_,_,_,_,_,_,_,_} = Ipv6Address) -> inet_parse:ntoa(Ipv6Address); %% This function clause could use inet_parse too: ip_to_list({A,B,C,D}) -> - lists:flatten(io_lib:format("~w.~w.~w.~w",[A,B,C,D])). + lists:flatten(io_lib:format("~w.~w.~w.~w",[A,B,C,D])); +ip_to_list(IP) -> + lists:flatten(io_lib:format("~w", [IP])). diff --git a/src/pg2_backport.erl b/src/pg2_backport.erl index 9c9f5d6bc..f706e66a9 100644 --- a/src/pg2_backport.erl +++ b/src/pg2_backport.erl @@ -30,18 +30,12 @@ %%% Exported functions %%% --spec start_link() -> {'ok', pid()} | {'error', term()}. - start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). --spec start() -> {'ok', pid()} | {'error', term()}. - start() -> ensure_started(). --spec create(term()) -> 'ok'. - create(Name) -> ensure_started(), case ets:member(pg2_table, {group, Name}) of @@ -55,10 +49,6 @@ create(Name) -> ok end. --type name() :: term(). - --spec delete(name()) -> 'ok'. - delete(Name) -> ensure_started(), global:trans({{?MODULE, Name}, self()}, @@ -67,8 +57,6 @@ delete(Name) -> end), ok. --spec join(name(), pid()) -> 'ok' | {'error', {'no_such_group', term()}}. - join(Name, Pid) when is_pid(Pid) -> ensure_started(), case ets:member(pg2_table, {group, Name}) of @@ -83,8 +71,6 @@ join(Name, Pid) when is_pid(Pid) -> ok end. --spec leave(name(), pid()) -> 'ok' | {'error', {'no_such_group', name()}}. - leave(Name, Pid) when is_pid(Pid) -> ensure_started(), case ets:member(pg2_table, {group, Name}) of @@ -99,10 +85,6 @@ leave(Name, Pid) when is_pid(Pid) -> ok end. --type get_members_ret() :: [pid()] | {'error', {'no_such_group', name()}}. - --spec get_members(name()) -> get_members_ret(). - get_members(Name) -> ensure_started(), case ets:member(pg2_table, {group, Name}) of @@ -112,8 +94,6 @@ get_members(Name) -> {error, {no_such_group, Name}} end. --spec get_local_members(name()) -> get_members_ret(). - get_local_members(Name) -> ensure_started(), case ets:member(pg2_table, {group, Name}) of @@ -123,16 +103,10 @@ get_local_members(Name) -> {error, {no_such_group, Name}} end. --spec which_groups() -> [name()]. - which_groups() -> ensure_started(), all_groups(). --type gcp_error_reason() :: {'no_process', term()} | {'no_such_group', term()}. - --spec get_closest_pid(term()) -> pid() | {'error', gcp_error_reason()}. - get_closest_pid(Name) -> case get_local_members(Name) of [Pid] -> @@ -157,8 +131,6 @@ get_closest_pid(Name) -> -record(state, {}). --spec init([]) -> {'ok', #state{}}. - init([]) -> Ns = nodes(), net_kernel:monitor_nodes(true), @@ -169,14 +141,6 @@ init([]) -> pg2_table = ets:new(pg2_table, [ordered_set, protected, named_table]), {ok, #state{}}. --type call() :: {'create', name()} - | {'delete', name()} - | {'join', name(), pid()} - | {'leave', name(), pid()}. - --spec handle_call(call(), _, #state{}) -> - {'reply', 'ok', #state{}}. - handle_call({create, Name}, _From, S) -> assure_group(Name), {reply, ok, S}; @@ -195,12 +159,6 @@ handle_call(Request, From, S) -> [Request, From]), {noreply, S}. --type all_members() :: [[name(),...]]. --type cast() :: {'exchange', node(), all_members()} - | {'del_member', name(), pid()}. - --spec handle_cast(cast(), #state{}) -> {'noreply', #state{}}. - handle_cast({exchange, _Node, List}, S) -> store(List), {noreply, S}; @@ -208,8 +166,6 @@ handle_cast(_, S) -> %% Ignore {del_member, Name, Pid}. {noreply, S}. --spec handle_info(tuple(), #state{}) -> {'noreply', #state{}}. - handle_info({'DOWN', MonitorRef, process, _Pid, _Info}, S) -> member_died(MonitorRef), {noreply, S}; @@ -222,8 +178,6 @@ handle_info({new_pg2, Node}, S) -> handle_info(_, S) -> {noreply, S}. --spec terminate(term(), #state{}) -> 'ok'. - terminate(_Reason, _S) -> true = ets:delete(pg2_table), ok. @@ -289,8 +243,9 @@ join_group(Name, Pid) -> try _ = ets:update_counter(pg2_table, Member_Name_Pid, {2, +1}) catch _:_ -> true = ets:insert(pg2_table, {Member_Name_Pid, 1}), - _ = [ets:insert(pg2_table, {{local_member, Name, Pid}}) || - node(Pid) =:= node()], + _ = [ets:insert(pg2_table, {{local_member, Name, PidX}}) || + PidX <- [Pid], + node(PidX) =:= node()], true = ets:insert(pg2_table, {{pid, Pid, Name}}) end. @@ -301,8 +256,9 @@ leave_group(Name, Pid) -> if N =:= 0 -> true = ets:delete(pg2_table, {pid, Pid, Name}), - _ = [ets:delete(pg2_table, {local_member, Name, Pid}) || - node(Pid) =:= node()], + _ = [ets:delete(pg2_table, {local_member, Name, PidX}) || + PidX <- [Pid], + node(PidX) =:= node()], true = ets:delete(pg2_table, Member_Name_Pid); true -> ok