summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEssien Ita Essien <essiene@gmail.com>2008-12-16 22:27:43 +0100
committerEssien Ita Essien <essiene@gmail.com>2008-12-16 22:27:43 +0100
commit3653237636f491b3ea37e95c132d4d4dda9517e9 (patch)
tree82ce4d4da1a71db4d7f796cd01c1596cefa46975 /src
parentd3ebf493d8f0fb7e204cf3cd225ec668b1d96b9e (diff)
downloadrabbitmq-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.erl80
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).