diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | src/ejabberd_router.erl | 73 |
2 files changed, 44 insertions, 33 deletions
@@ -1,3 +1,7 @@ +2005-07-27 Alexey Shchepin <alexey@sevcom.net> + + * src/ejabberd_router.erl: Added route_packet hook + 2005-07-26 Alexey Shchepin <alexey@sevcom.net> * src/jd2ejd.erl: Updated to work with ODBC diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index 31d35554..95c8f674 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -80,45 +80,52 @@ loop() -> loop() end. -do_route(From, To, Packet) -> - ?DEBUG("route~n\tfrom ~p~n\tto ~p~n\tpacket ~p~n", [From, To, Packet]), - LDstDomain = To#jid.lserver, - case mnesia:dirty_read(route, LDstDomain) of - [] -> - ejabberd_s2s:route(From, To, Packet); - [R] -> - Pid = R#route.pid, - if - node(Pid) == node() -> - case R#route.local_hint of - {apply, Module, Function} -> - Module:Function(From, To, Packet); - _ -> - Pid ! {route, From, To, Packet} - end; - true -> - Pid ! {route, From, To, Packet} - end; - Rs -> - case [R || R <- Rs, node(R#route.pid) == node()] of +do_route(OrigFrom, OrigTo, OrigPacket) -> + ?DEBUG("route~n\tfrom ~p~n\tto ~p~n\tpacket ~p~n", + [OrigFrom, OrigTo, OrigPacket]), + LOrigDstDomain = OrigTo#jid.lserver, + case ejabberd_hooks:run_fold( + route_packet, LOrigDstDomain, {OrigFrom, OrigTo, OrigPacket}, []) of + {From, To, Packet} -> + LDstDomain = To#jid.lserver, + case mnesia:dirty_read(route, LDstDomain) of [] -> - R = lists:nth(erlang:phash(now(), length(Rs)), Rs), - Pid = R#route.pid, - Pid ! {route, From, To, Packet}; - LRs -> - LRs, - R = lists:nth(erlang:phash(now(), length(LRs)), LRs), + ejabberd_s2s:route(From, To, Packet); + [R] -> Pid = R#route.pid, - case R#route.local_hint of - {apply, Module, Function} -> - Module:Function(From, To, Packet); - _ -> + if + node(Pid) == node() -> + case R#route.local_hint of + {apply, Module, Function} -> + Module:Function(From, To, Packet); + _ -> + Pid ! {route, From, To, Packet} + end; + true -> Pid ! {route, From, To, Packet} + end; + Rs -> + case [R || R <- Rs, node(R#route.pid) == node()] of + [] -> + R = lists:nth(erlang:phash(now(), length(Rs)), Rs), + Pid = R#route.pid, + Pid ! {route, From, To, Packet}; + LRs -> + LRs, + R = lists:nth(erlang:phash(now(), length(LRs)), LRs), + Pid = R#route.pid, + case R#route.local_hint of + {apply, Module, Function} -> + Module:Function(From, To, Packet); + _ -> + Pid ! {route, From, To, Packet} + end end - end + end; + drop -> + ok end. - %route(From, To, Packet) -> % ejabberd_router ! {route, From, To, Packet}. |