diff options
author | Essien Ita Essien <essiene@gmail.com> | 2008-12-16 22:27:43 +0100 |
---|---|---|
committer | Essien Ita Essien <essiene@gmail.com> | 2008-12-16 22:27:43 +0100 |
commit | 3686e9c2ecc05f9326efd06f65fa9f59ccc6f32e (patch) | |
tree | 82ce4d4da1a71db4d7f796cd01c1596cefa46975 | |
parent | c6619487ad70ea6f83ff68f9e35891700ecb6c48 (diff) | |
download | rabbitmq-server-3686e9c2ecc05f9326efd06f65fa9f59ccc6f32e.tar.gz |
Add first draft implementation of the rabbit_net.erl module layer
This layer allows us to abstract the network calls to be made on
the different data transports... TCP and SSL sockets.
The next few commits are going to update native calls to now use this
layer
-rw-r--r-- | src/rabbit_net.erl | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/rabbit_net.erl b/src/rabbit_net.erl new file mode 100644 index 00000000..979ac718 --- /dev/null +++ b/src/rabbit_net.erl @@ -0,0 +1,80 @@ +-module(rabbit_net). +-export([ + async_recv/3, + close/1, + controlling_process/2, + getstat/2, + peername/1, + port_command/2, + send/2, + sockname/1 + ]). + +-include("rabbit.hrl"). + + +async_recv(Sock, Length, Timeout) when is_record(Sock, rabbit_ssl_socket) -> + Pid = self(), + Ref = make_ref(), + + Fun = fun() -> + case ssl:recv(Sock#rabbit_ssl_socket.ssl, Length, Timeout) of + {ok, Data} -> + Pid ! {inet_async, Sock, Ref, {ok, Data}}; + {error, Reason} -> + Pid ! {inet_async, Sock, Ref, {error, Reason}} + end + end, + + spawn(Fun), + {ok, Ref}; + +async_recv(Sock, Length, Timeout) when is_port(Sock) -> + prim_inet:async_recv(Sock, Length, Timeout). + +close(Sock) when is_record(Sock, rabbit_ssl_socket) -> + ssl:close(Sock#rabbit_ssl_socket.ssl); + +close(Sock) when is_port(Sock) -> + gen_tcp:close(Sock). + + +controlling_process(Sock, Pid) when is_record(Sock, rabbit_ssl_socket) -> + ssl:controlling_process(Sock#rabbit_ssl_socket.ssl, Pid); + +controlling_process(Sock, Pid) when is_port(Sock) -> + gen_tcp:controlling_process(Sock, Pid). + + +getstat(Sock, Stats) when is_record(Sock, rabbit_ssl_socket) -> + inet:getstat(Sock#rabbit_ssl_socket.tcp, Stats); + +getstat(Sock, Stats) when is_port(Sock) -> + inet:getstat(Sock, Stats). + + +peername(Sock) when is_record(Sock, rabbit_ssl_socket) -> + ssl:peername(Sock#rabbit_ssl_socket.ssl); + +peername(Sock) when is_port(Sock) -> + inet:peername(Sock). + + +port_command(Sock, Data) when is_record(Sock, rabbit_ssl_socket) -> + ssl:send(Sock#rabbit_ssl_socket.ssl, Data); + +port_command(Sock, Data) when is_port(Sock) -> + erlang:port_command(Sock, Data). + +send(Sock, Data) when is_record(Sock, rabbit_ssl_socket) -> + ssl:send(Sock#rabbit_ssl_socket.ssl, Data); + +send(Sock, Data) when is_port(Sock) -> + gen_tcp:send(Sock, Data). + + +sockname(Sock) when is_record(Sock, rabbit_ssl_socket) -> + ssl:sockname(Sock#rabbit_ssl_socket.ssl); + +sockname(Sock) when is_port(Sock) -> + inet:sockname(Sock). |