@@ -43,32 +43,46 @@ listen(Name) ->
4343-spec listen (string (), non_neg_integer ()) ->
4444 {ok , {any (), # net_address {}, pos_integer ()}} | {error , any ()}.
4545listen (Name , SocketPort ) ->
46- {ok , LSock } = socket :open (inet , stream , tcp ),
47- case
48- socket :bind (LSock , #{
49- family => inet ,
50- port => SocketPort ,
51- addr => {0 , 0 , 0 , 0 }
52- })
53- of
54- ok ->
55- ok = socket :listen (LSock ),
56- {ok , #{addr := Addr , port := Port }} = socket :sockname (LSock ),
46+ case socket :open (inet , stream , tcp ) of
47+ {ok , LSock } ->
48+ try do_listen (Name , LSock , SocketPort ) of
49+ {ok , _ } = Ok -> Ok ;
50+ Error -> socket :close (LSock ), Error
51+ catch
52+ Class :Reason :Stack ->
53+ socket :close (LSock ),
54+ erlang :raise (Class , Reason , Stack )
55+ end ;
56+ {error , _ } = Error ->
57+ Error
58+ end .
59+
60+ do_listen (Name , LSock , SocketPort ) ->
61+ case socket :bind (LSock , #{family => inet , port => SocketPort , addr => {0 , 0 , 0 , 0 }}) of
62+ ok -> do_listen_bound (Name , LSock );
63+ {error , _ } = Error -> Error
64+ end .
65+
66+ do_listen_bound (Name , LSock ) ->
67+ case socket :listen (LSock ) of
68+ ok -> do_listen_listening (Name , LSock );
69+ {error , _ } = Error -> Error
70+ end .
71+
72+ do_listen_listening (Name , LSock ) ->
73+ case socket :sockname (LSock ) of
74+ {ok , #{addr := Addr , port := Port }} ->
5775 ErlEpmd = net_kernel :epmd_module (),
5876 Address = # net_address {
5977 host = Addr ,
6078 protocol = tcp ,
6179 family = inet
6280 },
6381 case ErlEpmd :register_node (Name , Port ) of
64- {ok , Creation } ->
65- {ok , {LSock , Address , Creation }};
66- Error ->
67- socket :close (LSock ),
68- Error
82+ {ok , Creation } -> {ok , {LSock , Address , Creation }};
83+ {error , _ } = Error -> Error
6984 end ;
7085 {error , _ } = Error ->
71- socket :close (LSock ),
7286 Error
7387 end .
7488
@@ -153,28 +167,36 @@ do_setup(Kernel, Node, Type, MyNode, _LongNames, SetupTime) ->
153167 case ErlEpmd :port_please (Name , Ip ) of
154168 {port , TcpPort , Version } ->
155169 dist_util :reset_timer (Timer ),
156- {ok , Sock } = socket :open (inet , stream , tcp ),
157- case
158- socket :connect (Sock , #{family => inet , addr => Ip , port => TcpPort })
159- of
160- ok ->
161- {ok , DistController } = socket_dist_controller :start (Sock ),
162- true = socket_dist_controller :supervisor (
163- DistController , self ()
164- ),
165- HSData = hs_data (
166- Kernel ,
167- MyNode ,
168- DistController ,
169- [],
170- Node ,
171- Version ,
172- Type ,
173- Timer
174- ),
175- dist_util :handshake_we_started (HSData );
176- Other1 ->
177- ? shutdown2 (Node , {unexpected , Other1 })
170+ case socket :open (inet , stream , tcp ) of
171+ {ok , Sock } ->
172+ case
173+ socket :connect (Sock , #{
174+ family => inet , addr => Ip , port => TcpPort
175+ })
176+ of
177+ ok ->
178+ {ok , DistController } =
179+ socket_dist_controller :start (Sock ),
180+ true = socket_dist_controller :supervisor (
181+ DistController , self ()
182+ ),
183+ HSData = hs_data (
184+ Kernel ,
185+ MyNode ,
186+ DistController ,
187+ [],
188+ Node ,
189+ Version ,
190+ Type ,
191+ Timer
192+ ),
193+ dist_util :handshake_we_started (HSData );
194+ ConnectError ->
195+ socket :close (Sock ),
196+ ? shutdown2 (Node , {unexpected , ConnectError })
197+ end ;
198+ OpenError ->
199+ ? shutdown2 (Node , {unexpected , OpenError })
178200 end ;
179201 Other2 ->
180202 ? shutdown2 (Node , {unexpected , Other2 })
0 commit comments