diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index cdb769717..95260fb37 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1232,7 +1232,7 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> case ejabberd_hooks:run_fold( feature_check_packet, StateData#state.server, allow, - [StateData#state.user, + [StateData#state.jid, StateData#state.server, StateData#state.pres_last, {From, To, Packet}, @@ -1340,7 +1340,8 @@ terminate(_Reason, StateName, StateData) -> presence_broadcast( StateData, From, StateData#state.pres_i, Packet) end - end; + end, + bounce_messages(); _ -> ok end, @@ -2111,3 +2112,12 @@ fsm_limit_opts(Opts) -> [] end end. + +bounce_messages() -> + receive + {route, From, To, El} -> + ejabberd_router:route(From, To, El), + bounce_messages() + after 0 -> + ok + end. diff --git a/src/treap.erl b/src/treap.erl index 61cfe7017..a5ed9b93b 100644 --- a/src/treap.erl +++ b/src/treap.erl @@ -33,7 +33,9 @@ get_root/1, lookup/2, is_empty/1, - fold/3]). + fold/3, + from_list/1, + to_list/1]). empty() -> nil. @@ -173,3 +175,20 @@ fold(F, Acc, {{_Hash, Key}, Priority, Value, Left, Right}) -> Acc1 = F({Key, Priority, Value}, Acc), Acc2 = fold(F, Acc1, Left), fold(F, Acc2, Right). + +to_list(Tree) -> + to_list(Tree, []). + +to_list(nil, Acc) -> + Acc; +to_list(Tree, Acc) -> + Root = get_root(Tree), + to_list(delete_root(Tree), [Root|Acc]). + +from_list(List) -> + from_list(List, nil). + +from_list([{Key, Priority, Value}|Tail], Tree) -> + from_list(Tail, insert(Key, Priority, Value, Tree)); +from_list([], Tree) -> + Tree.