summaryrefslogtreecommitdiff
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
commit3686e9c2ecc05f9326efd06f65fa9f59ccc6f32e (patch)
tree82ce4d4da1a71db4d7f796cd01c1596cefa46975
parentc6619487ad70ea6f83ff68f9e35891700ecb6c48 (diff)
downloadrabbitmq-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.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 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).