diff options
author | Alexey Shchepin <alexey@process-one.net> | 2005-07-27 00:54:53 +0000 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2005-07-27 00:54:53 +0000 |
commit | e9e1893b01c28ccad14fa3dbb392eeed8ed9c817 (patch) | |
tree | e2704705442ceb3f9a0d7904f4ae10face0e32e7 | |
parent | * src/jd2ejd.erl: Updated to work with ODBC (diff) |
* src/ejabberd_router.erl: Added route_packet hook
SVN Revision: 380
-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}. |