ssl_prim.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 185 行

ERL
185
字号
%% ``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 via the world wide web 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.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%%% Purpose: Primitive interface to SSL, without broker process (used by %% SSL distribution).-module(ssl_prim).-export([listen/2, connect/3, accept/1, close/1, send/2, recv/2, recv/3,	 getll/1, getstat/2, setopts/2, controlling_process/2, peername/1,	 sockname/1, getif/1]).-include("ssl_int.hrl").-include("ssl_broker_int.hrl").-define(filter(Call), filter((catch Call))).listen(Port, Opts) ->    St = newstate(listener),    ?filter(ssl_broker:listen_prim(ssl_server_prim, self(), Port, nonactive(Opts), St)).connect(Address, Port, Opts) ->    St = newstate(connector),    ?filter(ssl_broker:connect_prim(ssl_server_prim, inet_tcp, self(), Address, 				    Port, nonactive(Opts), infinity, St)).accept(ListenSt0) when record(ListenSt0, st) ->    case transport_accept(ListenSt0) of	{ok, ListenSt1} ->	    ssl_accept(ListenSt1);	Error ->	    Error    end.transport_accept(ListenSt) when record(ListenSt, st) ->    NewSt = newstate(acceptor),    ListenSocket=ListenSt#st.thissock,    ListenFd = ListenSocket#sslsocket.fd,    ListenOpts = ListenSt#st.opts,    ?filter(ssl_broker:transport_accept_prim(	      ssl_server_prim, ListenFd,	      ListenOpts, infinity, NewSt)).ssl_accept(ListenSt) when record(ListenSt, st) ->    NewSt = newstate(acceptor),    ListenSocket=ListenSt#st.thissock,    ListenFd = ListenSocket#sslsocket.fd,    ?filter(ssl_broker:ssl_accept_prim(	      ssl_server_prim, gen_tcp, self(), ListenFd, infinity, NewSt)).close(_St = #st{fd = Fd}) when integer(Fd) ->    ssl_server:close_prim(ssl_server_prim, Fd),    ok;close(_) ->    ok.send(St, Data) when record(St, st), St#st.status =:= open ->    case inet_tcp:send(St#st.proxysock, Data) of	ok ->	    ok;	{error, _} ->	    {error, closed}    end;send(St, _Data) when record(St, st) ->    {error, closed}.recv(St,Length) ->    recv(St,Length,infinity).recv(St, Length, Tmo) when record(St, st), St#st.status =:= open ->    inet_tcp:recv(St#st.proxysock, Length, Tmo);recv(St, _Length, _Tmo) when record(St, st) ->    {error, closed}.getll(St) when record(St, st), St#st.status =:= open  ->    inet:getll(St#st.proxysock);getll(St) when record(St, st) ->    {error, closed}.getstat(St, Opts) when record(St, st), St#st.status =:= open  ->    inet:getstat(St#st.proxysock, Opts);getstat(St, _Opts) when record(St, st) ->    {error, closed}.setopts(St, Opts) when record(St, st), St#st.status =:= open  ->    case remove_supported(Opts) of	[] ->	    inet:setopts(St#st.proxysock, Opts);	_ ->	    {error, enotsup}    end;setopts(St, _Opts) when record(St, st) ->    {error, closed}.controlling_process(St, Pid) when record(St, st), St#st.status =:= open, pid(Pid) ->    inet_tcp:controlling_process(St#st.proxysock, Pid);controlling_process(St, Pid) when record(St, st),  pid(Pid) ->    {error, closed}.peername(St) when record(St, st), St#st.status =:= open  ->    case ssl_server:peername_prim(ssl_server_prim, St#st.fd) of	{ok, {Address, Port}} ->	    {ok, At} = inet_parse:ipv4_address(Address),	    {ok, {At, Port}};	Error ->	    Error    end;peername(St) when record(St, st) ->    {error, closed}.sockname(St) when record(St, st), St#st.status =:= open  ->    case ssl_server:sockname_prim(ssl_server_prim, St#st.fd) of	{ok, {Address, Port}} ->	    {ok, At} = inet_parse:ipv4_address(Address),	    {ok, {At, Port}};	Error ->	    Error    end;sockname(St) when record(St, st) ->    {error, closed}.getif(St) when record(St, st), St#st.status =:= open  ->    inet:getif(St#st.proxysock);getif(St) when record(St, st) ->    {error, closed}.remove_supported([{active, _}|T]) ->    remove_supported(T);remove_supported([{packet,_}|T]) ->    remove_supported(T);remove_supported([{deliver,_}|T]) ->    remove_supported(T);remove_supported([H|T]) ->    [H | remove_supported(T)];remove_supported([]) ->    [].filter(Result) ->    case Result of	{ok, _Sock,St} ->	    {ok, St};	{error, Reason, _St} ->	    {error,Reason};	Else  ->	    {error, Else}    end.nonactive([{active,_}|T]) ->    nonactive(T);nonactive([H|T]) ->    [H | nonactive(T)];nonactive([]) ->    [{active, false}].newstate(Type) ->   #st{brokertype = Type, server = whereis(ssl_server_prim),       client = undefined, collector = undefiend, debug = false}. 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?