2121-export ([start /0 ]).
2222
2323% % Core API
24- -export ([ open /4
25- , open_udp /4
26- , open_dtls /4
24+ -export ([ open /3
25+ , open_udp /3
26+ , open_dtls /3
2727 , close /2
2828 , close /1
29+ % % Legacy API
30+ , open /4
31+ , open_udp /4
32+ , open_dtls /4
2933 ]).
3034
3135-export ([ reopen /1
3236 , reopen /2
3337 ]).
3438
35- -export ([ child_spec /4
39+ -export ([ child_spec /3
40+ , udp_child_spec /3
41+ , dtls_child_spec /3
42+ % % Legacy API
43+ , child_spec /4
3644 , udp_child_spec /4
3745 , dtls_child_spec /4
3846 ]).
6775-export ([ merge_opts /2
6876 , changed_opts /2
6977 , parse_opt /1
78+ , start_mfargs /3
7079 , ulimit /0
7180 , fixaddr /1
7281 , to_string /1
95104-type (option () :: {acceptors , pos_integer ()}
96105 | {max_connections , pos_integer ()}
97106 | {max_conn_rate , conn_limit ()}
107+ | {connection_mfargs , mfargs ()}
98108 | {access_rules , [esockd_access :rule ()]}
99109 | {shutdown , brutal_kill | infinity | pos_integer ()}
100110 | tune_buffer | {tune_buffer , boolean ()}
@@ -126,35 +136,51 @@ start() ->
126136% % Open & Close
127137
128138% % @doc Open a TCP or SSL listener
129- -spec ( open (atom (), listen_on (), [ option ()], mfargs ()) -> {ok , pid ()} | {error , term ()}) .
130- open (Proto , Port , Opts , MFA ) when is_atom (Proto ), is_integer (Port ) ->
131- esockd_sup :start_listener ( Proto , Port , Opts , MFA );
132- open (Proto , {Host , Port }, Opts , MFA ) when is_atom (Proto ), is_integer (Port ) ->
139+ -spec open (atom (), listen_on (), options ()) -> {ok , pid ()} | {error , term ()}.
140+ open (Proto , Port , Opts ) when is_atom (Proto ), is_integer (Port ) ->
141+ esockd_sup :start_child ( child_spec ( Proto , Port , Opts ) );
142+ open (Proto , {Host , Port }, Opts ) when is_atom (Proto ), is_integer (Port ) ->
133143 {IPAddr , _Port } = fixaddr ({Host , Port }),
134144 case proplists :get_value (ip , tcp_options (Opts )) of
135145 undefined -> ok ;
136146 IPAddr -> ok ;
137147 Other -> error ({badmatch , Other })
138148 end ,
139- esockd_sup :start_listener ( Proto , {IPAddr , Port }, Opts , MFA ).
149+ esockd_sup :start_child ( child_spec ( Proto , {IPAddr , Port }, Opts ) ).
140150
141151% % @private
142152tcp_options (Opts ) ->
143153 proplists :get_value (tcp_options , Opts , []).
144154
155+ % % @doc Open a TCP or SSL listener
156+ -spec open (atom (), listen_on (), [option ()], mfargs ()) -> {ok , pid ()} | {error , term ()}.
157+ open (Proto , Port , Opts , MFA ) ->
158+ open (Proto , Port , merge_mfargs (Opts , MFA )).
159+
145160% % @doc Open a UDP listener
146- -spec (open_udp (atom (), listen_on (), [option ()], mfargs ())
147- -> {ok , pid ()}
148- | {error , term ()}).
161+ -spec open_udp (atom (), listen_on (), [option ()])
162+ -> {ok , pid ()} | {error , term ()}.
163+ open_udp (Proto , Port , Opts ) ->
164+ esockd_sup :start_child (udp_child_spec (Proto , Port , Opts )).
165+
166+ % % @doc Open a UDP listener
167+ -spec open_udp (atom (), listen_on (), [option ()], mfargs ())
168+ -> {ok , pid ()} | {error , term ()}.
149169open_udp (Proto , Port , Opts , MFA ) ->
150- esockd_sup :start_child (udp_child_spec (Proto , Port , Opts , MFA )).
170+ open_udp (Proto , Port , merge_mfargs (Opts , MFA )).
171+
172+ % % @doc Open a DTLS listener
173+ -spec open_dtls (atom (), listen_on (), options ())
174+ -> {ok , pid ()} | {error , term ()}.
175+ open_dtls (Proto , ListenOn , Opts ) ->
176+ esockd_sup :start_child (dtls_child_spec (Proto , ListenOn , Opts )).
151177
152178% % @doc Open a DTLS listener
153179-spec (open_dtls (atom (), listen_on (), options (), mfargs ())
154180 -> {ok , pid ()}
155181 | {error , term ()}).
156182open_dtls (Proto , ListenOn , Opts , MFA ) ->
157- esockd_sup : start_child ( dtls_child_spec ( Proto , ListenOn , Opts , MFA )).
183+ open_dtls ( Proto , ListenOn , merge_mfargs ( Opts , MFA )).
158184
159185% % @doc Close the listener
160186-spec (close ({atom (), listen_on ()}) -> ok | {error , term ()}).
@@ -179,22 +205,42 @@ reopen(Proto, ListenOn) when is_atom(Proto) ->
179205
180206% % @doc Create a Child spec for a TCP/SSL Listener. It is a convenient method
181207% % for creating a Child spec to hang on another Application supervisor.
182- -spec (child_spec (atom (), listen_on (), [option ()], mfargs ())
183- -> supervisor :child_spec ()).
208+ -spec child_spec (atom (), listen_on (), options ())
209+ -> supervisor :child_spec ().
210+ child_spec (Proto , ListenOn , Opts ) when is_atom (Proto ) ->
211+ esockd_sup :child_spec (Proto , fixaddr (ListenOn ), Opts ).
212+
213+ -spec child_spec (atom (), listen_on (), options (), mfargs ())
214+ -> supervisor :child_spec ().
184215child_spec (Proto , ListenOn , Opts , MFA ) when is_atom (Proto ) ->
185- esockd_sup :child_spec (Proto , fixaddr (ListenOn ), Opts , MFA ).
216+ child_spec (Proto , ListenOn , merge_mfargs (Opts , MFA )).
217+
218+ % % @doc Create a Child spec for a UDP Listener.
219+ -spec udp_child_spec (atom (), listen_on (), options ())
220+ -> supervisor :child_spec ().
221+ udp_child_spec (Proto , Port , Opts ) ->
222+ esockd_sup :udp_child_spec (Proto , fixaddr (Port ), Opts ).
186223
187224% % @doc Create a Child spec for a UDP Listener.
188- -spec ( udp_child_spec (atom (), listen_on (), options (), mfargs ())
189- -> supervisor :child_spec ()) .
225+ -spec udp_child_spec (atom (), listen_on (), options (), mfargs ())
226+ -> supervisor :child_spec ().
190227udp_child_spec (Proto , Port , Opts , MFA ) ->
191- esockd_sup : udp_child_spec (Proto , fixaddr ( Port ), Opts , MFA ).
228+ udp_child_spec (Proto , Port , merge_mfargs ( Opts , MFA ) ).
192229
193230% % @doc Create a Child spec for a DTLS Listener.
194- -spec (dtls_child_spec (atom (), listen_on (), options (), mfargs ())
195- -> supervisor :child_spec ()).
231+ -spec dtls_child_spec (atom (), listen_on (), options ())
232+ -> supervisor :child_spec ().
233+ dtls_child_spec (Proto , ListenOn , Opts ) ->
234+ esockd_sup :dtls_child_spec (Proto , fixaddr (ListenOn ), Opts ).
235+
236+ % % @doc Create a Child spec for a DTLS Listener.
237+ -spec dtls_child_spec (atom (), listen_on (), options (), mfargs ())
238+ -> supervisor :child_spec ().
196239dtls_child_spec (Proto , ListenOn , Opts , MFA ) ->
197- esockd_sup :dtls_child_spec (Proto , fixaddr (ListenOn ), Opts , MFA ).
240+ dtls_child_spec (Proto , ListenOn , merge_mfargs (Opts , MFA )).
241+
242+ merge_mfargs (Opts , MFA ) ->
243+ [{connection_mfargs , MFA } | proplists :delete (connection_mfargs , Opts )].
198244
199245% %--------------------------------------------------------------------
200246% % Get/Set APIs
@@ -279,6 +325,14 @@ deny({Proto, ListenOn}, CIDR) when is_atom(Proto) ->
279325% %--------------------------------------------------------------------
280326% % Utils
281327
328+ -spec start_mfargs (mfargs (), _Arg1 , _Arg2 ) -> _Ret .
329+ start_mfargs (M , A1 , A2 ) when is_atom (M ) ->
330+ M :start_link (A1 , A2 );
331+ start_mfargs ({M , F }, A1 , A2 ) when is_atom (M ), is_atom (F ) ->
332+ M :F (A1 , A2 );
333+ start_mfargs ({M , F , Args }, A1 , A2 ) when is_atom (M ), is_atom (F ), is_list (Args ) ->
334+ erlang :apply (M , F , [A1 , A2 | Args ]).
335+
282336% % @doc Merge two options
283337-spec (merge_opts (proplists :proplist (), proplists :proplist ())
284338 -> proplists :proplist ()).
0 commit comments