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 | 3653237636f491b3ea37e95c132d4d4dda9517e9 (patch) | |
| tree | 82ce4d4da1a71db4d7f796cd01c1596cefa46975 /src | |
| parent | d3ebf493d8f0fb7e204cf3cd225ec668b1d96b9e (diff) | |
| download | rabbitmq-server-git-3653237636f491b3ea37e95c132d4d4dda9517e9.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
Diffstat (limited to 'src')
| -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 0000000000..979ac718c9 --- /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). |
