diff options
Diffstat (limited to 'lib/kernel/src/gen_udp.erl')
-rw-r--r-- | lib/kernel/src/gen_udp.erl | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/lib/kernel/src/gen_udp.erl b/lib/kernel/src/gen_udp.erl new file mode 100644 index 0000000000..6bded4bda6 --- /dev/null +++ b/lib/kernel/src/gen_udp.erl @@ -0,0 +1,117 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(gen_udp). + +-export([open/1, open/2, close/1]). +-export([send/2, send/4, recv/2, recv/3, connect/3]). +-export([controlling_process/2]). +-export([fdopen/2]). + +-include("inet_int.hrl"). + +open(Port) -> + open(Port, []). + +open(Port, Opts) -> + Mod = mod(Opts), + {ok,UP} = Mod:getserv(Port), + Mod:open(UP, Opts). + +close(S) -> + inet:udp_close(S). + +send(S, Address, Port, Packet) when is_port(S) -> + case inet_db:lookup_socket(S) of + {ok, Mod} -> + case Mod:getaddr(Address) of + {ok,IP} -> + case Mod:getserv(Port) of + {ok,UP} -> Mod:send(S, IP, UP, Packet); + {error,einval} -> exit(badarg); + Error -> Error + end; + {error,einval} -> exit(badarg); + Error -> Error + end; + Error -> + Error + end. + +send(S, Packet) when is_port(S) -> + case inet_db:lookup_socket(S) of + {ok, Mod} -> + Mod:send(S, Packet); + Error -> + Error + end. + +recv(S,Len) when is_port(S), is_integer(Len) -> + case inet_db:lookup_socket(S) of + {ok, Mod} -> + Mod:recv(S, Len); + Error -> + Error + end. + +recv(S,Len,Time) when is_port(S) -> + case inet_db:lookup_socket(S) of + {ok, Mod} -> + Mod:recv(S, Len,Time); + Error -> + Error + end. + +connect(S, Address, Port) when is_port(S) -> + case inet_db:lookup_socket(S) of + {ok, Mod} -> + case Mod:getaddr(Address) of + {ok, IP} -> + Mod:connect(S, IP, Port); + Error -> + Error + end; + Error -> + Error + end. + +controlling_process(S, NewOwner) -> + inet:udp_controlling_process(S, NewOwner). + +%% +%% Create a port/socket from a file descriptor +%% +fdopen(Fd, Opts) -> + Mod = mod(), + Mod:fdopen(Fd, Opts). + + +%% Get the udp_module +mod() -> inet_db:udp_module(). + +%% Get the udp_module, but option udp_module|inet|inet6 overrides +mod([{udp_module,Mod}|_]) -> + Mod; +mod([inet|_]) -> + inet_udp; +mod([inet6|_]) -> + inet6_udp; +mod([_|Opts]) -> + mod(Opts); +mod([]) -> + mod(). |